1. 项目概述:为什么我们需要掌握服务器“体检”命令
想象一下,你负责维护一台承载着关键业务的CentOS服务器。某天深夜,你接到告警电话,说应用响应变得极其缓慢。你第一时间登录服务器,面对黑漆漆的命令行,第一反应是什么?是手忙脚乱地四处乱试,还是能像经验丰富的老医生一样,迅速、有条不紊地开出几项“检查单”,精准定位问题所在——是CPU被某个进程吃满了,还是内存即将耗尽,亦或是磁盘I/O成了瓶颈?
这就是掌握服务器硬件和状态查询命令的价值所在。它不是你简历上用来炫耀的“熟悉Linux命令”,而是你作为系统管理员或运维工程师的“听诊器”和“CT机”。无论是物理服务器还是云主机,其运行状态都直接关系到上层应用的稳定。你不能等到服务彻底宕机了才去排查,而应该具备主动监控和快速诊断的能力。
本文的目的,就是帮你系统性地装备这套“诊断工具箱”。我们将不局限于罗列命令,而是围绕“查询什么”、“为什么查”、“怎么解读结果”这三个核心问题展开。我会结合多年踩坑经验,告诉你每个命令在什么场景下最有用,输出里哪些数字是“健康指标”,哪些是“危险信号”,以及如何将这些命令组合起来,形成你的故障排查“组合拳”。无论你是刚接触Linux的新手,还是想梳理知识体系的熟手,这篇文章都能让你对CentOS服务器的“身体状况”了如指掌。
2. 核心查询体系:从硬件资产到实时状态
服务器的状态信息可以看作一个分层模型。最底层是静态的硬件配置,中间层是动态的系统资源使用情况,最上层是具体的进程和服务状态。一个高效的排查流程,通常是从宏观到微观,从静态到动态。
2.1 硬件信息盘点:摸清家底
在接手一台新服务器、规划扩容或排查兼容性问题时,首先需要清楚它的硬件配置。这不是一次性的工作,建立硬件档案对于后续的容量规划和故障预测至关重要。
lshw:全能硬件列表工具这是获取硬件信息最全面、结构最清晰的命令之一。但它通常不是默认安装的,你需要先执行sudo yum install lshw -y进行安装。直接运行sudo lshw会输出极其详细的树状结构信息,内容太多。更实用的方式是使用-short选项来获得一个简洁的硬件类目清单,或者用-class选项按类别查看,比如sudo lshw -class disk专门查看磁盘信息。
注意:
lshw需要root权限才能读取所有硬件信息。它的输出非常底层,包含了内存插槽、固件版本等详细信息,在向硬件厂商提工单时特别有用。
dmidecode:读取DMI表信息这个命令直接从系统的DMI(Desktop Management Interface)表中读取信息,这些信息是由主板BIOS或UEFI提供的。它对于获取服务器序列号、制造商、型号等“身份信息”特别关键。
sudo dmidecode -t system:查看系统信息,包括产品名称、序列号。这个序列号是硬件维保的唯一标识。sudo dmidecode -t memory:查看内存的详细配置,包括每个内存条的大小、类型、速度、位宽。当你怀疑内存故障或需要确认是否支持扩容时,这个命令必不可少。sudo dmidecode -t processor:查看CPU信息,包括型号、核心数、线程数、当前频率等。
lscpu:快速聚焦CPU架构如果你想快速了解CPU的架构和核心布局,lscpu是最直观的选择。它一行命令就能告诉你:这是x86_64还是ARM架构、有多少个物理核心(Core(s) per socket)、多少个逻辑核心(CPU(s))、CPU家族和型号、以及NUMA节点信息。在部署对CPU架构敏感的应用(如某些数据库或科学计算软件)前,先用它确认一下。
lsblk和lspci:块设备与PCI设备清单
lsblk:以树状形式列出所有块设备(磁盘、分区、逻辑卷)。lsblk -f选项尤其重要,它能同时显示文件系统类型、UUID和挂载点,让你对存储布局一目了然。在添加新磁盘或排查磁盘空间问题时,这是第一个要用的命令。lspci:列出所有PCI总线上的设备。配合-v或-vv可以查看更详细的驱动信息和设备能力。当你需要确认网卡、显卡、RAID卡等硬件是否被系统正确识别时,就用它。例如,lspci | grep -i network可以快速过滤出网卡信息。
2.2 实时状态监控:把握脉搏
硬件是静态的,而系统的负载是动态变化的。实时监控命令就像服务器的“实时心电图”。
核心三板斧:top/htop、vmstat、iostat
top/htop:这是最经典的实时进程监控工具。top是基础,而htop是其增强版(需安装:sudo yum install htop -y),界面更友好,支持鼠标操作和颜色高亮。进入界面后,第一行显示的是系统负载平均值(load average),这是关键中的关键。三个数值分别代表过去1分钟、5分钟、15分钟的平均负载。对于单核CPU,1.00表示满负荷;对于4核CPU,4.00表示满负荷。如果5分钟和15分钟负载持续远高于CPU核心数,说明系统长期过载。 在top中,按1可以展开显示每个CPU核心的利用率。重点关注%us(用户空间CPU)、%sy(系统空间CPU)和%wa(I/O等待)。如果%wa持续很高,说明磁盘I/O是瓶颈。htop则直观地用进度条显示了每个核心的使用率。vmstat:虚拟内存统计专家运行vmstat 2 5表示每2秒采样一次,共采样5次。它的输出分为几个板块:- procs(进程):
r表示运行队列的长度,即等待CPU的进程数,如果该值持续大于CPU核心数,说明CPU繁忙。b表示被阻塞(通常是等待I/O)的进程数。 - memory(内存):
swpd显示已使用的虚拟内存(交换分区)大小。如果这个值不为0且在增长,就要警惕了,说明物理内存可能不足。free是空闲的物理内存。buff和cache是用于缓冲和缓存的内存,这部分内存在应用需要时可以被快速回收,所以通常不用过于担心。 - swap(交换):
si(swap in)和so(swap out)表示每秒从磁盘交换区读入和写出的内存量。只要so长期大于0,就表明内存严重不足,性能会急剧下降。 - io(磁盘):
bi和bo表示每秒从块设备读入和写出的数据块数。可以粗略反映磁盘I/O压力。 - system(系统):
in(中断)和cs(上下文切换)每秒次数。过高可能意味着进程调度频繁。 - cpu(CPU):和
top类似,显示各类CPU时间百分比。
- procs(进程):
iostat:磁盘I/O性能透视镜同样需要安装:sudo yum install sysstat -y。运行iostat -dx 2 5,-d显示设备报告,-x显示扩展统计信息,2和5同样是间隔和次数。 关键列解读:%util:设备利用率,即一秒中有百分之多少的时间用于I/O操作。如果接近100%,表示设备已经饱和。await:平均每次I/O请求的等待时间(毫秒)。包括队列时间和服务时间。如果这个值远高于磁盘的典型访问时间(例如机械硬盘通常为几毫秒到十几毫秒),说明I/O队列可能太长。r/s,w/s:每秒读/写请求数。rkB/s,wkB/s:每秒读/写数据量(KB)。 当应用响应慢,而top显示%wa很高时,就用iostat定位是哪个磁盘(如/dev/sda)压力大。
内存深度分析:free与/proc/meminfofree -h命令以人类可读的方式(G、M)显示内存使用情况。重点看available列,它表示可供应用程序使用的内存估计值,是比free列更准确的“剩余内存”指标。因为Linux会利用空闲内存做缓存(buff/cache),所以free列很少并不代表内存不足,只要available还充足就没问题。 如果需要最详细的内存信息,可以直接cat /proc/meminfo。这里包含了无数细节,比如MemTotal,MemFree,Buffers,Cached,SwapCached,Active,Inactive等。在编写监控脚本或进行深度内存泄漏分析时,这个文件是金矿。
网络状态速查:ss替代netstatnetstat命令已经逐渐被功能更强大、执行更快的ss命令取代。ss直接从内核空间获取信息,效率极高。
ss -tlnp:查看所有监听(-l)的TCP(-t)端口,并显示端口号(-n)和对应的进程名/ID(-p)。这是检查服务是否成功启动监听的标配命令。ss -tan:查看所有TCP连接的状态(-a),包括ESTABLISHED(已建立)、TIME-WAIT(等待关闭)等。如果TIME-WAIT状态连接过多,可能需要调整内核网络参数。ss -s:查看网络统计摘要,包括总连接数、各种状态的连接数等,用于宏观把握网络负载。
3. 实操:构建系统健康检查脚本
知道了命令,如何把它们用起来?最好的方式就是将这些命令封装成一个一键式的健康检查脚本。这不仅能提高效率,还能形成标准化的检查流程。
3.1 脚本设计与编写思路
一个实用的检查脚本不应该只是命令的堆砌,而应该有清晰的逻辑和输出。我们可以将检查分为几个模块:系统概览、CPU与负载、内存与交换、磁盘I/O、磁盘空间、网络连接。每个模块运行相关的命令,并提取关键指标,用颜色或标记来高亮异常值。
下面是一个简单的脚本示例health_check.sh:
#!/bin/bash # 定义颜色输出,让结果更易读 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo -e "${GREEN}======= CentOS 服务器健康检查报告 =======${NC}" echo "检查时间:$(date)" echo "主机名:$(hostname)" echo "" # 1. 系统概览 echo -e "${YELLOW}[1] 系统与资源概览${NC}" echo "----------------------------------------" uptime echo "------" echo "CPU核心数:$(nproc)" echo "------" free -h | grep -E "^(Mem|Swap)" | awk '{print $1 ": " $2 " (总量) | " $3 " (已用) | " $4 " (可用)"}' echo "------" df -hT | grep -E '^/dev/(sd|xvd|nvme)' | awk '{printf "磁盘 %s (%s): 已用%s/%s (%s)\n", $7, $2, $4, $3, $6}' echo "" # 2. CPU与负载详情 echo -e "${YELLOW}[2] CPU与平均负载监控${NC}" echo "----------------------------------------" echo "当前平均负载:" load=$(uptime | awk -F'load average:' '{print $2}') cores=$(nproc) echo " $load" # 简单判断逻辑:如果1分钟负载超过核心数2倍,标黄;超过4倍,标红。 load1=$(echo $load | awk -F, '{print $1}' | tr -d ' ') load1_per_core=$(echo "scale=2; $load1 / $cores" | bc) if (( $(echo "$load1_per_core > 4" | bc -l) )); then echo -e " ${RED}警告:1分钟负载严重过高!${NC}" elif (( $(echo "$load1_per_core > 2" | bc -l) )); then echo -e " ${YELLOW}注意:1分钟负载偏高。${NC}" else echo -e " ${GREEN}负载正常。${NC}" fi echo "------" echo "Top 5 CPU占用进程:" ps aux --sort=-%cpu | head -6 | awk '{printf "%-10s %-8s %-6s %-10s %s\n", $1, $2, $3, $4, $11}' echo "" # 3. 内存与交换空间详情 echo -e "${YELLOW}[3] 内存与交换空间深度分析${NC}" echo "----------------------------------------" echo "检查是否存在Swap使用..." swap_used=$(free -m | grep Swap | awk '{print $3}') if [ "$swap_used" -gt 0 ]; then echo -e " ${YELLOW}注意:Swap已被使用 ${swap_used} MB。若持续增长,可能存在内存压力。${NC}" else echo -e " ${GREEN}Swap未使用,内存压力小。${NC}" fi echo "------" echo "Top 5 内存占用进程:" ps aux --sort=-%mem | head -6 | awk '{printf "%-10s %-8s %-6s %-10s %s\n", $1, $2, $3, $4, $11}' echo "" # 4. 磁盘I/O状态(需要sysstat包) echo -e "${YELLOW}[4] 磁盘I/O状态检查${NC}" echo "----------------------------------------" if command -v iostat &> /dev/null; then echo "最近一次磁盘I/O统计(需关注%util和await):" iostat -dx 1 1 | grep -E '^Device|^sd|^xvd|^nvme' | head -10 else echo "iostat命令未找到,请安装sysstat包:yum install sysstat -y" fi echo "" # 5. 网络连接统计 echo -e "${YELLOW}[5] 网络连接状态摘要${NC}" echo "----------------------------------------" if command -v ss &> /dev/null; then echo "网络连接统计:" ss -s echo "------" echo "监听中的TCP服务:" ss -tlnp | head -20 else echo "ss命令未找到。" fi echo -e "\n${GREEN}======= 检查完成 =======${NC}"3.2 脚本使用与解读要点
- 保存与授权:将上述内容保存为
health_check.sh,然后赋予执行权限:chmod +x health_check.sh。 - 运行:直接执行
./health_check.sh。如果需要以root身份检查所有信息(如查看所有进程),可以使用sudo ./health_check.sh。 - 解读报告:
- 负载警告:脚本实现了简单的负载判断逻辑。你需要结合你的CPU核心数来看。例如,4核CPU,如果1分钟负载持续大于8,脚本会标红。
- Swap使用:只要看到Swap被使用,就应该引起注意。虽然少量使用可能正常,但持续增长是内存不足的明确信号。
- 磁盘I/O:关注
iostat输出中的%util(利用率)和await(平均等待时间)。如果某个磁盘的%util持续在90%以上,说明它已经是系统瓶颈。 - 网络连接:
ss -s的摘要里,如果TIME-WAIT数量异常多(例如上万),可能需要考虑优化TCP参数,如net.ipv4.tcp_tw_reuse和net.ipv4.tcp_fin_timeout。
这个脚本是一个起点,你可以根据自己服务器的业务特点,增加更多的检查项,比如检查特定服务的端口、检查日志文件增长、检查僵尸进程等。
4. 进阶技巧与场景化排查指南
掌握了基础命令和脚本后,我们来看一些更深入的技巧和特定场景下的排查思路。
4.1 性能瓶颈快速定位流程
当服务器出现“慢”的症状时,遵循一个标准的排查流程可以事半功倍。我通常的步骤是:
- 整体观感:运行
uptime和top,看负载和整体CPU使用率。如果负载高,进入第2步;如果负载不高但应用慢,直接跳转到第4步。 - CPU分析:在
top中,按1看各核心是否均衡,按P按CPU使用率排序进程。如果某个用户进程(%us高)长期占用,可能是应用问题;如果系统进程(%sy高)占用高,可能是系统调用频繁或上下文切换过多。 - 内存分析:在
top中看内存和Swap使用。用free -h确认available内存。如果available很少且Swap使用在增长,说明内存不足。用ps aux --sort=-%mem | head -10找出内存消耗大户。 - I/O分析:如果
top中%wa(I/O等待)高,运行iostat -dx 1观察哪个磁盘的%util和await高。同时,可以用iotop(需安装)命令查看是哪个进程在进行大量I/O操作。 - 网络分析:如果怀疑网络,用
ss -s看连接数,用sar -n DEV 1(sysstat包)查看各网卡流量是否饱和,用ping和traceroute检查网络延迟和路由。
4.2 常用组合命令与信息过滤
命令行强大的地方在于管道(|)和过滤。以下是一些高效组合:
- 查找消耗CPU最多的Java进程:
ps aux | grep java | sort -rnk 3 | head -5ps aux:列出所有进程。grep java:过滤出包含“java”的行(你的应用进程)。sort -rnk 3:按第三列(CPU百分比)数值逆序排序。head -5:显示前5行。
- 实时监控日志文件增长:
tail -f /var/log/messages | grep -i errortail -f:持续输出文件新增内容。grep -i error:只显示包含“error”(不区分大小写)的行,用于快速抓取错误日志。
- 统计当前目录下文件总大小:
du -sh . - 查看大文件:
find / -type f -size +100M 2>/dev/null | head -20- 在根目录
/下查找大于100M的文件,将错误信息(如权限不足)重定向到/dev/null,只显示前20个。
- 在根目录
4.3 硬件故障的蛛丝马迹
硬件不会突然完全坏掉,通常会有征兆。命令可以帮助我们发现这些早期迹象:
- 磁盘SMART状态:对于磁盘,可以安装
smartmontools(yum install smartmontools),使用sudo smartctl -a /dev/sda查看磁盘的SMART健康信息。关注RAW_READ_ERROR_RATE、Reallocated_Sector_Ct(重映射扇区数)等属性,如果这些值在增长,说明磁盘可能即将故障。 - 内存错误:
dmesg | grep -i memory或dmesg | grep -i error可以查看内核日志中是否有内存相关的报错。更专业的内存测试需要在服务器启动时运行Memtest86+。 - CPU温度与频率:对于物理服务器,可以安装
lm_sensors(yum install lm_sensors)来读取传感器信息,运行sensors查看CPU温度。温度过高可能导致CPU降频,影响性能。
5. 常见问题与排查技巧实录
在实际操作中,你一定会遇到各种奇怪的问题。这里记录几个我踩过的坑和对应的排查思路。
5.1 负载很高,但CPU使用率很低?
这是典型的现象,原因通常是:
- I/O等待(%wa):进程大部分时间在等待磁盘I/O。用
top看%wa,用iostat确认。解决方法:优化数据库查询、使用更快的存储(如SSD)、增加内存减少Swap使用。 - 锁竞争:进程在等待锁(如数据库行锁、应用级锁)。这需要结合应用日志和
top中进程状态(S表示可中断睡眠,D表示不可中断睡眠,通常是I/O,但也可能是等待锁)来分析。使用strace或perf跟踪进程系统调用可以进一步定位。 - 进程处于“不可中断睡眠”(D状态):这通常是由于等待I/O(如NFS挂载点无响应)导致。用
ps aux | awk '$8=="D"'可以列出所有D状态的进程。恢复依赖的I/O服务是根本。
5.2 “No space left on device”但df显示还有空间?
这可能是因为磁盘的inode用尽了。每个文件都需要一个inode来存储元信息。使用df -i命令可以查看inode的使用情况。如果IUse%达到100%,即使磁盘空间还有剩余,也无法创建新文件或目录。解决方法:删除大量小文件(如临时文件、日志文件),或者将数据迁移到其他分区。
5.3 如何排查“内存泄漏”?
这里的内存泄漏通常指应用程序未能释放不再使用的内存,导致系统可用内存持续减少。
- 监控趋势:使用
free -h或监控图表,观察available内存是否随时间持续下降,即使应用负载平稳。 - 定位进程:使用
top或ps aux --sort=-%mem,观察哪个进程的RES(常驻内存)或%MEM在持续增长。 - 深入分析:对于疑似进程(如Java应用),可以使用其自带的工具(如
jstat、jmap)或系统级的pmap命令来查看内存分布。对于C/C++程序,可以使用valgrind进行检测。 - 重启大法:在业务低峰期,重启有问题的服务往往是临时解决内存泄漏最快的方法,但这治标不治本。
5.4 网络连接数过多导致服务器变慢?
高并发场景下,可能会出现TIME-WAIT状态连接堆积。
- 使用
ss -tan | grep TIME-WAIT | wc -l统计数量。 - 如果数量巨大(数万),可以临时调整内核参数来加速端口回收:
# 允许将TIME-WAIT sockets重新用于新的TCP连接 echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse # 修改系统默认的TIMEOUT时间(秒) echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout注意:修改内核参数需谨慎,最好在测试环境验证,并写入
/etc/sysctl.conf使其永久生效。
5.5 命令输出太多,如何快速找到关键信息?
善用grep、awk、cut等文本处理工具。例如:
- 只看
top的第一行(负载信息):top -bn1 | head -1 - 从
df输出中提取根分区使用率:df -h / | awk 'NR==2 {print $5}' | tr -d '%' - 从
free中直接获取可用内存(MB):free -m | grep Mem | awk '{print $7}'
将这些小技巧融入到你的日常命令中,能极大提升排查效率。最终,所有这些命令和脚本的目的,是让你对服务器的状态从“未知”变为“可知”,从“被动响应”变为“主动预防”。真正的熟练,不是背下所有命令的参数,而是在问题出现时,能清晰地知道该用什么工具、看哪个数据、如何做出判断。