CentOS 7 进阶指南:升级内核并开启 PSI(Pressure Stall Information)特性全记录
在进行容器化改造或高性能服务器调优时,Linux 的 PSI (Pressure Stall Information) 特性已成为监控 CPU、内存及 IO 资源压力程度的“金标准”。它可以告诉运维人员:系统由于资源短缺导致进程阻塞的具体比例,而不仅仅是 Load Average 这种模糊的指标。
然而,CentOS 7 默认搭载的 3.10 内核远早于 PSI 引入的 4.20 版本。为了让这台“老牌操作系统”焕发第二春,支持现代监控工具(如 Facebook 的 oomd 或新版 Prometheus Agent),我们必须手动升级内核并注入启动参数。
一、 核心前提:为什么是 5.x/6.x 内核?
PSI 特性在 Linux Kernel 4.20 中首次引入。虽然 4.x 版本已支持,但考虑到社区驱动支持、补丁安全性以及对容器(Docker/K8s)更佳的兼容性,推荐通过 ELRepo 仓库升级至 kernel-lt (Long Term Support) 版本(通常为 5.4+ 或更高)。
二、 实战步骤:从 3.10 跨越到 5.x
1. 检查当前环境
首先确认内核版本及 PSI 状态(默认肯定是不存在的):
uname -r
# 查看是否存在压力监测接口
ls /proc/pressure
如果输出 ls: cannot access /proc/pressure: No such file or directory,说明当前内核不支持。
2. 导入 ELRepo 仓库
ELRepo 是 CentOS 社区最权威的第三方内核维护源。
# 导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装 ELRepo (针对 CentOS 7)
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
3. 安装长期支持版内核 (kernel-lt)
# 安装 lt (Long Term) 版本,目前通常为 5.4.x 或更高
yum --enablerepo=elrepo-kernel install -y kernel-lt
4. 修改 GRUB2 引导顺序
安装完内核后,需要设置新内核为默认启动项。
# 查看所有可用内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# 通常新内核索引为 0,设置默认值
grub2-set-default 0
5. 注入 PSI 开启参数
这是最关键的一步。由于 PSI 默认在内核中编译但可能未激活,需通过内核启动参数显式开启。
编辑 /etc/default/grub 文件:
vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX 这一行,在末尾追加 psi=1。
修改前: GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root ..."
修改后: GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root ... psi=1"
6. 重新生成 GRUB 配置并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
三、 特性验证
重启后,确认内核版本并检查 /proc/pressure 目录:
uname -r
# 应当显示 5.x.x-el7...
ls /proc/pressure
# 应当看到:cpu io memory
尝试读取内存压力:
cat /proc/pressure/memory
输出如下代表成功:some avg10=0.00 avg60=0.00 avg300=0.00 total=0full avg10=0.00 avg60=0.00 avg300=0.00 total=0
四、 兼容性检查清单(避坑指南)
升级内核并非百利无一害,对于 CentOS 7 这种老系统,请务必对照以下清单:
| 检查项 | 潜在风险与说明 | 建议方案 |
|---|---|---|
| 第三方内核模块 | 专有的驱动(如 NVIDIA、旧版 Broadcom 网卡驱动)可能与新内核不匹配。 | 提前备份,并在测试机验证编译环境(devel 包)。 |
| 容器运行时 | 旧版 Docker(< 18.09)在 5.x 内核下可能存在 cgroup 挂载不兼容。 | 建议同步升级 Docker 至 CE 最新版。 |
| 文件系统 | XFS 在旧版 CentOS 上的某些 quota 特性在新内核下表现可能不一致。 | 生产环境建议先进行压力测试。 |
| 监控工具 | 某些基于特定内核 Header 编译的监控插件可能失效。 | 重新安装或编译对应内核版本的插件。 |
| Kdump | 随着内核变大,默认的 crashkernel=auto 可能导致 Kdump 无法启动。 |
手动分配固定大小,如 crashkernel=256M。 |
五、 总结
通过 ELRepo 升级内核并注入 psi=1,我们可以让 CentOS 7 获得与现代 Linux 发行版一致的观测能力。这不仅为排查系统“假死”提供了数据支撑,也为后续迁移到更先进的资源调度器打下了基础。
提示: 在生产环境操作前,请务必保留旧内核(不要直接 yum remove 旧内核),以便在出现驱动不兼容时通过 GRUB 菜单快速回滚。