Вступление
В отличие от PHP, не существует «классического» способа развертывания вашего приложения Go. В 2022 году Docker/Kubernetes станет золотым стандартом для развертывания веб-приложений. Кроме того, некоторые разработчики предпочитают создавать и развертывать приложения Go на «голом железе» (например, с помощью Supervisor). Давайте выясним, существует ли большая разница между производительностью приложения, работающего на «голом железе», и того же приложения, которое работает как контейнер Docker.
Написание тестов
Я думаю, что лучший способ смоделировать активность приложения — это выполнить что-то, что использует память, процессор и файловую систему. Я решил написать код, который: читает большой файл (около 1 ГБ) JSON со сложной структурой и декодирует этот JSON. У нас есть следующая структура :
И код, который будет декодировать файл:
Давайте запустим код!
Я буду использовать go 1.18.1
Прежде всего, я соберу основную версию. На следующем шаге я докеризую приложение, добавив Dockerfile и создав образ.
Итак, я знаю о кэшировании файла с помощью json. Чтобы предотвратить кэширование, я буду запускать свое приложение в следующем порядке:
- код без контейнера
- dockerized version
- код без контейнера
- dockerized version
- код без контейнера
- dockerized version
Один запуск приложения потребляет около 2,5 ГБ ОЗУ. Давайте запустим каждую версию приложения 30 раз, чтобы гарантировать правильную интерпретацию результатов.
Результаты
После завершения цикла мы можем увидеть результат 30 прогонов. По оси Y отложено время в секундах, затраченное на синтаксический анализ JSON объемом ~ 1 ГБ. Нестабильные результаты на старте были вызваны параллельной активностью на ноутбуке. После старта я оставил свой ноутбук в покое, чтобы не было фоновой активности.
Разницу вы можете увидеть на графике. Далее я возьму только вторую часть показателей (15–30-я итерация) и посчитаю разницу (в процентах) между производительностью «голого» приложения и докеризированной версии:
Голые цифры :
Вывод:
После расчета средней разницы в производительности я получил результат: докеризированное приложение Go на 25,09% медленнее, чем приложение, работающее на «голом железе». Я думаю, что Docker предоставляет нам универсальный и удобный способ запуска приложений и управления ими. Более того, большинство приложений тратят большую часть времени на ожидание операций БД и операций ввода-вывода. Для этих вещей очень хорошо подходит Docker.
#golang #javascript #programming #python #java #php #coding #backend #developer #code