Соединения Apache зависли при "отправке ответа" и высокой загрузке mysql
Apache на моем выделенном сервере постоянно зависает из-за зависания соединений в состоянии "отправка ответа":
Состояние Apache: соединения застряли в "Отправка ответа"
Это происходит по крайней мере несколько раз в день - иногда это не происходит в течение 2 или 3 часов, иногда это будет происходить постоянно до того момента, когда все соединения будут заняты и застрянут при отправке ответа в течение 5 минут после перезапуска apache. Это приводит к постоянному времени простоя сайтов. IP-адреса в этих запросах обычно являются Amazon AWS или Cloudflare (я использую Cloudflare для многих сайтов, а IP-адреса Amazon AWS могут быть из-за наличия сайта, использующего серверы имен Ezoic), которые получают доступ к различным URL-адресам на сайте. Столбец "SS" на снимке экрана выше показывает, как долго зависали соединения - в этом примере это сотни секунд на каждый запрос, поэтому что-то не так.
Это простые Wordpress-сайты, обычно без картинок, без необычных плагинов, очень простые и определенно ничего необычного, что может привести к длительной загрузке страницы. Однако каждый из них имеет от 5000 до 100 000 сообщений на каждом сайте и может публиковать до нескольких тысяч сообщений в день (используя плагин "WP all import pro"), которые планируется публиковать в случайное время в течение 24 часов с момента импорта. На сервере существует более 10 таких сайтов, но только 3 или 4 постоянно появляются в состоянии apache с застрявшими соединениями.
На всех сайтах сервера ежемесячные просмотры страниц едва превышают ~500 000, и мой сервер должен легко их обрабатывать (по имени: XEON E3 1240 V3 8 ГБ DDR3 1 ТБ HDD SATA).
Mysql часто находится под высокой нагрузкой на сервер, и иногда при просмотре списка процессов в phpmyadmin возникают зависшие запросы или иногда пустые запросы. Выполнение команды top также часто показывает очень высокую загрузку ЦП (мой сервер имеет 4 ядра ЦП). Пример скриншотов:
высокая загрузка процессора mysql
Вызывает беспокойство тот факт, что журнал ошибок mysql в /var/lib/mysql теперь имеет размер более 3 ГБ, слишком большой для меня, чтобы я даже мог его прочитать - переименование его и проверка сгенерированного нового показывает много ошибок "Получил ошибку при чтении пакетов связи". Я не знаю, является ли это проблемой для зависших соединений в apache, и если да, что с этим делать.
Я попытался изменить все возможные настройки apache, такие как Max Request Workers, со значения по умолчанию 150, чтобы можно было установить больше подключений (не помогает, поскольку новые подключения также становятся занятыми и зависшими), отключая все плагины или пробуя разные темы на сайтах WordPress (без эффекта), а также изменение некоторых других настроек mysql в my.cnf (согласно https://faultserver.ru/a/989269/548654) без улучшений. Я также попытался изменить все таблицы базы данных для одного из проблемных сайтов на InnoDB из MyISAM, и он все еще получает зависшие соединения. Что еще я могу попытаться решить эту проблему?
1 ответ
Re MySQL:
"Ожидание блокировки на уровне таблицы" подразумевает выполнение какой-то задачи администратора (например, ALTER TABLE). Это полный ПРОЦЕССЛИСТ? Обычно непослушный запрос может быть обнаружен, если "Время" больше, чем самый длительный "зависший" запрос.
Медленный журнал - это еще один способ отловить, по сути, длительные запросы.
Одним из исправляемых недостатков в WordPress является определение мета-таблицы: http://mysql.rjweb.org/doc.php/index_cookbook_mysql