Я запускаю Apache 2.2.21 с предварительным форком MPM на выделенном сервере. Подробнее:
Server Version: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/1.0.0-fips DAV/2 SVN/1.7.0 mod_python/3.3.1 Python/2.6.5 mod_bwlimited/1.4 PHP/5.3.6
Трафик обычно составляет где-то между 10-30 запросами в секунду, имеется 12 ГБ оперативной памяти, и мы настроили MaxClients довольно консервативно (250). Мы действительно наблюдаем всплески использования по разным причинам (на более старом сервере мы несколько раз достигли максимального числа клиентов 100 во время этих всплесков).
В любом случае, это новый сервер. Через некоторое время наш статус Apache начинает выглядеть примерно так:
GGG_._._RC_.G..C.G_G.C_G..C_.CG_._._G__W____..R.WCR_.W..G_......
Буквы G («Изящное завершение») застревают. Они исчезают только после перезапуска Apache. Это определенно приведет к тому, что мы превысим наш предел MaxClients без регулярного мониторинга / исправления. Я читал в Интернете и, похоже, в Apache есть ошибка, похожая на эту, но происходит в других условиях. Это также было исправлено в версии 2.2.14.
Я включил трассировку стека зависшего процесса для вашей проверки.
#0 0x000000350c6f119e in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000350c67c138 in _L_lock_9164 () from /lib64/libc.so.6
#2 0x000000350c679a32 in malloc () from /lib64/libc.so.6
#3 0x000000350c66fcfb in __libc_message () from /lib64/libc.so.6
#4 0x000000350c675676 in malloc_printerr () from /lib64/libc.so.6
#5 0x000000350c675aa1 in malloc_consolidate () from /lib64/libc.so.6
#6 0x000000350c677f38 in _int_free () from /lib64/libc.so.6
#7 0x0000003906c64cbb in my_once_free () at my_once.c:117
#8 0x0000003906c5d6ff in my_end (infoflag=0) at my_init.c:170
#9 0x0000003906c5c547 in mysql_server_end () at libmysql.c:209
#10 0x00007f34ac195be8 in zm_shutdown_mysqli (type=<value optimized out>, module_number=22)
at /home/cpeasyapache/src/php-5.3.6/ext/mysqli/mysqli.c:834
#11 0x00007f34ac2b825f in module_destructor (module=0x1eafce0) at /home/cpeasyapache/src/php-5.3.6/Zend/zend_API.c:2098
#12 0x00007f34ac2be945 in zend_hash_apply_deleter (ht=0x7f34ac988aa0, p=0x1eafc80) at /home/cpeasyapache/src/php-5.3.6/Zend/zend_hash.c:614
#13 0x00007f34ac2bebd8 in zend_hash_graceful_reverse_destroy (ht=0x7f34ac988aa0) at /home/cpeasyapache/src/php-5.3.6/Zend/zend_hash.c:649
#14 0x00007f34ac2b3085 in zend_shutdown () at /home/cpeasyapache/src/php-5.3.6/Zend/zend.c:759
#15 0x00007f34ac26017a in php_module_shutdown () at /home/cpeasyapache/src/php-5.3.6/main/main.c:2146
#16 0x00007f34ac260229 in php_module_shutdown_wrapper (sapi_globals=<value optimized out>)
at /home/cpeasyapache/src/php-5.3.6/main/main.c:2118
#17 0x00007f34ac33a461 in php_apache_child_shutdown (tmp=<value optimized out>)
at /home/cpeasyapache/src/php-5.3.6/sapi/apache2handler/sapi_apache2.c:399
#18 0x00007f34ae59dea4 in run_cleanups () from /usr/local/apache/lib/libapr-1.so.0
#19 0x00007f34ae59cd72 in apr_pool_destroy () from /usr/local/apache/lib/libapr-1.so.0
#20 0x00000000004cc004 in clean_child_exit ()
#21 0x00000000004ccd00 in child_main ()
#22 0x00000000004cce62 in make_child ()
#23 0x00000000004cd107 in perform_idle_server_maintenance ()
#24 0x00000000004cd664 in ap_mpm_run ()
#25 0x000000000042e24f in main ()
Похоже, проблема возникает, когда наш PHP-скрипт закрывает соединение mysqli. При попытке освободить память происходит зависание. У кого-нибудь с подобной конфигурацией - Apache 2.2.21, PHP 5.3.6, MySQL / mysqli (5.1.56) - есть похожие проблемы?
Кто-нибудь знает, что я могу сделать, чтобы это исправить? Обновить MySQL / Apache / PHP? Я буду рад предоставить дополнительную информацию, если это поможет.
Спасибо!
ОБНОВИТЬ: Похоже, MySQL на самом деле не участвует в проблеме. Вот еще одна трассировка зависшего процесса, который включает только PHP:
#0 0x000000350c6f119e in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000350c67c138 in _L_lock_9164 () from /lib64/libc.so.6
#2 0x000000350c679a32 in malloc () from /lib64/libc.so.6
#3 0x000000350c66fcfb in __libc_message () from /lib64/libc.so.6
#4 0x000000350c675676 in malloc_printerr () from /lib64/libc.so.6
#5 0x000000350c675aa1 in malloc_consolidate () from /lib64/libc.so.6
#6 0x000000350c677f38 in _int_free () from /lib64/libc.so.6
#7 0x00007f532accb951 in zend_mm_shutdown (heap=0x2327aa0, full_shutdown=1, silent=<value optimized out>) at /home/cpeasyapache/src/php-5.3.6/Zend/zend_alloc.c:1648
#8 0x00007f532ac951af in php_module_shutdown () at /home/cpeasyapache/src/php-5.3.6/main/main.c:2159
#9 0x00007f532ac95229 in php_module_shutdown_wrapper (sapi_globals=<value optimized out>) at /home/cpeasyapache/src/php-5.3.6/main/main.c:2118
#10 0x00007f532ad6f461 in php_apache_child_shutdown (tmp=<value optimized out>) at /home/cpeasyapache/src/php-5.3.6/sapi/apache2handler/sapi_apache2.c:399
#11 0x00007f532cfd2ea4 in run_cleanups () from /usr/local/apache/lib/libapr-1.so.0
#12 0x00007f532cfd1d72 in apr_pool_destroy () from /usr/local/apache/lib/libapr-1.so.0
#13 0x00000000004cc004 in clean_child_exit ()
#14 0x00000000004ccd00 in child_main ()
#15 0x00000000004cce62 in make_child ()
#16 0x00000000004cd107 in perform_idle_server_maintenance ()
#17 0x00000000004cd664 in ap_mpm_run ()
#18 0x000000000042e24f in main ()
ОБНОВЛЕНИЕ 2: Оказывается, это известная проблема для некоторых систем.
Я заметил, что у меня также появляется статус "C". Процессы Apache зависают довольно долгое время (> 3000 секунд). Я написал cron для уничтожения процессов, которые долгое время зависали в статусе "G" или "C" ... но это лейбл. Я бы хотел исправить проблему.
Одна вещь, которую я заметил и также изменил в своей конфигурации, заключалась в том, что я не устанавливал директиву GracefulShutdownTimeout:
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#gracefulshutdowntimeout
Я добавил это и изменил его на 30 секунд. Посмотрим, поможет ли это.
Больше информации: Вот вывод cat / proc / PROCESS_ID / status для одного из процессов "G":
Name: httpd
State: S (sleeping)
Tgid: 14867
Pid: 14867
PPid: 30017
TracerPid: 0
Uid: 99 99 99 99
Gid: 99 99 99 99
Utrace: 0
FDSize: 64
Groups: 99
VmPeak: 355752 kB
VmSize: 222996 kB
VmLck: 0 kB
VmHWM: 191120 kB
VmRSS: 77928 kB
VmData: 62300 kB
VmStk: 96 kB
VmExe: 1032 kB
VmLib: 24736 kB
VmPTE: 488 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/95107
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 000000018c0046eb
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: ffffff
Cpus_allowed_list: 0-23
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003
Mems_allowed_list: 0-1
voluntary_ctxt_switches: 24708
nonvoluntary_ctxt_switches: 2651
Загруженные модули в Apache:
core_module (static)
authn_file_module (static)
authn_default_module (static)
authz_host_module (static)
authz_groupfile_module (static)
authz_user_module (static)
authz_default_module (static)
auth_basic_module (static)
include_module (static)
filter_module (static)
log_config_module (static)
logio_module (static)
mime_magic_module (static)
expires_module (static)
setenvif_module (static)
ssl_module (static)
mpm_prefork_module (static)
http_module (static)
mime_module (static)
dav_module (static)
status_module (static)
autoindex_module (static)
info_module (static)
suexec_module (static)
cgi_module (static)
dav_fs_module (static)
dav_lock_module (static)
negotiation_module (static)
dir_module (static)
actions_module (static)
userdir_module (static)
alias_module (static)
rewrite_module (static)
so_module (static)
python_module (shared)
dav_svn_module (shared)
authz_svn_module (shared)
bwlimited_module (shared)
php5_module (shared)
Загруженные модули в PHP:
[PHP Modules]
bcmath
Core
ctype
curl
date
dom
eAccelerator
ereg
exif
filter
gd
gettext
hash
iconv
imap
json
libxml
mbstring
mcrypt
memcache
mysql
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
posix
Reflection
session
SimpleXML
sockets
SPL
SQLite
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
[Zend Modules]
eAccelerator
Некоторые общие рекомендации, по которым я работаю, извините, если это не сразу возможно для вас:
mod_<language>
mod_fcgid
Если вы не изменяете заголовки HTTP или аналогичные в своем приложении, вы можете переключиться на fcgi без каких-либо изменений кода.
Это дает вам более четкое разделение различных элементов, которые играют в этой установке. В httpd
будет намного более устойчивым к любым ошибкам (с точки зрения производительности, но также и с точки зрения безопасности), которые вызывают сторонние модули.
Попробуйте установить Keepalive Off
. Я обычно делаю это автоматически, особенно в системах с конкуренцией ввода-вывода, таких как виртуальные машины.