Intereting Posts
order by rand () получает проблемы для больших сообщений Zend Framework 2: автоматическое отключение макета для вызовов ajax Laravel отправляет сценарий электронной почты, конфигурации и отправки .htaccess переписать правило со статическими файлами дает мне 404, что мне не хватает? Перевод PHP по рабочим дням и месяцам Применяет ли ORDER BY до или после DISTINCT? Сообщение. Настроенное соединение с базой данных является постоянным. Aborting Как я могу отправить данные с веб-страницы на последовательный порт? Случайное генерирование цвета с использованием PHP Массив для SVG, гибкий алгоритм с PHP php geo ip loc не работает Ссылка на новую страницу php page wordpress Проблемы с кодировкой PHP + MySQL для португальского (PT-Br) Есть ли функция в Django / Python, похожая на PHP flush (), которая позволяет мне отправлять часть ответа HTTP клиентам? Уведомление PHP: попытка получить свойство ошибки, отличной от объекта

502 Ошибки шлюза при высокой нагрузке (nginx / php-fpm)

Я работаю на довольно занятом интернет-сайте, который часто получает очень большие всплески трафика. Во время этих всплесков запрашиваются сотни страниц в секунду, и это приводит к случайным ошибкам шлюза 502.

Теперь мы запускаем Nginx (1.0.10) и PHP-FPM на машине с 4x дисками SAS 15k (raid10) с 16-ядерным процессором и 24 ГБ оперативной памяти DDR3. Также мы используем последнюю версию Xcache. БД находится на другой машине, но загрузка этой машины очень низкая и проблем нет.

При нормальной нагрузке все работает отлично, загрузка системы ниже 1, а отчет о статусе PHP-FPM никогда не показывает более 10 активных процессов за один раз. Всегда имеется около 10 ГБ оперативной памяти. При нормальной нагрузке машина обрабатывает около 100 просмотров страниц в секунду.

Проблема возникает, когда прибывают огромные всплески трафика, и сотни страниц в секунду запрашиваются с машины. Я заметил, что в отчете о статусе FPM отображается до 50 активных процессов, но это все еще намного ниже настроенных нами 300 максимальных подключений. Во время этих всплесков Nginx сообщает о состоянии до 5000 активных соединений вместо нормального среднего значения 1000.

Информация о ОС: выпуск CentOS 5.7 (Final)

Процессор: Intel (R) Xeon (R) CPU E5620 @ 2.40GH (16 ядер)

PHP-fpm.conf

daemonize = yes listen = /tmp/fpm.sock pm = static pm.max_children = 300 pm.max_requests = 1000 

Я не устанавливаю rlimit_files, потому что, насколько я знаю, он должен использовать системный дефолт, если вы этого не сделаете.

fastcgi_params (только добавленные значения в стандартный файл)

 fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; fastcgi_pass unix:/tmp/fpm.sock; 

nginx.conf

 worker_processes 8; worker_connections 16384; sendfile on; tcp_nopush on; keepalive_timeout 4; 

Nginx подключается к FPM через Unix Socket.

sysctl.conf

 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 1 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 net.ipv4.conf.eth0.rp_filter=1 net.ipv4.conf.lo.rp_filter=1 net.ipv4.ip_conntrack_max = 100000 

limits.conf

 * soft nofile 65536 * hard nofile 65536 

Это результаты для следующих команд:

 ulimit -n 65536 ulimit -Sn 65536 ulimit -Hn 65536 cat /proc/sys/fs/file-max 2390143 

Вопрос: Если PHP-FPM не работает из-за соединений, нагрузка по-прежнему низкая, и доступно много оперативной памяти, какое узкое место может вызвать эти случайные ошибки шлюза 502 во время высокого трафика?

Примечание: по умолчанию этот ulimit этого устройства был 1024, так как я изменил его на 65536, я не полностью перезагрузил машину, так как это производственная машина, и это будет означать слишком много времени простоя.

Это должно исправить это …

У вас есть: fastcgi_buffers 4 256k;

Измените его на: fastcgi_buffers 256 16k; // 4096k всего

Также установите fastcgi_max_temp_file_size 0 , который отключит буферизацию на диск, если ответы начнут вытеснять ваши буферы fastcgi.

Unix-сокет принимает по умолчанию 128 подключений. Хорошо помещать эту строку в /etc/sysctl.conf

 net.core.somaxconn = 4096 

Если в некоторых случаях это не помогает – используйте стандартную привязку порта вместо сокета, потому что сокет на 300+ может блокировать новые запросы, заставляя nginx показывать 502.

@Мистер. благодеяние

У меня 8 ядро ​​14 ГБ. Но система часто выдает тайм-аут Gateway.
Реализация ниже исправления также не решила проблему. Продолжайте искать исправления.

У вас есть: fastcgi_buffers 4 256k;

Измените его на:

fastcgi_buffers 256 16k; // 4096k всего

Также установите fastcgi_max_temp_file_size 0, который отключит буферизацию на диск, если ответы начнут превышать ваши буферы fastcgi .

Благодарю.