很多运维工程师第一次接触CentOS7时,都会被它默认的3.10内核版本震惊到——这个2013年发布的内核版本,放在2023年确实有些"古董"了。我在管理生产服务器时就遇到过这样的尴尬:新买的NVMe固态硬盘因为内核太老无法发挥全部性能,Docker容器跑起来也总是出现各种兼容性问题。
升级内核最直接的三大好处是:
不过要特别注意,生产环境升级内核需要谨慎。我建议遵循"三不原则":不影响业务时段操作、不删除旧内核、不跳过测试环节。记得有次我在电商大促前贸然升级内核,结果新内核的TCP堆栈和负载均衡器不兼容,差点酿成事故。
CentOS7默认的yum源现在已经找不到内核升级包了,这是很多新手遇到的第一个坑。执行yum list kernel只会看到3.10的老版本。阿里云镜像曾经是个不错的替代方案,但现在也移除了相关包。经过多次测试,目前最稳定的方案是使用ELRepo源。
bash复制# 导入ELRepo公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装ELRepo源
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
ELRepo提供两种内核版本:
给个直观对比表:
| 版本类型 | 更新频率 | 稳定性 | 支持周期 | 适用场景 |
|---|---|---|---|---|
| kernel-ml | 每周更新 | 较低 | 短期 | 开发测试环境 |
| kernel-lt | 数月更新 | 高 | 5年+ | 生产环境 |
我强烈建议生产服务器选择kernel-lt。曾经有团队贪新用了kernel-ml,结果遇到一个导致Kafka崩溃的调度器bug,不得不半夜回滚。
先查看当前内核信息:
bash复制uname -r # 查看当前内核版本
rpm -qa | grep kernel # 查看已安装内核包
df -h # 检查/boot分区空间
重点注意/boot分区空间——很多云服务器的/boot只有200MB,安装3个内核就会爆满。如果空间不足,需要先清理旧内核:
bash复制package-cleanup --oldkernels --count=2
安装长期支持版内核(以5.4为例):
bash复制yum --enablerepo=elrepo-kernel install kernel-lt -y
安装完成后别急着重启!先确认新内核是否安装成功:
bash复制rpm -qa | grep kernel-lt
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
我遇到过一个奇葩情况:yum显示安装成功,但实际文件没写入磁盘。所以一定要双重验证,特别是自动化脚本中。
查看当前启动项顺序:
bash复制grub2-editenv list
设置新内核为默认启动:
bash复制grub2-set-default 0 # 0代表第一个菜单项
grub2-mkconfig -o /boot/grub2/grub.cfg
这里有个隐藏坑点:某些云平台(比如AWS)使用自定义GRUB配置,直接修改可能不生效。这时需要检查/etc/default/grub文件,确保GRUB_DEFAULT=saved。
建议在GRUB菜单保留至少两个旧内核。当新内核启动失败时,在启动界面按"e"键可以临时编辑启动参数,在"linux16"行末尾添加systemd.unit=rescue.target进入救援模式。
我曾经处理过一个典型故障:新内核无法识别RAID卡。通过救援模式挂载磁盘,然后修改/etc/default/grub中的GRUB_DEFAULT指向旧内核编号(比如"1>2"表示第二个子菜单的第三项),最终成功恢复系统。
重启进入新内核后,建议进行以下测试:
bash复制uname -r # 确认内核版本
dmesg | grep error # 检查内核日志错误
systemctl --failed # 查看失败服务
iperf3 -s & iperf3 -c localhost # 网络性能测试
建议用sysstat工具采集升级前后的性能对比:
bash复制# 升级前
sar -u -r -n DEV 1 60 > before.log
# 升级后
sar -u -r -n DEV 1 60 > after.log
重点关注:
某次升级后我们发现kswapd进程CPU占用飙升,排查发现是新内核的zswap配置需要调整。这种问题只有长期监控才能发现。
新内核通常需要调整参数才能发挥最佳性能。这是我的生产环境常用配置(/etc/sysctl.conf):
conf复制# 网络优化
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fastopen = 3
# 内存管理
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
修改后执行sysctl -p生效。注意不同业务场景需要不同优化方案,数据库服务器和Web服务器的优化重点就完全不同。