【发布时间】:2020-05-13 13:28:25
【问题描述】:
当 PHP 以 WARNING: [pool www] child 2756 exited on signal 11 (SIGSEGV) after 153.518521 seconds from start 失败时,我正在尝试生成核心转储。
我正在使用托管在 ECS 上的基于 Alpine 的自定义 Docker 容器。
我遵循了多个指南,但 PHP-FPM 不生成核心转储(我可以使用 php cli 或 kill -s SIGSEGV $$ 生成核心转储)。我遵循的指南:
-https://ma.ttias.be/generate-php-core-dumps-segfaults-php-fpm/https://www.bggofurther.com/2015/04/generating-core-dumps-for-php-fpm/
- Core dump file is not generated
我的配置如下:
/ # ulimit -c
unlimited
/ # cat /proc/sys/kernel/core_pattern
/tmp/core-dumps/core-%t-%p
/ # cat /proc/sys/kernel/core_uses_pid
0
/ # php-fpm -tt
[global]
pid = undefined
error_log = /proc/self/fd/2
syslog.ident = php-fpm
syslog.facility = 24
log_buffering = yes
log_level = unknown value
log_limit = 8192
emergency_restart_interval = 0s
emergency_restart_threshold = 0
process_control_timeout = 0s
process.max = 0
process.priority = undefined
daemonize = no
rlimit_files = 0
rlimit_core = 0
events.mechanism = epoll
[www]
prefix = undefined
user = www-data
group = www-data
listen = 9000
listen.backlog = 511
listen.owner = undefined
listen.group = undefined
listen.mode = undefined
listen.allowed_clients = undefined
process.priority = undefined
process.dumpable = no
pm = dynamic
pm.max_children = 35
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 8
pm.process_idle_timeout = 10
pm.max_requests = 500
pm.status_path = /_/php-fpm/status
ping.path = undefined
ping.response = undefined
access.log = /proc/self/fd/2
access.format = [%{%Y-%m-%dT%H:%M:%S%z}t] %R "%m %{REQUEST_SCHEME}e://%{HTTP_HOST}e%{REQUEST_URI}e" %s %f %{mili}d %{kilo}M %C%%
slowlog = undefined
request_slowlog_timeout = 0s
request_slowlog_trace_depth = 20
request_terminate_timeout = 0s
request_terminate_timeout_track_finished = no
rlimit_files = 0
rlimit_core = unlimited
chroot = undefined
chdir = undefined
catch_workers_output = yes
decorate_workers_output = no
clear_env = no
security.limit_extensions = .php .phar
configuration file /usr/local/etc/php-fpm.conf test is successful
我尝试使用/proc/sys/kernel/core_uses_pid 到1 和process.dumpable = yes,但仍然没有生成核心转储。
我想 PHP-FPM 配置存在问题,因为当我在 cli 中执行脚本时(我的意思是像 php generate_sigsegv.php),核心转储生成良好。但是,我不知道为什么会出错。
对于 CLI,我使用这个脚本:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
对于 PHP-FPM,我正在调查我的应用程序中的一个错误,因此我有一个 API 可以调用以生成 SIGSEGV。
【问题讨论】:
-
由于核心转储是由内核生成的,因此需要在主机而不是容器中启用它们。 stackoverflow.com/q/28335614/1216776
-
感谢您的回答。在我的容器中为任何进程(cli、shell 中的 php)很好地生成了核心转储,问题仅在于 PHP-FPM。所以我想我的主机配置没问题。
-
所以 PHP-FPM 一定是困住了他们。你可以用 strace 或 gdb 运行吗?
-
这里是 strace 详细信息:pastebin.com/vf793W33
-
@stark 你有提示为什么我的配置无法创建核心转储吗?提前致谢!
标签: php linux segmentation-fault