angie未生成coredump文件
背景
最近使用angie测试某项功能时,发现其worker进程崩溃了。为了分析崩溃原因,尝试生成coredump文件,但一直未能成功。经过努力,问题最终得以解决,并记录了整个过程。
angie简介
Angie 是基于 Nginx 分支开发的 Web 服务器,旨在成为 Nginx 的直接替代方案。该项目由前 Nginx 核心开发团队主导开发,致力于在保持 Nginx 优势的同时,进一步扩展和增强其功能特性。
环境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
$ /opt/angie/sbin/angie -v
Angie version: Angie/1.10.0
准备工作
设置coredump路径以及格式
$ sudo sh -c 'echo "/var/core/core-%e-%p-%t" > /proc/sys/kernel/core_pattern'$ sudo mkdir /var/core
$ sudo chmod 777 /var/core
开启coredump
$ ulimit -c unlimited
结果
当再次崩溃时,并未在/var/core目录下生成coredump文件
而且
- 目标目录/var/core权限正常
- 系统coredump已经开启
简单测试
$ echo -e '#include <stdio.h>\nint main(){*(int*)0=0;return 0;}' > test.c
$ gcc test.c -o test
$ ./test
段错误 (核心已转储)
$ ls /var/core/
core-test-274547-1760058337
说明系统能正常生成coredump文件,配置正常。
解决
只能是angie自身问题,查询得知angie本身也有coredump相关配置项
worker_rlimit_core 1000m;
增加此项后,最终生成coredump文件
$ ls /var/core/
core-angie-18048-1759988306
源码分析
配置项:
src/core/nginx.c
static ngx_command_t ngx_core_commands[] = {
...{ ngx_string("worker_rlimit_core"),NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,ngx_conf_set_off_slot,0,offsetof(ngx_core_conf_t, rlimit_core),NULL },
...
};
初始值:
static void *
ngx_core_module_create_conf(ngx_cycle_t *cycle)
{ngx_core_conf_t *ccf;ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t));if (ccf == NULL) {return NULL;}...ccf->rlimit_core = NGX_CONF_UNSET; ...
设置coredump:
src/os/unix/ngx_process_cycle.c
static void
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
{...if (ccf->rlimit_core != NGX_CONF_UNSET) {rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;rlmt.rlim_max = (rlim_t) ccf->rlimit_core;if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,"setrlimit(RLIMIT_CORE, %O) failed",ccf->rlimit_core);}} ...
}
从源码实现可以看出,默认未配置worker_rlimit_core
参数时,不会设置core限制,则此时默认值是从master中继承而来。
而master则是从系统中获取到的。
在当前终端执行了ulimit -c unlimited
后,再启动的angie,按理说angie从当前终端能继承到core unlimited的设置,
但是从结果来看
$ ps aux | grep angie
root 275105 0.0 0.0 17512 4352 pts/1 S+ 09:27 0:00 sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf
root 275106 0.0 0.0 17512 2096 pts/2 Ss 09:27 0:00 sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf
root 275107 0.0 0.0 10524 5376 pts/2 S+ 09:27 0:00 angie: master process v1.10.0 #1 [/opt/angie/sbin/angie -c /etc/angie/angie.conf]
root 275194 0.0 0.4 37980 30220 pts/2 S+ 09:27 0:00 angie: worker process #1
$ cat /proc/275194/limits
Limit Soft Limit Hard Limit Units
...
Max core file size 0 0 bytes
...$ cat /proc/275107/limits
Limit Soft Limit Hard Limit Units
...
Max core file size 0 0 bytes
...$ cat /proc/275106/limits
Limit Soft Limit Hard Limit Units
...
Max core file size 0 unlimited bytes
...$ cat /proc/275105/limits
Limit Soft Limit Hard Limit Units
...
Max core file size 0 unlimited bytes
...
从进程中的limit可以看到soft limit为0,因此最终进程并不会产生coredump文件。
根据执行的命令行sudo /opt/angie/sbin/angie -c /etc/angie/angie.conf
看到,命令是 通过sudo
进行启动的angie, 此时sudo已经切换到root权限,没有继承当前终端会话中的设置。
尝试切换到root后,设置ulimit -c unlimited
同时不配置worker_rlimit_core
$ su root
# ulimit -c
0
# ulimit -c unlimited
# /opt/angie/sbin/angie -c /etc/angie/angie.conf
$ head /etc/angie/angie.conf
#user angie;
user root;
#worker_processes auto;
worker_processes 1;
worker_rlimit_nofile 65536;
#worker_rlimit_core 1000m;$ ps aux | grep angie
root 275802 0.0 0.0 10520 5376 pts/1 S+ 10:01 0:00 angie: master process v1.10.0 #1 [/opt/angie/sbin/angie -c /etc/angie/angie.conf]
root 275803 0.0 0.4 37976 30216 pts/1 S+ 10:01 0:00 angie: worker process #1$ cat /proc/275803/limits
Limit Soft Limit Hard Limit Units
...
Max core file size unlimited unlimited bytes
...
手动触发崩溃
$ ls /var/core/$ sudo kill -11 275803$ ls /var/core/
core-angie-275803-1760061907
结果能生成coredump文件
总结
- 未配置
worker_rlimit_core
时,angie是否产生core文件依赖master从当前环境中继承到的设置 - 当使用sudo时,会切换到root,此时不会继承之前用户终端会话中core的设置