Apache2: [error] child died with signal 11

Автор yura3d, 24 января 2013, 15:37:14

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

yura3d

Здравствуйте!
Периодически (иногда даже раз в несколько минут) падают чайлды Apache2 с такой ошибкой в логах:
[error] child died with signal 11
PHP установлен как модуль Apache (apache2-mod-php5), Apache MPM: itk (apache2-mpm-itk). Стоят последние стабильные версии (из репозиториев squeeze). Соединение с Apache проксируется через nginx, с последним никаких проблем нет, однако если nginx попадает на "падающий" чайлд Apache, то возвращает посетителю ошибку 502 Bad Gateway, что не есть гуд.
Из нагугленного выяснил, что проблема может заключаться в установленных модулях PHP5. У меня из дополнительных модулей установлены лишь memcache (ставился из репозиториев) и ioncube-loader (скачивался с сайта ioncube).
Можно ли как-то посмотреть, из-за чего всё-таки валится Apache? Быть может, проблема в каких-то настройках? Версию ОС, ядра, Apache, PHP и списка его модулей привожу ниже:
root@server:~# uname -a
Linux server 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux

root@server:~# apache2ctl -V
Server version: Apache/2.2.16 (Debian)
Server built:   Nov 30 2012 08:58:38
Server's Module Magic Number: 20051115:24
Server loaded:  APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     ITK
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/experimental/itk"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"

root@server:~# php5 -v
PHP 5.3.3-7+squeeze14 with Suhosin-Patch (cli) (built: Aug  6 2012 14:18:06)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with the ionCube PHP Loader v4.2.2, Copyright (c) 2002-2012, by ionCube Ltd.
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

root@server:~# php5 -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
ionCube Loader
json
libxml
mbstring
mcrypt
memcache
mhash
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
standard
suhosin
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
zip
zlib

[Zend Modules]
the ionCube PHP Loader

ihammers

Могу посоветовать посмотреть следующие параметры, возможно их стоит изменить (apache2.conf):
Timeout 300
...
KeepAlive On
...
KeepAliveTimeout 5
...
MaxRequestsPerChild   250


А также посмотрите настройки /etc/php5/*/php.ini.
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

yura3d

#2
Цитата: ihammers от 24 января 2013, 18:43:18Могу посоветовать посмотреть следующие параметры, возможно их стоит изменить (apache2.conf):
У меня в apache2.conf были установлены следующие параметры:
Timeout 300
...
KeepAlive On
...
KeepAliveTimeout 15
...
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Странно, что в этом файле нет секции для mpm_itk_module, ведь у меня установлен именно apache2-mpm-itk. Где-то читал, что itk основан на prefork, и поэтому использует его секцию. Но всякий случай секцию mpm_itk_module всё же добавил:
<IfModule mpm_itk_module>
    StartServers           5
    MinSpareServers        5
    MaxSpareServers       10
    MaxClients           150
    MaxRequestsPerChild 1000
</IfModule>

попутно ограничив MaxRequestsPerChild до 1000 в обоих секциях, чтобы пресечь возможные проблемы с утечкой памяти, связанную с возможным выполнением одним чайлдом Апача неограниченного числа запросов. Буду наблюдать дальнейшую работу, спасибо за наводку.

P.S. Файлы php.ini также просмотрел, но ничего сверхестественного там не нашёл: все настройки дефолтные, как только что из репозитория, от себя я там только прописывал путь sendmail_path к exim4 для возможности отправки почты из функции PHP mail(), а также прописывал путь к модулю ioncube (с этими моментами проблем нет). Быть может стоит отдельно обратить внимание на какие-то директивы, которые могут приводить к подобному эффекту (сабж) ?

ihammers

Цитата: yura3d от 24 января 2013, 20:39:00
...
P.S. Файлы php.ini также просмотрел, но ничего сверхестественного там не нашёл: все настройки дефолтные, как только что из репозитория, от себя я там только прописывал путь sendmail_path к exim4 для возможности отправки почты из функции PHP mail(), а также прописывал путь к модулю ioncube (с этими моментами проблем нет). Быть может стоит отдельно обратить внимание на какие-то директивы, которые могут приводить к подобному эффекту (сабж) ?
Я не использовал apache2-mpm-itk, поэтому ничего посоветовать по нему не могу, а в php.ini посмотрите например время исполнения скрипта, объём памяти, а возможно уже ничего не требуется изменять.  Что теперь логи говорят?
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

yura3d

Цитата: ihammers от 25 января 2013, 18:10:36Я не использовал apache2-mpm-itk, поэтому ничего посоветовать по нему не могу, а в php.ini посмотрите например время исполнения скрипта, объём памяти, а возможно уже ничего не требуется изменять.  Что теперь логи говорят?
Всё-таки бывают периоды, когда подобные ошибки всё равно сыпятся в логи. Например, сегодня первую половину дня вообще ни одной ошибки не было и я уже думал, что проблема решена. Ан нет:
[Fri Jan 25 19:47:41 2013] [error] child died with signal 11
[Fri Jan 25 19:47:43 2013] [error] child died with signal 11
[Fri Jan 25 19:48:03 2013] [error] child died with signal 11
[Fri Jan 25 19:48:23 2013] [error] child died with signal 11
[Fri Jan 25 20:02:54 2013] [error] child died with signal 11
[Fri Jan 25 20:10:55 2013] [error] child died with signal 11
[Fri Jan 25 20:11:44 2013] [error] child died with signal 11
[Fri Jan 25 20:18:24 2013] [error] child died with signal 11
[Fri Jan 25 20:20:14 2013] [error] child died with signal 11
[Fri Jan 25 20:20:25 2013] [error] child died with signal 11
[Fri Jan 25 20:20:27 2013] [error] child died with signal 11

и что самое интересное, что до 19:47 (первая запись) и после 20:20 (т.е. вот уже почти 3 часа!) ни одной ошибки не было.
Настройки в php.ini самые что ни на есть стандартные:
max_execution_time = 30
max_input_time = 60
memory_limit = 128M

Проблема в том, что у меня нет таких ресурсоёмких скриптов, которым бы не хватало отведённых выше ресурсов. Ошибка 502 Bad Gateway, генерируемая nginx в связи с падением чайлда Apache, может появится на простейшем скрипте. Да и обычно интерпретатор PHP всегда сообщает (и соответственно логирует) о нехватке выделенной памяти и т.п. В данном случае ничего такого не наблюдается.
Я почему-то всё же склонюясь к утечке памяти в каком-то из модулей PHP. Можно ли как-то произвести отладку Apache чтобы выяснить, на чём он всё-таки валится?

yura3d

Наверное, сам же себе и отвечу. :) Несколько дней назад в stable репозитории squeeze обновилась версия apache2-mpm-itk, с тех пор как я на неё обновился, ни одной подобной ошибки в логах больше не наблюдаю. Надеюсь, что проблема решена