Недавно я перешел на NGINX / PHP-FPM, чтобы вести свои форумы.
В большинстве случаев сайт работает красиво, очень быстро, и мне это очень нравится. Его на экземпляре 13 ядер / 30+ ГБ памяти с AWS, поэтому достаточно ресурсов (было на 8 ядрах, 16 ГБ раньше с Apache).
Итак, что происходит, большую часть времени у нас есть 6 или 7 процессов PHP-FPM, и все в мире хорошо;
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27676 apache 20 0 499m 34m 19m R 49.2 0.1 0:06.33 php-fpm
27669 apache 20 0 508m 48m 24m R 48.2 0.1 0:10.84 php-fpm
27661 apache 20 0 534m 75m 26m R 45.9 0.2 0:16.18 php-fpm
27671 apache 20 0 531m 69m 21m R 43.9 0.2 0:09.85 php-fpm
27672 apache 20 0 501m 41m 23m R 32.9 0.1 0:09.18 php-fpm
27702 apache 20 0 508m 40m 16m R 23.6 0.1 0:00.94 php-fpm
Ну вроде хорошо. Используется много ЦП, но их всего несколько, так что вроде нормально.
Затем, казалось бы, из ниоткуда, я породил кучу процессов (в прошлый раз у нас было 52) и каждый один использует 8% ЦП. Вам не нужно хорошо разбираться в этом, чтобы знать, что 52 * 8 - это МНОГО.
Теперь у меня max_children установлено на 40 (было 50).
pm.max_children = 40
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 100
Ограничение памяти в php.ini - 128 МБ.
Итак, я понимаю, почему у меня так много процессов - это нормально, я их настроил. Мне любопытно, если у нас 8% процессоров на процесс - это слишком много? И, может быть, мои процессы живут слишком долго?
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 26575 0.0 0.0 499572 4944 ? Ss 18:23 0:01 php-fpm: master process (/etc/php-fpm.conf)
apache 28161 16.1 0.1 516644 47588 ? S 19:06 0:08 php-fpm: pool www
apache 28164 18.0 0.1 525044 59644 ? S 19:06 0:07 php-fpm: pool www
apache 28166 18.6 0.1 513152 41388 ? R 19:06 0:06 php-fpm: pool www
apache 28167 23.2 0.1 515520 47092 ? S 19:06 0:07 php-fpm: pool www
apache 28168 15.2 0.1 515804 49320 ? S 19:06 0:04 php-fpm: pool www
apache 28171 17.3 0.1 514484 43752 ? S 19:06 0:04 php-fpm: pool www
Когда я пишу это, сейчас 19:08 - так что дочерние процессы выполнялись в течение 2 минут и, вероятно, много обслужили за это время (на форуме на банкоматах 700 человек).
Итак, я очень хочу услышать советы / критику / мнения. В последнее время у меня было так много простоев, что я снова собираюсь настроить Apache, и я хотел бы придерживаться этого.
Заранее спасибо.
РЕДАКТИРОВАТЬ
Это график Bitnami, показывающий всплески и как быстро они возникают (это 24 часа).
РЕДАКТИРОВАТЬ # 2
nginx.conf можно найти здесь.
РЕДАКТИРОВАТЬ # 3
Я увеличил свои цифры. Он хорошо выглядит, но все же заставляет меня немного нервничать.
pm.max_children = 100
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 50
pm.max_requests = 500
РЕДАКТИРОВАТЬ # 4
Итак, у меня было еще несколько простоев, и я установил Splunk и New Relic, чтобы следить за тем, что происходит. Вроде нет времени ожидания процессора и у меня все еще есть свободная память.
top - 17:30:37 up 10 days, 19:20, 2 users, load average: 24.61, 37.34, 25.68
Tasks: 151 total, 20 running, 131 sleeping, 0 stopped, 0 zombie
Cpu0 : 71.8%us, 27.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu1 : 73.7%us, 26.3%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 70.8%us, 29.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 69.3%us, 30.7%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 35062648k total, 28747980k used, 6314668k free, 438032k buffers
Swap: 0k total, 0k used, 0k free, 16527768k cached
Наблюдая за Splunk, это не похоже на его трафик - я действительно часто сталкиваюсь с роботом Googlebot, и я подозревал его, но ничего конкретного.
Ну вроде хорошо. Используется много ЦП, но их всего несколько, так что все в порядке
Объем работы, выполняемой процессом, определяется объемом процессора, который он использует - следовательно, это процент использования x время, в течение которого он используется. Так что, если ваши PHP-процессы используют много ЦП, это обычно хорошо - это означает, что он не ждет, пока что-то случится. С точки зрения системного администратора вы можете выделить больше ЦП для других задач, но вы увеличите количество времени, затрачиваемого PHP-процессом на обработку запроса.
И, конечно, если запросы поступают с постоянной скоростью, их обработка занимает больше времени, что означает, что одновременно будет больше процессов, работающих (или ожидающих планирования), а больший объем памяти означает, что для кэширования VFS доступно меньше памяти. Также существует риск того, что планировщик начнет упреждать задачи, а не позволять им завершаться, что снижает общую пропускную способность.
Следовательно, вы должен стремитесь к высокой загрузке процессора! (но небольшая нагрузка).
Ограничение памяти в php.ini - 128 МБ
Это довольно много, но поскольку загрузка ЦП высока, это указывает на то, что это не слишком большая проблема, ЕСЛИ каждый запрос занимает много времени и выполняет большую сборку мусора - в этом сценарии вынуждает более частую сборку мусора за счет сокращения ограничение памяти действительно может улучшить производительность.
В последнее время у меня было так много простоев
Как бы то ни было, я обнаружил, что APC намного надежнее Xcache - и это, похоже, тенденция в том, что я читал в других местах. У вас нет опыта / данных по Zend Optimizer +, который должен быть включен в будущие версии PHP.
Я снова собираюсь настроить Apache, и мне бы хотелось придерживаться этого
Pre-fork apache + mod_php значительно быстрее, чем nginx + php-fpm при меньших объемах трафика, но nginx, похоже, имеет огромное преимущество, когда скорость загрузки / запросов средняя - высокая по сравнению с мощностью оборудования (это то, где вы, кажется, быть).
Если бы это был я, я бы внимательно посмотрел в журналы, чтобы увидеть, вызваны ли всплески увеличением объема трафика / изменением профиля трафика / изменением времени отклика. Также внимательно смотрю на кеширование и код. Вы можете рассмотреть возможность временного запуска профилировщика на работающем сайте (используйте xhprof, а не xdebug для производственной системы).