Назад | Перейти на главную страницу

Apache mpm_worker + php: процессы не завершаются

Я вижу странную проблему на наших веб-серверах, когда процессы 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

Так что я подозреваю, что проблема именно в этом.