@MrKMV34
Превозмогая трудности

При смене версий PHP вырастает нагрузка на диск, что делать?

Есть сервер - дедик, 2 процессора по 6 ядер в гипертрейдинг, 48gb ram, под БД жесткий диск SSD,
под програмный код HDD
ОС - Ubuntu server 16.04
Есть БД - MariaDB 10.2.19

Есть приложение на php7.1, в нём одни функции лапшекодом.
Это приложение держит нагрузку(по мониторингу) ~300 rps до backend'a, на
БД нагрузка ~400prs select, ~270rps insert, ~160rps update, ~1 delete, пишется много статистики
и пишется не самым оптимальным способом - insert .. on duplicate key update ...
Но сервер живет, load average ~3 и всё работает
5c11e672778cd982095520.png

Есть 2ая версия этого приложения на php7.2, на yii 2 написана. Включен production режим. В ней запись статистики
перенесена в очереди которые крутятся на rabbitmq, воркеры тоже на yii 2 сделаны, данные статистики
агрегируются в redis'e и раз в 20 минут закидываются в MariaDB. На
БД нагрузка меньше ~300prs select, ~130rps insert, ~80rps update, ~1 delete.
Но несмотря на меньшую нагрузку, MariaDB начинает очень активно использовать диск.
Не только в моменты, когда с Redis'a данные переносятся в MariaDB, а постоянно. Настолько сильно
пишет, что вырастает latency и всё виснет и сервер не успевает давать ответы.
5c11e68210484859634075.png

Что меняли в конфиге:
[mysqld]
skip-name-resolve
max_connections = 1000
connect_timeout = 5
wait_timeout = 600
max_allowed_packet = 32M
sort_buffer_size = 128M
bulk_insert_buffer_size = 1G
tmp_table_size = 2G
max_heap_table_size = 2G
key_buffer_size = 256M

query_cache_limit = 1M
query_cache_size = 128M

innodb_log_buffer_size = 128M
innodb_log_file_size = 1G
innodb_buffer_pool_size = 20G
innodb_buffer_pool_instances = 10

innodb_io_capacity = 800

innodb_write_io_threads = 16
innodb_read_io_threads = 16

Нужна помощь! Куда копать? Что смотреть? Какие варианты снизить нагрузка на диск есть?
Может что-то не так с фреймворком?
  • Вопрос задан
  • 1611 просмотров
Пригласить эксперта
Ответы на вопрос 3
kotomyava
@kotomyava
Системный администратор
Проанализируйте, что же именно делает в это время mysql, хотя бы запустив mytop, и посмотрев explain частых и долгих запросов.
У вас может просто отсутствовать какой-нибудь нужный индекс в таблице, или неудачно какой-то запрос составлен, и используется активно full scan или file sort.
Ответ написан
vman
@vman
включить кеширование схемы в Yii2, иначе Yii2 делает много доп. запросов

'db' => [
.....
    'enableSchemaCache' => true,
    'schemaCacheDuration' => 3600,
    'schemaCache' => 'cache',
]


по тюнингу БД

1) уменьшить query_cache_size до 64M (были проблемы при большом кеше)

прочитать про эти два параметра и выбрать режимы

innodb_flush_method                  = O_DSYNC
innodb_flush_log_at_trx_commit = 0
Ответ написан
inside22
@inside22
MrKMV34

Для ~300 rps много ресурсов расходуется.

Попробуйте поставить на сервер Blackfire.io или XHProf.

Думаю узнаете много интересного о причине нагрузки высокой.

"БД нагрузка ~400prs select" - это вообще не о чем, если только конечно это не супер тяжелые запросы с INNER JOIN на 10 таблиц.

После этого есть смысл запустить https://github.com/major/MySQLTuner-perl и посмотреть рекомендации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы