Я вижу странную проблему на наших веб-серверах, когда процессы Apache, кажется, остаются в подвешенном состоянии с 1 или 2 потоками. Это меня смущает, так как я просто подумал, что хочу наложить более строгий ServerLimit, чтобы я мог более безопасно увеличить свой php memory_limit.
Кто-нибудь знает хороший способ решить эту проблему? Выясните, что, черт возьми, делают эти процессы? В каком они состоянии?
Я не совсем уверен, но предполагаю, что это вызвано тем, что мы никогда не перезапускаем службу Apache и выполняем 2-3 перезагрузки в день по разным причинам.
Например, один из веб-серверов скучает, а другой облагается налогом:
PID PPID RES THREADS
*15608 1 29 MB 1
8880 1 2 MB 3
14989 1 0 MB 1
25029 1 0 MB 1
2115 15608 3 MB 2
13058 15608 361 MB 2
14556 15608 157 MB 27
19962 15608 23 MB 1
21219 15608 387 MB 3
21600 15608 3 MB 3
21828 15608 3 MB 2
30152 15608 3 MB 2
В этом примере есть 3 процесса, которые, как я предполагаю, когда-то были процессом управления (предварительная перезагрузка), которые все еще выполняются по какой-либо причине. А из процессов, связанных с новым процессом управления, все еще работает группа с 2-3 потоками каждый.
Спустя 11 часов многие из тех же PID все еще используются в одном потоке. Можно подумать, если бы MaxRequests был достигнут, проклятая штука прекратила бы работу.
memory usage report for apache2
pid count : 11
thread count : 46
shared mem usage : 670 MB
total resident size : 691 MB
total cpu usage : 79 %
total memory usage : 7 %
average mem / pid : 62 MB
process breakdown
PID PPID RES THREADS
*15608 1 29 MB 1
8880 1 2 MB 3
14989 1 0 MB 1
25029 1 0 MB 1
2115 15608 3 MB 2
19962 15608 23 MB 1
21219 15608 387 MB 3
21600 15608 3 MB 3
21828 15608 3 MB 2
29239 15608 238 MB 27
30152 15608 3 MB 2
process tree
|-apache2-+-3*[apache2---{apache2}]
| |-apache2
| |-2*[apache2---2*[{apache2}]]
| `-apache2---26*[{apache2}]
|-apache2---2*[{apache2}]
|-2*[apache2]
Первое, что нужно проверить, это порождают ли они какие-либо дополнительные процессы (у вас есть доступное pstree?). Включены ли функции php exec?
Другие вещи, на которые следует обратить внимание, включены ли у вас сообщения поддержки активности и установлено ли для maxRequests разумное значение. Потоки простаивают или что-то обрабатывают?
Говорит ли PHP с серверной частью базы данных? Как только поток выполнения переходит в клиентскую библиотеку БД, ограничения PHP в отношении использования памяти и временные ограничения больше не применяются, пока поток не вернется к PHP. Вы видите медленные запросы в своей базе данных?
Также стоит проверить, правильно ли настроен MTA - например, если вы используете sendmail с интеллектуальным ретранслятором и адрес, который вы настроили, неправильный, функция php mail () может блокироваться на длительное время.
Ответ Роба Олмоса относительно комментария Расмуса Лердорфа был сделан 6 лет назад Хотя в заявлении все еще есть доля правды, оно вряд ли применимо к основным расширениям.
Вы не сказали, какую ОС вы используете - ИМХО, преимущества потоковой передачи в Linux по сравнению с предварительным форком едва заметны.
Конечно, если вы исчерпали другие возможности и у вас нет веских причин придерживаться многопоточного apache, то стоит попробовать предварительную вилку, но сначала посмотрите в другом месте.
PHP работает через mod_php? Документация по установке PHP дает следующее:
Предупреждение. Мы не рекомендуем использовать многопоточный MPM в производственной среде с Apache 2. Используйте prefork MPM, который является MPM по умолчанию с Apache 2.0 и 2.2. Чтобы узнать, почему, прочтите соответствующую запись в FAQ по использованию Apache2 с многопоточным MPM
http://www.php.net/manual/en/install.unix.apache2.php
Так что я подозреваю, что проблема именно в этом.