一、修改程序生成core dump的几种方法

  1. 临时修改进程prlimit --core=unlimited -p $PID

  2. ulimit -c unlimited

  3. 编辑 /etc/security/limits.conf 文件,设置 tidb 用户 core file size soft 和 hard limit 为 unlimited。

 $ sudo vi /etc/security/limits.conf
tidb        soft        core          unlimited
tidb        hard        core          unlimited

如果希望对所有用户生效,tidb 替换为 * 即可。

$ sudo vi /etc/security/limits.conf
*        soft        core          unlimited
*        hard        core          unlimited

退出当前用户登录,再重新登录,你会发现,core dump 已经开启。

$ exit
~ ssh tidb@172.16.10.72
$ ulimit -c
unlimited
$ cat /proc/11352/limits
Limit                     Soft Limit           Hard Limit           Units
Max core file size        unlimited            unlimited            bytes

二、systemd服务开启core dump

2.1 如何产生core dump

  1. 在keepalived.service文件中加入LimitCORE=infinity
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target

[Service]
Type=forking
LimitCORE=infinity
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/koal/keepalived/etc/sysconfig/keepalived
ExecStart=/koal/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

然后重启systemd和keepalived服务

sudo systemctl daemon-reload
sudo systemctl restart tikv-20160.service
  1. 进行全局设置
    如果希望对系统 systemd service 全局设置,可修改 /etc/systemd/system.conf 文件。
sudo vi /etc/systemd/system.conf

[Manager]
DefaultLimitCORE=infinity

不过该操作生效重启系统。测试中发现执行以下命令也可以让 systemd 加载最新配置,不过官方文档说明该命令很少用,主要在 debugging 和 package upgrades 时使用。

sudo systemctl daemon-reexec

2.2 生成core文件的位置和名称

  1. 默认生成core dump文件名为core,并且会被新的core文件覆盖
    修改此系统配置生成core.PID的形式:
echo 1 > /proc/sys/kernel/core_uses_pid
sysctl -w kernel.core_uses_pid=1
  1. 修改/proc/sys/kernel/core_pattern定义的core文件名称和路径
%% - A single % character.
%c - Core file size soft resource limit of crashing process
     (since Linux 2.6.24).
%e - insert coredumping executable name into filename 添加导致产生core的命令名
%E - Pathname of executable, with slashes ('/') replaced by
               exclamation marks ('!') (since Linux 3.0).
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%p - insert pid into filename 添加pid(进程id)
%u - insert current uid into filename 添加当前uid(用户id)
%g - insert current gid into filename 添加当前gid(用户组id)
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名

当以|字符开头时,允许将core文件通过管道报告给脚本,ubuntu默认的core_pattern形式就是报告给report程序:

cat /proc/sys/kernel/core_pattern 
|/usr/share/apport/apport %p %s %c %d %P %E

可以做出以下修改:

sysctl -w kernel.core_pattern=/root/core/core-%e-%s

参考

  1. core(5) — Linux manual page
  2. systemd service 如何开启 core dump
  3. Linux生成core文件、core文件路径设置
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐