Go в автобусе

6
Go в автобусе Oпыт использования Go во встраиваемых системах Максим Чечель [email protected]

Transcript of Go в автобусе

Go в автобусеOпыт использования Go во встраиваемыхсистемах

Максим Чечель[email protected]

Почему Go?● Небольшой размер исполняемого файла (“Hello world” ~ 1.5 мб)● Простота кросс-компиляции (в т.ч. под ARM)● Статически скомпилированные зависимости● Малый размер потребляемой памяти● Наличие необходимых библиотек для работы с внешним

оборудованием: https://github.com/tarm/serial ● GC, встроенные примитивы для “многопоточного” программирорования,

самодостаточная стандартная библиотека

Размер исполняемого файла● Почему это важно?

○ Ограниченный объём носителя и ОЗУ○ Обновление на медленных соединениях○ Ограничения по трафику, либо очень дорого, либо очень медленно.

● Сжатие исполняемого файла с помощьюupx --best -o program-compressed program

Было 9.4Мб стало 3.4Мб, коэффициент сжатия примерно один и тот же для исполняемых файлов go любого размера.

http://upx.sourceforge.net/

Обновление ПО бортовых терминалов● Привычные сценарии не работают

○ Лишь часть автобусов в онлайне○ Могут отсутствовать выделенные IP адреса○ Проблемы со связью из-за которых приходится повторять процедуру обновления

● Выход - самообновление○ Простое скачивание сжатого исполняемого файла○ Обновление через bsdiff-патчи https://github.com/inconshreveable/go-update○ Откуда ваша программа узнает собственную версию?

■ go build -ldflags "-X main.my_version 1.0.5" program.go■ go run -ldflags "-X main.my_version 1.0.5" program.go

○ Работа с версиями: https://github.com/hashicorp/go-version

Обновление через bsdiff-патчи● Определяем собственную версию● Получив от сервера информацию об актуальной версии запрашиваем

соотв. патч: https://someserv.er/armv5/1.0.5/1.0.8.bsdiff (если необходимо)● Генерировать патчи можно как при сборке новой версии так и скриптом

на сервере, потому что в “полях” может быть огромный зоопарк версий и генерировать патчи для всех возможных пар версий может быть утомительно

● Размер патча между двумя исполняемыми файлами написанными на Go ~45-200Кб при относительно небольших изменениях (до нескольких десятков строк исходного кода). Время генерации патча ~10c (в моём случае)

Спасибо!