centos中vmcore的生成过程窥探以及优化

vmcore生成的机制

对于centos系统,如果要配置机器宕机后自动生成vmcore,应该很多人知道,需要借助于kdump服务。因此想要了解系统如何生成vmcore的,就需要从这个服务开始,首先直接查看一下该服务的运行状态:

systemctl status kdump
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2021-11-12 15:50:38 CST; 4 months 3 days ago
 Main PID: 1239 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 49524)
   Memory: 0B
   CGroup: /system.slice/kdump.service

Nov 12 15:50:36 VM-7-4-centos systemd[1]: Starting Crash recovery kernel arming...
Nov 12 15:50:38 VM-7-4-centos kdumpctl[1239]: kdump: kexec: loaded kdump kernel
Nov 12 15:50:38 VM-7-4-centos kdumpctl[1239]: kdump: Starting kdump: [OK]
Nov 12 15:50:38 VM-7-4-centos systemd[1]: Started Crash recovery kernel arming.

这里会展示kdump服务相关的systemd配置文件,也就是上面的:
/usr/lib/systemd/system/kdump.service

[Unit]
Description=Crash recovery kernel arming
After=network.target network-online.target remote-fs.target basic.target
DefaultDependencies=no
ConditionKernelCommandLine=crashkernel

[Service]
Type=oneshot
ExecStart=/usr/bin/kdumpctl start
ExecStop=/usr/bin/kdumpctl stop
ExecReload=/usr/bin/kdumpctl reload
RemainAfterExit=yes
StartLimitInterval=0

[Install]                                                                                                           
WantedBy=multi-user.target

在该文件中展示了,启动该服务、关闭该服务以及重启该服务所使用的命令,都是通过调用kdumpctl这个工具来实现的。这个工具是使用shell编写的,其中的main函数通过检测当前环境中是否存在/proc/vmcore文件来判断当前运行环境是正常启动环境还是kdump环境,如果是正常环境,那么需要先把kdump kernel image使用kexec -p加载到内存,如果当前是kdump环境,那么执行save core的动作。
(1)正常系统下启动kdump服务,会rebuild kdump initrd以及加载kdump kernel:

$KEXEC $KEXEC_ARGS $standard_kexec_args \
          --command-line="$KDUMP_COMMANDLINE" \
          --initrd=$TARGET_INITRD $kdump_kernel

(2)kdump内核启动后会执行vmcore的收集动作

cp --sparse=always /proc/vmcore $coredir/vmcore-incomplete
mv $coredir/vmcore-incomplete $coredir/vmcore

如何减小生成vmcore的size

前面介绍了默认系统生成vmcore的方法就是通过cp拷贝来生成的,只不过会把内存中连续为0的块给过滤掉,来减小vmcore的大小。但是这还是远远不够的,因为在数据中心使用场景下,一个服务器的内存最大可能超过100G,即使去除了全为0的数据块,依然会很大。那么这里就来讨论下如何进一步压缩vmcore的大小。
除了使用cp来生成vmcore,实际上Linux操作系统还提供了另外一个makedumpfile工具来生成vmcore,这个工具可以有选择性的dump内存中的数据,比如是否保留用户态进程空间数据、是否保留free page、是否保留zero page、以及是否保留缓存数据等等。除此之外该工具还能通过压缩算法对vmcore进行压缩,来进一步减小vmcore的大小。
我们可以通过修改kdumpctl工具中的代码,把vmcore生成的方法改为:

makedumpfile -c -d 31  /proc/vmcore dumpfile

其中的选项解释:

-c/-l/-p Compress dump data by each page using zlib for -c option, lzo for -l option or snappy for -p option.
-d  dump_level
dump_level consists of five bits, so there are five base levels to specify the type of unnecessary page.
                    1 : Exclude the pages filled with zero.
                    2 : Exclude the non-private cache pages.
                    4 : Exclude all cache pages.
                    8 : Exclude the user process data pages.
                   16 : Exclude the free pages.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值