centos中vmcore的生成过程窥探以及优化
Posted 程序猿Ricky的日常干货
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
以上是关于centos中vmcore的生成过程窥探以及优化的主要内容,如果未能解决你的问题,请参考以下文章