image内核转储(coredump)保存了进程某一时刻的运行状态,它在进程发生问题时产生,此时只要有程序的可执行文件和 coredump 即可对其进行调试,了解产生 coredump 那一刻进程的状态,从而发现问题点。
某些情况下我们也可以主动来获取 coredump,比如进程发生死锁卡住的情况,这时我们可以使用 kill 命令来触发 coredump 的生成,或使用 gcore 命令,该命令则无需停止正在运行的进程。
> gcore [-o filename] pid
开启内核转储
- 1、查看当前内核转储功能是否生效
> **$ ulimit -c**
如果结果为 0 则表示内核转储无效
- 2、开启内核转储
> **$ ulimit -c unlimited**
unlimited 表示不限制 coredump 文件的大小,如果进程会消耗大量的内存,则文件会很大对系统和磁盘造成压力
限制 coredump 文件的大小为 1GB
> $ ulimit -c 1073741824
- 设置内核转储的生成路径
默认情况下 coredump 生成在进程的当前目录下,有时为了方便我们会将 coredump 生成到指定的目录,如外置 U 盘等。
内核系统变量 kernel.core_pattern 控制这一点。
查看 kernel.core_pattern 设置
> $ cat /proc/sys/kernel/core_pattern
设置 kernel.core_pattern
> $ echo "/var/%t-%e-%p.core" > /proc/sys/kernel/core_pattern
>
> $ echo "0" > /proc/sys/kernel/core_uses_pid
或
> $ sysctl -w kernel.core_pattern="/var/%t-%e-%p.core"
>
> $ sysctl -w kernel.core_uses_pid="0"
其中 %t %e %p 为格式符
%t — 转储时刻(从 1970 年 1 月 1 日 0:00 开始的秒数)
%e — 可执行文件名
%p — 进程 PID
其中 kernel.core_uses_pid 的设置意为是否需要在文件名末尾添加 .PID,为 1 表示添加,为 0 表示不添加
- 4.使用用户程序自动压缩转储文件
为了减轻磁盘的压力通常对 coredump 进行压缩,可在 kernel.core_pattern 中使用管道符来启动用户程序来实现这一点。
> $ echo "|/usr/local/sbin/core_helper %t %e %p" > /proc/sys/kernel/core_pattern
其中 core_helper 即为我们的用户程序如下:
> #!/bin/sh
>
> exec gizp -> /var/core/$1-$2-$3.core.gz
了解更多请参考如下链接:
网友评论