用 dmesg 提升 CentOS 稳定性的实操方案
一 建立可观测性基线
- 持续采集内核日志并落盘,便于回溯与告警:
- 实时查看与过滤:使用 dmesg 的常用选项,如 dmesg -T(可读时间)、-l err,warn(仅错误与告警)、-w(实时跟踪)、-H(人性化时间),必要时用 -s 增大缓冲区,避免关键日志被覆盖。
- 与 systemd 对齐时间线:用 journalctl -k -b -0 查看本次启动的内核日志,与 dmesg -T 输出交叉验证,快速定位硬件、驱动、文件系统与内核异常。
- 持久化与归档:将关键时段的内核日志定期导出并纳入变更工单与巡检报告,例如:dmesg -T > dmesg-$(date +%F).log,便于审计与复盘。
二 关键问题快速定位与处置
-
连接跟踪表满导致丢包
- 典型现象:dmesg 或 /var/log/messages 出现 “nf_conntrack: table full, dropping packet”。这表示 netfilter 连接跟踪表(nf_conntrack)耗尽,新连接被无差别丢弃,表现为随机超时与访问失败。
- 快速诊断:
- 查看当前使用与上限:sysctl net.netfilter.nf_conntrack_count;cat /proc/net/nf_conntrack | wc -l;sysctl net.netfilter.nf_conntrack_max
- 检查哈希桶与默认配置:dmesg | grep conntrack(可见类似 “16384 buckets, 65536 max”)
- 稳妥处置(示例值,需结合业务压测微调):
- 提升上限与桶数:net.netfilter.nf_conntrack_max = 524288;net.netfilter.nf_conntrack_buckets = 131072
- 加速回收长连接:net.netfilter.nf_conntrack_tcp_timeout_established = 1200
- 应用侧优化:缩短长连接空闲、启用连接复用、减少短连接风暴,必要时拆分公网/内网连接域以减小单表压力。
-
存储 I/O 调度器不当引发抖动
- 现象:I/O 高峰时延迟抖动、吞吐不稳,dmesg 可见设备超时或重置类告警(视驱动而定)。
- 选择与调整:
- SSD/NVMe:noop 或 deadline;机械盘或数据库负载:deadline
- 临时调整:echo deadline > /sys/block/sdX/queue/scheduler
- 永久调整:在 CentOS 7 使用 grubby 将 elevator=deadline 写入内核启动参数,重启后生效。
-
内核崩溃无现场
- 风险:Panic/Oops 后仅见 “Kernel panic - not syncing”,缺少崩溃上下文,难以根因分析。
- 改进措施:启用 pstore/ramoops 持久化内核崩溃日志
- 检查支持:grep CONFIG_PSTORE_RAM /boot/config-$(uname -r)(返回 m/y 表示支持)
- 预留内存与参数示例(示例地址需落在 E820 的 Usable 区域,且按 4KB 对齐,大小取 2 的幂):
- GRUB_CMDLINE_LINUX 增加:crashkernel=256M pstore.backend=ramoops ramoops.mem_size=0x200000 ramoops.mem_address=0x100000000 ramoops.dump_oops=1 memmap=2M@0x100000000
- 设置故障保留时间:echo 10 > /proc/sys/kernel/panic(宕机后保留 10 秒便于完成持久化转储)
- 开机加载模块:echo ramoops > /etc/modules-load.d/ramoops.conf;必要时重建 initramfs(dracut -f -)
- 重启后检查:ls /sys/fs/pstore;崩溃后可在该目录获取 dmesg-ramoops 等文件用于离线分析。
三 稳定性加固与日常巡检清单
- 内核日志与系统日志协同
- 统一采集与轮转:在生产环境建议将内核日志通过 rsyslog 可靠转发(优先 TCP),并配置异步队列、压缩与保留策略,避免日志洪峰拖垮系统或丢失关键证据。
- 控制日志体量:对 journald 设置上限(如 SystemMaxUse=1G),定期执行 journalctl --vacuum-time=7d 或 --vacuum-size=500M,防止 /var 分区被撑满引发稳定性问题。
- 巡检命令模板(建议纳入定时巡检与变更前后对比)
- 当日内核告警:dmesg -T -l err,warn | tail -n 50
- 本次启动内核日志:journalctl -k -b -0 -e
- 连接跟踪健康度:{ echo “count=$(sysctl -n net.netfilter.nf_conntrack_count) max=$(sysctl -n net.netfilter.nf_conntrack_max)”; dmesg | grep -i conntrack; } | tee conntrack-$(date +%F).log
- I/O 调度器核对:for d in /sys/block/sd?; do echo “$d: $(cat $d/queue/scheduler)”; done
- 崩溃现场留存:ls -l /sys/fs/pstore;如有新文件,立即归档并分析。
四 注意事项与风险提示
- 调整内核参数前务必在测试环境验证,逐步变更并保留回滚方案;对 nf_conntrack、I/O 调度器等参数的改动可能引发连接中断、性能退化或调度策略不匹配等副作用。
- 修改 GRUB 启动参数与 crashkernel 会影响内存布局与重启行为,操作前确认机型、内存映射与业务窗口,变更后第一时间校验 /sys/fs/pstore 与内核日志可用性。
- 生产环境建议将 dmesg 输出纳入集中化日志平台,结合告警规则(如 Oops、nf_conntrack table full、I/O timeout)实现近实时通知与根因定位闭环。