Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 10882 - Включить core dump для процессов apache   Make a simular bug
Summary: Включить core dump для процессов apache
Status: CLOSED FIXED
Alias: None
Product: Хостинг
Classification: Инфраструктура (Infrastructure)
Component: Apache (show other bugs)
Version: не указана
Hardware: PC Linux
: P4 minor
Target Milestone: ---
Assignee: Vitaly Lipatov
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 10883
  Show dependency treegraph
 
In work:
Reported: 2015-10-22 12:03 MSK by Vitaly Lipatov
Modified: 2016-01-22 00:53 MSK (History)
1 user (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Lipatov 2015-10-22 12:03:16 MSK
Включение генерации core-файла осложняется двумя условиями:
1. использование контейнера openvz
2. использование модуля itk в Apache.

В host системе настроил
# sysctl -a | grep core
kernel.core_uses_pid = 1
kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t
kernel.core_pipe_limit = 0

В контейнере видим то же самое:
# sysctl -a | grep core
kernel.core_uses_pid = 1
kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t
kernel.core_pipe_limit = 0

# grep core /etc/security/limits.d/50-defaults.conf 
*		soft	core	unlimited

# grep ulimit /etc/profile
ulimit -Sc unlimited >/dev/null 2>&1

# grep ulimit /etc/sysconfig/httpd2  
ulimit -c unlimited

# ulimit -c
unlimited


Но для процесса apache всё равно
# cat /proc/21233/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max core file size        0                    unlimited            bytes

При этом для процесса redis выставляется:
# cat /proc/20739/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max core file size        unlimited            unlimited            bytes   

И 
# kill -11 20739
создаёт core-файл!

# ls /tmp/core*
/tmp/core-redis-server-11-497-495-20739-1445504489

и он подключается:
# gdb /usr/sbin/redis-server /tmp/core-redis-server-11-497-495-20739-1445504489
Comment 1 Vitaly Lipatov 2015-10-22 12:38:42 MSK
Через strace видно, что кто-то безуспешно вызывает
[pid 22059] prlimit64(0, RLIMIT_CORE, NULL, 0xbfc98d20) = -1 ENOSYS (Function not implemented)
[pid 22059] ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
[pid 22059] prlimit64(0, RLIMIT_CORE, NULL, 0xbfc98d80) = -1 ENOSYS (Function not implemented)
[pid 22059] ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
[pid 22059] prlimit64(0, RLIMIT_CORE, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}, NULL) = -1 ENOSYS (Function not implemented)
[pid 22059] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0

При этом удобный вызов prlimit не реализован в ядре:
# strace -f prlimit -p 22471 -c
prlimit64(22471, RLIMIT_CORE, NULL, 0xa0053c0) = -1 ENOSYS (Function not implemented)
write(2, "prlimit: ", 9prlimit: )                = 9
write(2, "failed to get the CORE resource "..., 37failed to get the CORE resource limit) = 37

strace по ulimit -c показал такой вариант:
prlimit64(0, RLIMIT_CORE, NULL, 0xbfd1b800) = -1 ENOSYS (Function not implemented)
ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
write(1, "unlimited\n", 10)  


Ну это ладно,
VERSIONS
       The prlimit() system call is available since Linux 2.6.36.  Library support is available since glibc 2.13.

getrlimit/setrlimit есть давно.

В итоге видим:
# grep RLIMIT_CORE zz1 | grep setr
[pid 22059] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
[pid 22071] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
[pid 22096] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
[pid 22096] setrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM_INFINITY}) = 0


В хост-системе вызов так же не поддерживается:
[root@azbyka ~]# prlimit 
prlimit: failed to get the AS resource limit: Функция не реализована


В исходном коде Apache и apr1 не удалось обнаружить выставления RLIMIT_CORE.
Comment 2 Vitaly Lipatov 2015-10-22 13:03:57 MSK
В suhosin параметр suhosin.coredump = On лишь организует SegFault при ошибке:

<------>/* dump core if wanted */
<------>if (SUHOSIN_G(coredump) && loglevel == S_MEMORY) {
<------><------>volatile unsigned int *x = 0;
<------><------>volatile int y = *x;
<------>}
Comment 3 Vitaly Lipatov 2015-10-22 14:50:47 MSK
Написал в рассылку devel@lists.altlinux.org
Comment 4 Vitaly Lipatov 2015-10-26 17:48:03 MSK
Получил правильный совет
https://lists.altlinux.org/pipermail/sysadmins/2014-June/036782.html

 и описал на wiki
https://www.altlinux.org/Apache2/Coredump
Comment 5 Vitaly Lipatov 2016-01-22 00:53:46 MSK
Групповое закрытие решённых.