服务器硬件诊断工具:从开箱检查到压测验证的完整流程
服务器硬件出问题时,系统往往先表现出重启、卡顿、IO报错或网络丢包,而不是直接告诉你哪块硬件坏了。
要定位到具体部件,需要一套从信息采集到压力验证的诊断流程。
本文按CPU、内存、磁盘、网络四条线展开,命令可直接复制执行,适合刚接手服务器或需要排查硬件故障的运维人员。
开始之前:确认环境和权限
诊断硬件需要读取底层信息,多数命令要求root权限。
先用whoami确认当前用户,如果不是root,加sudo或切换到root。
确认系统版本和内核,不同发行版的工具包名不同:
cat /etc/os-release
uname -r
安装常用诊断工具。
Debian/Ubuntu系用apt install sysstat smartmontools memtester ethtool,CentOS/RHEL系用yum install sysstat smartmontools memtester ethtool。smartmontools提供smartctl,是磁盘健康检测的核心工具。
如果服务器还在保修期内,诊断前先记录序列号,方便报修:
dmidecode -t system | grep -E 'Manufacturer|Product|Serial'
用lscpu和dmidecode摸清硬件底账
诊断的第一步不是跑压测,而是先搞清楚机器里装了什么。lscpu看CPU架构、核心数、主频和缓存:
lscpu | grep -E 'Model name|Socket|Core|Thread|MHz'
关注Socket(s)(物理CPU颗数)和Core(s) per socket,两者相乘是物理核心总数。
如果和采购单对不上,可能少插了CPU。
dmidecode读的是BIOS里的硬件信息,比lscpu更底层:
dmidecode -t memory | grep -E 'Size|Speed|Locator|Manufacturer'
dmidecode -t processor | grep -E 'Socket|Version|Core Count'
内存部分要确认每条插槽的容量和频率是否一致。
混插不同频率的内存会导致整体降频,dmidecode -t memory里Speed和Configured Memory Speed不一致就说明被降频了。
内存检测:memtester和系统日志双管齐下
内存故障的典型表现是随机进程崩溃、内核报Machine Check Exception。
先用dmesg看有没有历史报错:
dmesg | grep -i -E 'error|mce|edac'
如果edac模块已加载,可以读CE/UE计数:
cat /sys/devices/system/edac/mc/mc*/ce_count
cat /sys/devices/system/edac/mc/mc*/ue_count
CE是可纠正错误,少量可能正常;
UE是不可纠正错误,出现就说明内存条有问题,需要更换。
主动检测用memtester,先确认可用内存,再决定测试大小。
不要测试超过空闲内存的量,否则会触发OOM:
free -h
memtester 1G 3
1G是测试大小,3是循环次数。
测试期间如果出现FAILURE字样,说明对应地址段有坏块。
生产环境建议在维护窗口执行,测试大内存耗时较长。
磁盘诊断:smartctl看健康,badblocks查坏道
磁盘是服务器最容易出问题的部件。
先看SMART整体健康状态:
smartctl -H /dev/sda
返回PASSED表示SMART自评估通过,FAILED则需要立即备份数据并更换磁盘。
再看关键属性:
smartctl -A /dev/sda | grep -E 'Reallocated|Pending|Uncorrectable|Power_On'
重点看三个值:Reallocated_Sector_Ct(已重映射扇区数)、Current_Pending_Sector(待映射扇区数)、Offline_Uncorrectable(离线不可纠正扇区数)。
这三个值只要不为0,就说明盘面已经出现物理损伤,数值持续增长时应尽快更换。
如果需要深度检测,用badblocks做非破坏性读写测试:
badblocks -nsv /dev/sda
-n是非破坏性模式,-s显示进度,-v输出详情。
这个命令很慢,1TB盘可能跑几个小时,建议在维护窗口执行。
测试前务必确认没有业务在读写该盘。
网络与电源的快速排查
网卡问题常表现为丢包或协商速率不对。
用ethtool查看链路状态:
ethtool eth0 | grep -E 'Speed|Duplex|Link detected'
Link detected: yes表示物理链路通,Speed应该和交换机端口匹配。
如果显示100Mb/s而交换机是千兆,检查网线是否老化或水晶头接触不良。
丢包测试用ping配合-f和-s:
ping -f -s 1472 -c 1000 网关IP
-s 1472加上28字节包头正好1500字节,测试标准MTU下的丢包情况。-f是快速发包,需要root权限。
丢包率不为0就说明链路有问题。
电源和温度信息通过IPMI读取,前提是服务器支持并已配置BMC:
ipmitool sensor | grep -E 'Temp|Voltage|Fan'
关注CPU温度是否超过80度、风扇转速是否正常、电压是否在标称值±5%范围内。
压测验证与常见坑
静态检测通过不代表高负载下没问题。
CPU用stress-ng压测:
stress-ng --cpu 4 --timeout 300s --metrics-brief
内存和CPU同时压,观察dmesg有没有新报错。
磁盘用fio做顺序和随机读写:
fio --name=seqread --rw=read --bs=1M --size=2G --filename=/tmp/testfile --direct=1
压测期间用iostat -x 1观察%util和await,如果%util长期100%且await很高,说明磁盘性能已达瓶颈或存在坏道。
几个容易踩的坑:
- 不要在业务高峰期跑
badblocks和memtester,会抢占资源导致业务超时。 smartctl -t long自检可以后台跑,但结果要等自检完成后用smartctl -l selftest查看。- 虚拟化环境里
dmidecode可能读不到真实硬件信息,需要到宿主机或带外管理口执行。 - 更换内存条后,建议重新跑一轮
memtester确认新条没问题再上业务。
结果怎么算通过
一套完整的诊断流程走完,判断标准是:smartctl -H返回PASSED且三个关键属性为0;memtester无FAILURE;dmesg无新增MCE或IO错误;ethtool链路速率和双工模式符合预期;
压测期间无进程异常退出。
全部满足可以认为硬件基本健康。
任何一项不通过,先隔离对应部件再复测,不要带着已知故障继续跑业务。
如果你正在处理服务器硬件诊断,建议先按本文顺序完整执行一次,记录每步输出作为基线,后续出现异常时对比基线能更快定位问题。