Nginx php-fpm забивается записью соединений под высокой нагрузкой
У нас nginx/1.6.2 работает с php5-fpm (5.6) в системе Debian 8.
В последние дни мы получили более высокую нагрузку, чем обычно, из-за того, что на наши серверы попало больше пользователей. С большинством посетителей, приходящих в вечерние часы с 6 вечера до полуночи.
Спустя пару дней два разных сервера, на которых выполнялась вышеуказанная установка, показывали очень низкую частоту ответов в течение нескольких часов. В Мунине мы увидели, что внезапно возникли сотни соединений nginx в состоянии "записи", когда ранее их было всего около 20.
Мы не получаем никаких ошибок, кроме тайм-аут соединения на удаленных хостах при попытке доступа к этим серверам. Все логи, которые я видел, были просто нормальными.
Проблема может быть исправлена перезапуском php5-fpm.
Мой вопрос сейчас: почему вдруг сотни процессов утверждают, что пишут? Есть какая-то известная проблема или, возможно, пропущен параметр конфигурации, который может вызвать это?
Вот полный список симптомов, которые мы видим:
- Вместо < 20 очень быстрых активных соединений в секунду мы видим от 100 до 900 соединений в состоянии записи (все соединения nginx достигают php5-fpm, статические данные не обслуживаются этими серверами) Avg. Время выполнения сценария для сценариев php составляет 80 мс.
- Проблема возникает, только если общее количество запросов / с nginx превышает 300 / с, затем оно падает с ~350 до ~250 запросов / с, но эти 250 показывают до 900 "записывающих" соединений
- Многие из этих соединений в конечном итоге истекают и не дают правильного результата
- В наших логах нет ошибок
- Трафик eth / database, а также нагрузка на процессор соответствуют нижнему уровню 250 req/s, к которому падает общее количество, поэтому "запись" не происходит на начальном этапе.
Для настройки: как указано выше. Мы используем встроенный кэш опкодов Zend, APCu для кеша некоторых пользовательских переменных, один из серверов запускает экземпляр memcache (который отлично работает в течение всей проблемы), а другой - версию Redis, которая также работает нормально, пока проблема возникает.
Может ли кто-нибудь пролить свет на проблему?
Спасибо!
2 ответа
Мы нашли проблему: APCu кажется нестабильным с PHP 5.6.
Подробности:
- Debian 8
- Nginx / 1.6.2
- PHP 5.6.14-0 + deb8u1
- APCu 4.0.7 (редакция: 328290, 126M shm_size)
мы использовали xhprof для профилирования запросов, когда сервер работал медленно (см. вопрос), и заметили, что APCu занимает> 100 мс на операцию чтения / записи. Очистка переменных APCu не помогла. Все остальные части кода имели нормальную скорость.
Мы полностью отключили использование APCu, и система была стабильной с тех пор.
Похоже, что эта версия APCu нестабильна под нагрузкой PHP 5.6. По крайней мере, для нас.
У нас была та же проблема, и причина в том, что данные в Redis были больше, чем "maxmemory", поэтому redis не смог записать больше данных. Я мог войти в систему с помощью redis-cli, но не смог установить значение. Если у вас возникла эта проблема, вы можете войти в redis, используя redis-cli, и попытаться установить что-то, если память redis заполнена, вы получите ошибку.