[Sun Sep 01 11:12:38 2013] [notice] child pid 1559 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:13:01 2013] [notice] child pid 1562 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:13:15 2013] [notice] child pid 1566 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:14:24 2013] [notice] child pid 1565 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:14:45 2013] [notice] child pid 15047 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:16:23 2013] [notice] child pid 14997 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:16:54 2013] [notice] child pid 1560 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:17:30 2013] [notice] child pid 15447 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:18:19 2013] [notice] child pid 15094 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:28:33 2013] [notice] child pid 1563 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:34:24 2013] [notice] child pid 1564 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
[Sun Sep 01 11:50:32 2013] [notice] child pid 1568 exit signal Segmentation fault (11), possible coredump in /tmp/httpd_coredump
Апач умирает, сайты не работают, выводится 500 ошибка. Потом через какое-то время все восстанавливается.
Использую последнюю последнюю VMBitrix4.2 на физическом сервере, объем памяти 32 Гб.
Смотрю дамп:
gdb /usr/sbin/httpd core bt
Код
(gdb) bt
#0 0x00007f1862cd58fd in do_bind_function () from /etc/httpd/modules/libphp5.so
#1 0x00007f1862d1494c in ?? () from /etc/httpd/modules/libphp5.so
#2 0x00007f1862d146f0 in execute () from /etc/httpd/modules/libphp5.so
#3 0x00007f1862ceee2d in zend_execute_scripts () from /etc/httpd/modules/libphp5.so
#4 0x00007f1862c9cf08 in php_execute_script () from /etc/httpd/modules/libphp5.so
#5 0x00007f1862d77d75 in ?? () from /etc/httpd/modules/libphp5.so
#6 0x00007f186847cbb0 in ap_run_handler ()
#7 0x00007f186848046e in ap_invoke_handler ()
#8 0x00007f186848bb30 in ap_process_request ()
#9 0x00007f18684889a8 in ?? ()
#10 0x00007f18684846b8 in ap_run_process_connection ()
#11 0x00007f1868490977 in ?? ()
#12 0x00007f1868490c8a in ?? ()
#13 0x00007f1868490fbb in ap_mpm_run ()
#14 0x00007f1868468900 in main ()
Естественно апач умер из-за PHP.
Например, я уменьшил размер recursion_limit с 14000 до 7000. Ошибка повторилась.
На странице проверки сайта иногда возникает ворнинг PHP:
Код
Warning: require_once(): Unable to allocate memory for pool. in /home/bitrix/ext_www/мой_сайт/bitrix/modules/main/admin/site_checker.php on line 255
Ворнинг временно лечится перезагрузкой апача. Пробовал увеличить apc.shm_size с 256 до 512. Ворнинг стал возникать реже но возникает.
Монитор производительности от меня еще чего-то хочет:
Код
apc.shm_size ( текущее значение:"512M" ) 100.00% используемой памяти Увеличить размер кеша.
На сервере нет еще никаких нагруженных проектов. Самый посещаемый сайт - корпортивный портал.
Какие магические действия еще можно применить?
Проверка сайта пишет:
Код
Размер стека и pcre.recursion_limit
Возможны проблемы в работе с длинными строками из-за системных ограничений
Как в скрипте запуска Apache написать: ulimit -s unlimited ? Где это скрипт и куда в нем это писать? Как смотреть coredump дальше? Как понять какое расширение глючит? Почему в VMBitrix используется 5.3.3? Почему бы её не обновить?
# Set parameters required for proper Bitrix engine functioning.
# You can redefine parameters specified in this file
# by editing /etc/php.d/z_bx_custom_settings.ini
# Configure error processing
display_errors = On
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING
# Set some more PHP parameters
enable_dl = Off
short_open_tag = On
allow_url_fopen = On
allow_call_time_pass_reference = On
# Change default values of important constants
max_input_vars = 4000
max_file_uploads = 100
max_execution_time = 300
post_max_size = 1024M
upload_max_filesize = 1024M
pcre.backtrack_limit = 1000000
;pcre.recursion_limit = 14000
pcre.recursion_limit = 3500
realpath_cache_size = 4096k
# Utf-8 support
mbstring.func_overload = 2
mbstring.internal_encoding = UTF-8
# Configure PHP sessions
session.entropy_length = 128
session.entropy_file = /dev/urandom
session.save_path = "/tmp/php_sessions/www"
# Set directory for temporary files
upload_tmp_dir = "/tmp/php_upload/www"
;sendmail_path = msmtp -t -i
sendmail_path = /usr/sbin/sendmail -t -i
date.timezone = Europe/Moscow
В целом файл таким и был, только настройки были в другом порядке и без комментариев.
У нас только пара отличий от вашего примера:
- наш сервер сам рассылает почту через postfix, - параметр pcre.recursion_limit уменьшил еще больше до 3500, чтобы исключить возможность падения из-за pcre
(gdb) bt
#0 0x00007f283dd848fd in do_bind_function ()
from /etc/httpd/modules/libphp5.so
#1 0x00007f283ddc394c in ?? () from /etc/httpd/modules/libphp5.so
#2 0x00007f283ddc36f0 in execute () from /etc/httpd/modules/libphp5.so
#3 0x00007f283dd94575 in zend_call_function ()
from /etc/httpd/modules/libphp5.so
#4 0x00007f283dcec797 in ?? () from /etc/httpd/modules/libphp5.so
#5 0x00007f283ddec3b8 in ?? () from /etc/httpd/modules/libphp5.so
#6 0x00007f283ddc36f0 in execute () from /etc/httpd/modules/libphp5.so
#7 0x00007f283dd92f6a in zend_eval_stringl ()
from /etc/httpd/modules/libphp5.so
#8 0x00007f283dc5fc8f in php_pcre_replace_impl ()
from /etc/httpd/modules/libphp5.so
#9 0x00007f283dc608a7 in ?? () from /etc/httpd/modules/libphp5.so
#10 0x00007f283dc61066 in ?? () from /etc/httpd/modules/libphp5.so
#11 0x00007f283dc61453 in ?? () from /etc/httpd/modules/libphp5.so
#12 0x00007f283ddec3b8 in ?? () from /etc/httpd/modules/libphp5.so
#13 0x00007f283ddc36f0 in execute () from /etc/httpd/modules/libphp5.so
#14 0x00007f283dd9de2d in zend_execute_scripts ()
from /etc/httpd/modules/libphp5.so
#15 0x00007f283dd4bf08 in php_execute_script ()
from /etc/httpd/modules/libphp5.so
#16 0x00007f283de26d75 in ?? () from /etc/httpd/modules/libphp5.so
То есть я не могу точно определить имя файла php и функцию php, которые вызываются. Знать бы как.
-------
Судя по access.log во время ошибок вызываются разные файлы сайта, например:
Код
"GET /bitrix/tools/public_session.php?sessid=0bcb65a867766a54360b1259bf654321&interval=0&k=be4e5dc13b0950a5e2e84c3162123456
HTTP/1.0" 200 2 "http://мой_портал/extranet/workgroups/group/42/tasks/"
"Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
Александр Сербул в свое время написал неплохую статью на этот счет, по мотивам руководства из PHP. Если же ходить по стеку и исследовать локальные переменные желания нет, то существует способ вызвать непосредственный "родной" backtrace PHP. Подробней это описано в этой статье. Правда такой способ потребует дополнительной подготовки в виде добавления отладочной информации для PHP. В CentOS это можно сделать установив yum-utils с последующим запуском debuginfo-install <имя пакета php>. Ну, либо найти и поставить пакет вручную.