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