Всем привет, есть такая проблема, MySQL в докере медленнее чем на железе, сперва грешил на сеть, думал что приложение из контейнера с задержками общается с другим контейнером или с хостом, но дело было в том, что на хосте стояла версия 8.0, на ней просадка на 5.7 быстрее, а на MariaDB еще быстрее.
По крайней мере когда нагрухка не хайлоад - 8.0 или равен или отстает от 5.7. Но сейчас не о том.
Поставил сперва на железо php и mariadb, около 2.9сек время выполнения 260 запросов + неких обработок небольших...
Поставил PHP в докер, оставил mariadb на хосте, PHP на докер, ну около 3.0-3.1 сек, вполне допустимый оверхед.
Но когда в докере запускаю MariaDB, то скорость падает, время около 3.9-4 сек.
Что интересно, вчера я в PHP контейнере контейнере сделал docker exec -it sh... Поставил MariaDB той же версии, запустил, и тоже самое что и в соседнем контейнере.
Я пробовал как и стандартными volume и пробрасывать в контейнер локальную папку -v, ничего не меняется, тут либо какая-то разница когда в докере mysqld стартуется, а на хосте служба системная или какие-то настройки не цепляются или под alpine и ubuntu сборки не самые лучшие. Почитал в интернете, некоторые тоже пишут что в докере пиковые скорости бд просаживаются.
Лентюй, разница оказалась на деле не столь большой 3.3 на хосте и 3.8 сек в докере...
Изначально замедление было из-за машины на которой виртуалки стартую, давно не перезагружался.
Такое ощущение что дело тут в mysql 8.0, 5.7 быстрее был, сейчас буду сравнивать дефолтные настройки.
Рядом виртуалка с тем же сайтом, с такой же базой, только версия 5.7 и там 2.7 сек ...
Здесь нужно провести более подробные тестирования.
В данном случае нужно посмотреть как ты подключаешься к mysql.
Ведь если мы поставим на хост mysql-server и будем подключаться через localhost (мы потеряем часть времени на поиск ip адреса), если мы укажем 127.0.0.1 то работа будет быстрее.
Тоже самое с docker. При указании mysql в качестве адреса подключения, он будет искать его ip адрес (можно попробовать указать его вручную при подключении).
---
По моим предположениям данное увеличенное время = поиск ip адреса mysql сервера.
В моем случае - если в обработке много селектов и каждый из них большой объем выхлапывает, то добавляются сетевые издержки, задержка появляется если. Подключение к БД
1. Вытащить php-приложение, а БД на хосте
2. Вытащить бд, а PHP на хосте.
Т.е. у меня одно решение - в один контейнер запаковать приложение и базу чтобы между ними не маршрутизировался обмен данными через всякие 172.0.0.* через какие-то там цепочки iptables...
Я просто тестирую свое приложение на выгрузке БД на маркет + некоторые смежные операции типа применение по дереву вниз настроек и характеристик, там все товары, все категории, все картинки, каждая характеристика, все описания к товарам, в общем целиком всё что есть в базе - выгружается, много запросов с кучей данных...
И с 2.5 сек сейчас у меня до 3.6 сек возрастает время выполнения. А время на соединение это вообще фигня, в начале только подключается и не закрывает в процессе, я отслеживаю каждый отдельный этап и именно на этих этапах время растет, а не где-то там в начале....
Да, это все не критично совсем, но я прорабатываю вариант создания контейнера оптимального для своего приложения, и вообще больше ради изучения докера.
Нашел испытания от перконы, реально есть такое как оверхед сетевой, даже если все на одном компе... Мои тесты конечно накладывают еще производительность вычислений, и вероятно у меня с базой не столь много работает сколько обработки, генерация всяких xml... Если бы я только с базой работал, то скорей всего получил аж трехкратное замедление... https://www.percona.com/blog/2016/02/05/measuring-...