利用 dmesg 日志定位并优化 CentOS 存储性能
一、快速定位思路与关键命令
- 用 dmesg 快速筛查存储相关异常与硬件告警,配合系统观测工具形成闭环:
- 实时查看内核日志并高亮错误/警告:dmesg -T -l err,warn -w
- 检查 I/O 错误与设备重置:dmesg | egrep -i “I/O error|reset|timeout|aborted command”
- 关联性能症状:iostat -x 1(关注 %util、await、svctm、r/s、w/s),vmstat 1(关注 wa、si/so),uptime(关注 load average 与 CPU wa)
- 若怀疑文件系统损坏:dmesg | grep -i “EXT4-fs error|EXT4-fs (recover)”;必要时安排停机做 fsck
- 注意 dmesg -T 的时间在挂起/恢复后可能不准,需与系统时间校准后再做判断
二、常见 dmesg 线索与优化动作
| 线索关键词 |
可能问题 |
优化动作 |
| I/O error / reset / aborted command / timeout |
磁盘/控制器/线缆/背板故障或链路不稳 |
更换数据线/背板/控制器;升级固件;检查电源与散热;必要时迁移数据并更换盘 |
| EXT4-fs error / deleted inode referenced |
文件系统不一致或介质错误 |
立即备份关键数据;安排停机执行 fsck;考虑更换磁盘并重做阵列 |
| NMI / PCIe error / Correctable/Non-Fatal |
硬件故障或降频保护 |
收集硬件日志(BMC/iDRAC/RAID);更换可疑硬件;更新驱动/固件 |
| EDAC MC0: CE/UE |
内存 ECC 可纠正/不可纠正错误 |
检查内存条与插槽;更新 BIOS/微码;若为 UE 触发过,建议更换内存 |
| blk_update_request: I/O error / device offline |
设备离线或掉盘 |
检查阵列状态与物理连接;重建阵列或替换磁盘;验证 multipath/多路径 |
| TCP: Possible SYN flooding |
存储前端(如 iSCSI/NFS)过载导致连接丢弃 |
限流与队列调优;优化客户端并发;扩容前端或后端带宽 |
| Out of memory / killed process |
内存不足引发 swap 与 I/O 抖动 |
降低内存压力(优化应用/缓存策略);合理设置 vm.swappiness;必要时扩容内存 |
| 上述线索与动作可显著缩短定位时间,并直接指向存储性能问题的根因与修复路径 |
|
|
三、从日志到优化的闭环流程
- 步骤 1(发现异常):dmesg -T -l err,warn | tail -n 200 发现 I/O 错误/文件系统报错/设备重置等
- 步骤 2(量化影响):iostat -x 1 观察 %util 是否长期接近 100%、await 是否显著升高;vmstat 1 观察 wa 是否偏高
- 步骤 3(定位对象):确认是单盘、单路径、单控制器还是整阵列瓶颈;必要时用 lsscsi、multipath -ll、lsblk、cat /proc/partitions 辅助
- 步骤 4(处置与验证):
- 硬件/链路问题:更换部件、固件升级、调整布线/背板、重建阵列
- 文件系统问题:备份后 fsck,必要时迁移至健康磁盘
- 负载/配置问题:优化应用 I/O 模式、分离日志与数据盘、调整队列/缓存策略
- 步骤 5(复盘预防):固化监控告警(对 dmesg 关键字与 iostat 阈值)、保留崩溃现场(见下节)、建立变更前后性能基线
四、保留崩溃现场用于深度分析
- 在 CentOS 7 上启用 pstore/ramoops 持久化内核日志,便于分析导致性能骤降或掉盘的 Panic/Oops:
- 检查支持:grep CONFIG_PSTORE_RAM /boot/config-$(uname -r)
- 配置内核参数(示例):
- GRUB_CMDLINE_LINUX 增加:pstore.backend=ramoops ramoops.mem_size=0x200000 ramoops.mem_address=0x100000000 ramoops.dump_oops=1 memmap=2M@0x100000000
- 选择物理连续内存、按 4KB 对齐、大小为 2 的幂;更新 GRUB 配置(区分 UEFI/BIOS)
- 设置暂不自动重启:echo 10 > /proc/sys/kernel/panic;开机加载模块:echo ramoops > /etc/modules-load.d/ramoops.conf
- 崩溃后日志会挂载于 /sys/fs/pstore,请及时拷贝分析
五、实用命令清单与阈值参考
- 快速巡检(建议纳入巡检脚本):
- dmesg -T -l err,warn | tail -n 200
- dmesg | egrep -i “I/O error|reset|timeout|aborted command”
- dmesg | grep -i “EXT4-fs error”
- iostat -x 1 5(关注 %util、await、svctm)
- vmstat 1 5(关注 wa、si、so)
- uptime;mpstat -P ALL 1
- 阈值参考(经验值,需结合业务 SLA 校准):
- %util 长期接近 100% → 磁盘饱和
- await 明显升高(如远高于 10ms)且 %util≈100% → 队列堆积/过载
- svctm 与 await 差异大 → 队列过长或驱动/阵列处理慢
- load average 持续高于 CPU 核数且 wa 高 → I/O 瓶颈概率大
- 出现 I/O error/reset/aborted command → 优先排查硬件与链路健康度