Пожалуйста, помогите мне настроить мою конфигурацию для php5-fpm и nginx.
Проблема в том, что мой журнал php5-fpm сообщает о медленных скриптах и убивает дочерний поток.
Выделенный сервер, quad xeon, 32Gb Ram. 1 приложение / сайт php запущено.
Приложение PHP: В двух словах, поисковая система, результаты запускают запросы curl. Время загрузки страницы обычно составляет 2–3 секунды на поиск.
Вот что, я думаю, происходит:
Я получаю 750 одновременных пользователей php, выполняющих поиск. Я могу только установить pm.max_children = 400
из-за ограничений ОЗУ. Я предполагаю, что 50 МБ на пользователя (дочерний поток), так что = 20 ГБ. Я предполагаю, что каждый пользователь = 1 дочерний поток. Так, pm.max_children
недостаточно, чтобы охватить 750 активных пользователей php, которые выполняют поиск, который занимает 3 секунды.
Поэтому я думаю, что вижу пользователей в очереди, потому что я вижу, что 3 секунды превращаются в 4-7 секунд. Поскольку пользователи находятся в очереди, я думаю, что скрипт медленно запускает сообщение журнала ошибок, а php5-fpm pm убивает ребенка?
Я думаю, вот что происходит. Я предоставил свой вывод журнала ошибок, конфигурацию nginx, php5-fpm ниже.
Я был бы очень признателен за любой совет, могу ли я настроить свою конфигурацию и действительно ли pm.max_children
должно быть, по крайней мере, равным максимальному количеству одновременных пользователей, учитывая, что мои поисковые запросы php открыты около 3 секунд. Мне нужно больше памяти или, возможно, дополнительные серверы?
Это моя память, но я перезапустил nginx только 30 минут назад
:/var/log# free -m
total used free shared buffers cached
Mem: 32151 26175 5975 0 186 13334
-/+ buffers/cache: 12654 19496
Swap: 32739 5 32734
php5-fpm: www.conf: менеджер процессов установлен на статический
Я использую статику, потому что думал, что все дети будут доступны мгновенно, а не во время появления, и я запускаю только 1 приложение на коробке.
;pm = dynamic
pm = static
;pm.max_children = 10
pm.max_children = 400
;pm.start_servers = 4
pm.start_servers = 150
;pm.min_spare_servers = 2
pm.min_spare_servers = 32
;pm.max_spare_servers = 6
pm.max_spare_servers = 64
;pm.max_requests = 500
pm.max_requests = 10000
Ошибки в логах php5-fpm
Я должен уточнить, поведение, которое я наблюдаю при высокой нагрузке, 750 пользователей одновременно, заключается в том, что кешированные, а не кешированные результаты поиска начинают занимать больше времени. то есть> 1 секунды для кэширования и от 4 до 7 секунд для некэшированных. По мере того как пользователи выстраиваются в очередь и ждут, я думаю, что время поиска увеличивается, и оно приближается к точке, где скрипты работают медленно под нагрузкой. Вызовите уведомление, и ребенок погибнет.
например это было сразу после перезапуска
[04-Jun-2013 20:11:07] NOTICE: Finishing ...
[04-Jun-2013 20:11:11] NOTICE: exiting, bye-bye!
[04-Jun-2013 20:11:12] NOTICE: fpm is running, pid 17899
[04-Jun-2013 20:11:12] NOTICE: ready to handle connections
[04-Jun-2013 20:27:28] WARNING: [pool www] child 18200, script '/home/site/public_html/index.php' (request: "POST /index.php") executing too slow (10.827363 sec), logging
[04-Jun-2013 20:27:28] WARNING: [pool www] child 18138, script '/home/site/public_html/index.php' (request: "POST /index.php") executing too slow (10.827034 sec), logging
[04-Jun-2013 20:27:28] NOTICE: child 18138 stopped for tracing
[04-Jun-2013 20:27:28] NOTICE: about to trace 18138
[04-Jun-2013 20:27:28] NOTICE: finished trace of 18138
[04-Jun-2013 20:27:28] NOTICE: child 18200 stopped for tracing
[04-Jun-2013 20:27:28] NOTICE: about to trace 18200
[04-Jun-2013 20:27:28] NOTICE: finished trace of 18200
[04-Jun-2013 20:52:52] WARNING: [pool www] child 17948, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (11.724081 sec), logging
[04-Jun-2013 20:52:52] NOTICE: child 17948 stopped for tracing
[04-Jun-2013 20:52:52] NOTICE: about to trace 17948
[04-Jun-2013 20:52:52] ERROR: failed to ptrace(PEEKDATA) pid 17948: Input/output error (5)
[04-Jun-2013 20:52:52] NOTICE: finished trace of 17948
[04-Jun-2013 20:58:22] WARNING: [pool www] child 18287, script '/home/site/public_html/index.php' (request: "POST /index.php") executing too slow (10.701504 sec), logging
[04-Jun-2013 20:58:22] NOTICE: child 18287 stopped for tracing
[04-Jun-2013 20:58:22] NOTICE: about to trace 18287
[04-Jun-2013 20:58:22] NOTICE: finished trace of 18287
[04-Jun-2013 21:19:22] WARNING: [pool www] child 18224, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (10.005466 sec), logging
[04-Jun-2013 21:19:22] WARNING: [pool www] child 18197, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (12.141221 sec), logging
[04-Jun-2013 21:19:22] WARNING: [pool www] child 17946, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (11.107080 sec), logging
[04-Jun-2013 21:19:22] NOTICE: child 17946 stopped for tracing
[04-Jun-2013 21:19:22] NOTICE: about to trace 17946
[04-Jun-2013 21:19:22] NOTICE: finished trace of 17946
[04-Jun-2013 21:19:22] NOTICE: child 18197 stopped for tracing
[04-Jun-2013 21:19:22] NOTICE: about to trace 18197
[04-Jun-2013 21:19:22] NOTICE: finished trace of 18197
[04-Jun-2013 21:19:22] NOTICE: child 18224 stopped for tracing
[04-Jun-2013 21:19:22] NOTICE: about to trace 18224
[04-Jun-2013 21:19:22] NOTICE: finished trace of 18224
[04-Jun-2013 21:19:26] WARNING: [pool www] child 18197, script '/home/site/public_html/index.php' (request: "GET /index.php") execution timed out (15.475021 sec), terminating
[04-Jun-2013 21:19:26] WARNING: [pool www] child 18055, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (12.927407 sec), logging
[04-Jun-2013 21:19:26] NOTICE: child 18055 stopped for tracing
[04-Jun-2013 21:19:26] NOTICE: about to trace 18055
[04-Jun-2013 21:19:26] NOTICE: finished trace of 18055
[04-Jun-2013 21:19:26] WARNING: [pool www] child 18197 exited on signal 15 (SIGTERM) after 4094.193190 seconds from start
[04-Jun-2013 21:19:26] NOTICE: [pool www] child 5137 started
[04-Jun-2013 21:24:49] WARNING: [pool www] child 17918, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (11.367854 sec), logging
[04-Jun-2013 21:24:49] NOTICE: child 17918 stopped for tracing
[04-Jun-2013 21:24:49] NOTICE: about to trace 17918
[04-Jun-2013 21:24:49] NOTICE: finished trace of 17918
[04-Jun-2013 21:24:53] WARNING: [pool www] child 18226, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (10.763667 sec), logging
[04-Jun-2013 21:24:53] WARNING: [pool www] child 18206, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (12.060464 sec), logging
[04-Jun-2013 21:24:53] WARNING: [pool www] child 18073, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (11.846097 sec), logging
[04-Jun-2013 21:24:53] NOTICE: child 18073 stopped for tracing
[04-Jun-2013 21:24:53] NOTICE: about to trace 18073
[04-Jun-2013 21:24:53] NOTICE: finished trace of 18073
[04-Jun-2013 21:24:53] NOTICE: child 18206 stopped for tracing
[04-Jun-2013 21:24:53] NOTICE: about to trace 18206
[04-Jun-2013 21:24:53] NOTICE: finished trace of 18206
[04-Jun-2013 21:24:53] NOTICE: child 18226 stopped for tracing
[04-Jun-2013 21:24:53] NOTICE: about to trace 18226
[04-Jun-2013 21:24:53] NOTICE: finished trace of 18226
[04-Jun-2013 21:24:56] WARNING: [pool www] child 5137, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (12.055624 sec), logging
[04-Jun-2013 21:24:56] WARNING: [pool www] child 18206, script '/home/site/public_html/index.php' (request: "GET /index.php") execution timed out (15.395149 sec), terminating
[04-Jun-2013 21:24:56] WARNING: [pool www] child 17996, script '/home/site/public_html/index.php' (request: "GET /index.php") executing too slow (12.145728 sec), logging
[04-Jun-2013 21:24:56] WARNING: [pool www] child 17918, script '/home/site/public_html/index.php' (request: "GET /index.php") execution timed out (18.036700 sec), terminating
[04-Jun-2013 21:24:56] NOTICE: child 17996 stopped for tracing
[04-Jun-2013 21:24:56] NOTICE: about to trace 17996
[04-Jun-2013 21:24:56] NOTICE: finished trace of 17996
[04-Jun-2013 21:24:56] NOTICE: child 5137 stopped for tracing
[04-Jun-2013 21:24:56] NOTICE: about to trace 5137
[04-Jun-2013 21:24:56] NOTICE: finished trace of 5137
[04-Jun-2013 21:24:56] WARNING: [pool www] child 17918 exited on signal 15 (SIGTERM) after 4424.343036 seconds from start
[04-Jun-2013 21:24:56] NOTICE: [pool www] child 6706 started
[04-Jun-2013 21:24:56] WARNING: [pool www] child 18206 exited on signal 15 (SIGTERM) after 4424.264130 seconds from start
[04-Jun-2013 21:24:56] NOTICE: [pool www] child 6707 started
[04-Jun-2013 21:24:59] WARNING: [pool www] child 17996, script '/home/site/public_html/index.php' (request: "GET /index.php") execution timed out (15.479201 sec), terminating
[04-Jun-2013 21:24:59] WARNING: [pool www] child 17996 exited on signal 15 (SIGTERM) after 4427.655572 seconds from start
[04-Jun-2013 21:24:59] NOTICE: [pool www] child 6708 started
Вот моя конфигурация nginx
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
worker_rlimit_nofile 20000;
events {
#worker_connections 768;
#worker_connections 19000;
#multi_accept on;
use epoll;
#worker_connections 10240;
worker_connections 4096;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 65;
#keepalive_timeout 5;
#added
client_body_timeout 15;
client_header_timeout 15;
keepalive_timeout 15;
send_timeout 15;
site.conf
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
#fastcgi_buffers 256 16k; #4096k total
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
php5-fpm подключается через TCP-порт
Спасибо
Я думаю, что вы, вероятно, запускаете слишком много одновременных процессов php, но это трудно понять, не имея дополнительной информации о том, где ваши узкие места в ресурсах. Я полагаю, что вы, вероятно, ограничены дисковым вводом-выводом и / или процессором, и что все ваши параллельные процессы PHP конкурируют за них и замедляют друг друга. В какой-то момент накладные расходы на переключение процессов становятся существенным фактором, и вы получаете меньше пропускной способности, чем больше, если выполняете много процессов. Вы также можете попасть в ситуации или рискуете столкнуться с ситуациями, когда у вас заканчивается ОЗУ и вы начинаете менять местами, что очень плохо. Доверяйте тому, что nginx может ставить запросы в очередь и поддерживать более высокую пропускную способность для более быстрых запросов, одновременно выполняя их меньше.
Обычно я выбираю от 5 до 50 процессов PHP, причем оба конца этого диапазона немного исключительны. Чаще 10-15. С участием очень высокопроизводительные дисковые системы и более чем 16 или около того ядер, возможно, имеет смысл иметь больше процессов, но обычно это ложная экономия по сравнению с большим количеством более дешевых серверов. По моему опыту, если у вас нет большого количества действительно плохо написанного кода, обычно мало пользы от наличия более чем 15 процессов php параллельно на одном сервере, и если есть преимущество, скорее всего, это стабильность, а не пропускная способность. лицо патологически долгих запросов, которые накапливаются и не оставляют свободных процессов.
Если у вас есть несколько баз кода с отдельными пулами процессов, вам может понадобиться большое количество процессов, но вам, вероятно, не нужно больше 3-5 процессов на пул.
Вам нужно, чтобы много рабочих соединений nginx обрабатывали статические файлы. Вряд ли будет какое-либо улучшение после 4096, и только в необычных обстоятельствах вы увидите разницу между 1000 и 4000. (Если вы в основном не обслуживаете статические файлы - это совсем другой сценарий, но поскольку вы говорите о процессах php на этом box Я не думаю, что это так).
Я подозреваю, что у вас слишком большие таймауты. Если ничего не происходит, разорвите соединение и перейдите к следующему.
1) Память. Первое, на что я обращаю внимание, это почему вашим скриптам требуется 50 МБ памяти, если все, что они делают, - это простой поиск - я предполагаю, что вы на самом деле не вернули несколько мегабайт данных для каждого пользователя, если вы обслуживаем сотни запросов в секунду.
Eсть ошибка в библиотеке коннекторов MySQL это заставляет PHP выделять максимально возможный размер для любого ТЕКСТА или BLOB, а не только фактический объем необходимой памяти. Это можно исправить, перейдя в библиотеку MySQLND, без необходимости изменения кода.
2) Ваш параметр pm.max_requests = 10000, вероятно, не лучший выбор. Если каждый запрос занимает 2 секунды, вы говорите диспетчеру процессов перезапустить каждый процесс через 20 000 секунд или почти 6 часов. Это кажется очень долгим временем, и его хватит, чтобы любая утечка памяти остановила процесс. Возврат к 500 по-прежнему будет перезапуском каждые 15 минут, что не повлияет на производительность, но, вероятно, будет более стабильным.
3) Как сказал Майкл, даже если вы можете разрешить столько процессов, сколько у вас есть подключенных пользователей, вам все равно нужно выяснить, где на самом деле находится узкое место. Даже если у вас есть несколько сотен PHP-процессов одновременно, если все они просто ждут, пока SQL-сервер станет доступным, они всегда будут просто стоять в очереди, чтобы дождаться и в конечном итоге начать тайм-аут.
Если вы не можете устранить узкое место, вам нужно будет либо реализовать механизм ограничения скорости, чтобы разрешить только столько запросов, сколько может обработать ваш сервер, либо постепенное снижение производительности для отклонения запросов, которые ваш сервер в настоящее время не может обрабатывать.
Если все остальное не удается ... Я думаю, что вы справитесь с этим в коде. Вы можете создать «тикет-систему», чтобы разрешить определенное количество поисков одновременно, и дать вашим пользователям приблизительное время ожидания. Что-то вроде «ваш поиск начнется через N секунд».
Я пока не могу комментировать (недостаточно репутации), поэтому я опубликую ответ: было бы хорошо иметь и ваши журналы nginx.
О конфигурации pool.d / www: если вы поместите свой pm в статический, большинство ваших переменных не будут иметь никакого эффекта, это max_children, который в основном повлияет на вашу настройку. (http://php.net/manual/en/install.fpm.configuration.php ) Попробовать может с ПМ "по требованию".
Вы не должны начинать с такого высокого значения pm.start_servers. Вам также следует снизить уровень min_spare_servers.
О вашей конфигурации nginx: http://wiki.nginx.org/CoreModule#worker_processes "max_clients = worker_processes * worker_connections"
Ваше значение worker_rlimit_nofile мне кажется неверным.
смотреть на http://wiki.nginx.org/CoreModule#worker_cpu_affinity использовать все свои ядра тоже.