Я запускаю сайт (Magento) на сервере Ubuntu 14.04.3, работающем на 32xCPU VMWare VPS.
Когда он находится под большой нагрузкой, он обычно получает 20-25 запросов в секунду. В magento есть специальный UPDATE
запрос к таблице mysql, который обычно занимает ~ 1 мс (± 0,2 мс) и выполняется ~ 200-300 раз в минуту (3-5 запросов в секунду). Однако во время этих больших нагрузок с интервалом 1-2 часа выполнение этого конкретного запроса внезапно занимает 5-35 секунд, что также останавливает работу всего веб-сайта (даже запросов без этого запроса).
Я отслеживал использование оперативной памяти и процессора, и нагрузка обычно колеблется в районе 22–28, как до зависания, так и во время. Замораживание кажется почти постоянным. Это может длиться не менее 40 минут, и перезапуск mysql и php-fpm не устраняет его. Использование ОЗУ никогда не превышает 10% от доступной ОЗУ, и своп никогда не используется.
Единственный способ решить эту проблему - это перезагрузить VPS, что заставляет меня поверить в неправильную конфигурацию базовой системы, вызывающую зависание.
Однако интересное замечание: несколько раз проблема решалась сама собой без перезагрузки. Что общего у этих случаев, так это то, что выполнение этого запроса "всего" занимает 2-7 секунд. В это время проблема проходит через 10-15 минут.
Итак, какие-нибудь предложения о том, что вызывает это, и как я могу отследить настоящую основную проблему?
Обновление 1: Системная нагрузка (1-минутная нагрузка для 32 ядер ЦП) обычно достигает пика 27–28, но может возрасти до 40 при экстремальной нагрузке. Когда происходит это замораживание, нагрузка обычно составляет 22-27 до и во время замораживания. Большинство, если не все доступные ядра ЦП (32) имеют некоторое время простоя во время зависания.
Обновление 2: Я внес следующие изменения в my.cnf:
innodb_buffer_pool_size = 10G (Innodb data is 5.5G)
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
max_connections = 1024
Вы следили за дисковым вводом-выводом? Увеличивается ли время ожидания ввода-вывода или очереди транзакций? Возможно, что запросы выстраиваются в очередь на уровне хранилища из-за ограничения ввода-вывода, установленного вашим хостом. Кроме того, вы проверяли, попадаете ли вы в максимально допустимое количество клиентов mysql? Если эти запросы внезапно занимают намного больше времени, возможно, это не оставляет достаточно доступных соединений для нормального трафика сайта, потому что другие соединения закрываются недостаточно быстро.
Если вы используете VPS, вы, вероятно, не можете видеть, что происходит на других хостах на том же физическом оборудовании.
Может случиться так, что сильно загруженный ввод-вывод, возможно, из-за вас, ведет к чему-то в совершенно отдельном резервном копировании VPS, на устранение которого затем требуется время. Возможно, поэтому перезапуска php и mysql в вашей системе недостаточно, чтобы все вернулось на круги своя. Интересно, но похоже, что перезагрузка вашего VPS решает проблему? Есть ли шанс, что это просто результат прошедшего времени?
Если вы закроете php и mysql, вы подумаете, что в вашей системе не будет много потребляющих ресурсов (я делаю много предположений, но вам следует знать больше). Хотя проверьте это.
Посмотрите, какая деятельность все еще продолжается. Atop - хороший инструмент, так как он включает в себя просмотр активности ввода-вывода для каждого процесса при наличии для этого достаточных разрешений. iostat полезен для просмотра общей активности диска для каждого устройства.
Если у вас не так много дисковой активности на вашем VPS, но производительность низкая, то, скорее всего, это будет другой VPS или, возможно, даже хост. Вам нужно будет поговорить об этом со своим хостинг-провайдером, но имейте в виду, что если вы вызываете проблему, вы ожидаете, что они будут обеспокоены этим.
Может ли быть системное ограничение, если VPS находится под большой нагрузкой. Не могли бы вы предоставить информацию о загрузке VPS, когда это происходит, а также системные журналы?