共计 3301 个字符,预计需要花费 9 分钟才能阅读完成。
Kdump 的工作机制是在内核崩溃时, 通过 kexec 工具由 BIOS 启动一个备用内核, 由备用内核执行一系列任务, 保存内存中崩溃内核的状态, 供后续故障分析用。
本文默认 AMD 或 INTEL X86_64 架构, RHEL7 系统环境.
Kdump 是 RHEL7 中自带的内核管理工具. 在 RHEL7.1 之前的版本,kdump 作为安装完成之后的可选组件自动安装, 从 RHEL7.1 开始 kdump 被植入安装界面, 作为系统基础工具供安装选择.
可以通过下面命令直接 RPM 包安装.
yum -y install kexec-tools
rpm -q kexec-tools
同时,Kdump 还配备了图形化管理工具, 可以通过下面命令安装.
yum -y install system-config-kdump
对于 RHEL7.4 及之后的版本,kdump 支持 INTEL IOMMU. 而不支持 RHEL7.3 及之前的版本.
kdump 能监控系统内核运行状态, 其地位比较特殊. kdump 的内存空间是在系统启动时, 由引导程序分配的, 相对于系统内核,kdump 内存是一个独立的空间.
可以通过如下命令指定 kdump 的内存空间大小.
crashkernel=128M #为 kdump 保留 128M 的内存空间.
crashkernel 的值可以设置成“auto”, 在一些拥有较大内存的系统中, 利于实现 Kdump 的自动化管理.
crashkernel=auto
当然,crashkernel 的值还可以通过如下形式实现更灵活的配置.
crashkernel=:, :
crashkernel=512M-2G:64M,2G-:128M #当系统内存在 512M-2G 之间时, 为 Kdump 保留 64M 的内存空间; 当系统内存大于 2G 时, 为 Kdump 保留 128M 的内存空间.
还可以这样:
crashkernel=128M@16M #为 Kdump 保留 128M 的内存空间, 内存地址从 16M(physical address 0x01000000) 开始.
Kdump 的配置在 /etc/kdump.cnf 中. kdump 提供多种方式将捕获到内核崩溃数据本地保存或保存到远程主机.
#path /var/crash #kdump 本地存储目录, 默认是存放在 /var/crash 目录下, 可以根据使用习惯设置.
path /usr/local/cores
...
#raw /dev/vg/lv_kdump #kdump 可以直接写入移动介质.
raw /dev/sdb1
...
#nfs my.server.com:/export/tmp #kdump 可以通过 NFS 保存到网络上其它存储设备中.
nfs test.example.com:/export/cores
...
#ssh user@my.server.com #kdump 可以通过 SSH 传输协议, 保存远程主机上.
#sshkey /root/.ssh/kdump_id_rsa
ssh user@test.example.com
sshkey /root/.ssh/mykey
kdump.conf 中还可以在 core_collector makedumpfile 选项后加上 ” -c “, 使 kdump 文件能够被压缩, 以节省存储空间.
core_collector makedumpfile -c
systemctl start kdump.service #启动 Kdump 服务
systemctl enable kdump.service #使 Kdump 开机自启
systemctl is-active kdump #检查 Kdump 是否已启动
active
echo 1 > /proc/sys/kernel/sysrq #模拟内核崩溃, 检查 /var/crash/ 是否自动保存 Kdump 捕获的内核崩溃数据, 以确定 Kdump 是否正常工作
echo c > /proc/sysrq-trigger
需要注意的是
(1) 在 RHEL7 之前的版本中,kdump 的存储目录会随着 kdump 服务的启动而由系统自动创建. RHEL7 中, 如果改变了 kdump 的存储目录, 则必须在启动 kdump 服务之前, 手动创建 kdump 的存储目录, 否则 kdump 服务会启动失败.
(2) 如果在安装界面禁用了 kdump, 而安装完成之后再通过 systemctl start kdump 启动 kdump, 会报内存不足无法启动的错误. kdump 的内存空间是在内核加载之前由 boot 分配的, 所以必须修改 boot. 最好使用 kdump 的图形管理工具 system-config-kdump 加载 kdump 的默认配置, 使 kdump 处于可用状态, 然后重启系统, systemctl status kdump 服务处于激活状态 (active).
利用 crash 功能组件能够分析 linux 内核崩溃时的网络、磁盘、CPU、系统内核状态, 快速定位故障点.
crash 组件可以通过 RPM 包安装
sudo yum -y install crash #安装 crash
sudo debuginfo-install kernel #安装内核调试模块
sudo crash /usr/lib/debug/lib/modules//vmlinux /var/crash//vmcore #启动 crash 调试
测试一下:
crash 基本调试命令:
crash>log #崩溃时日志记录
crash>bt #崩溃时的堆栈信息
crash>vm #崩溃时的内存状态
crash>ps #崩溃时的进程状态
crash>files #崩溃时的打开的文件
crash>exit #退出 crash
RHEL7 中提供三种内核调校方法:
(1) 使用 sysctl 命令;
(2) 修改 /etc/sysctl.d/ 目录下的内核配置文件;
(3) 通过 shell 在 /proc/sys 目录下挂载虚拟文件系统;
可以列出、读取、设置内核参数, 还可以将参数设置为临时或永久.
sysctl -a #列出所有可调校的项
sysctl kernel.version #列出 kernel 的版本信息
sysctl . = #使调校参数临时生效
sysctl -W . = #使调校参数永久生效
修改 /etc/sysctl.d/99-sysctl.conf 目录下的 99-sysctl.conf 文件
cp /etc/sysctl.d/99-sysctl.conf /etc/sysctl.d/99-sysctl.conf.bak #备份系统默认的内核参数文件
vim /etc/sysctl.d/99-my.conf #创建新的内核参数文件
...
. = #写入要调校的参数类和值
. =
...
save #保存文件
reboot\ sysctl -p /etc/sysctl.d/99-my.conf #重启系统或者使用 sysctl -p 命令载入新的内核参数配置
(1) 调整最大请求的 aio 数量.
sysctl -a | grep fs.aio #查看内核默认的最大 aio 值
sysctl fs.aio-max-nr=2048576 #临时调整 aio 最大值
(2) 开启本地 ipv4 转发功能.
sysctl net.ipv4.ip_forward = 1
(3) 设定进程能被分配到的最大内存空间.
sysctl vm.max_map_count = 65530
(4) 设定系统中同时运行的最大进程数.
sysctl kernel.threads-max = 16161
在 root 权限下, 通过 sysctl 命令的内核参数调校, 基本上能直接控制 linux 的内核所有行为, 满足实际生产中的绝大多数需求.