当你的CentOS服务器出现卡顿、响应慢、服务异常的时候,第一反应不是重启,而是打开终端敲top看一眼,再配合vmstat和iostat联合分析,三板斧下去基本就能定位问题根源。top看的是实时进程和整体资源占用,vmstat看的是系统内存、CPU、IO的综合状态,iostat看的是磁盘IO的详细指标。这三个工具单独用都能发现问题,联合起来才能真正搞清楚"系统到底怎么了"。下面我把每个工具怎么用、怎么看、怎么联合分析,全部给你讲透。

一、top命令:实时资源监控的第一眼

top是CentOS自带的实时监控工具,不需要额外安装,直接在终端输入top回车就能看到。它的核心价值在于:你能实时看到哪个进程在吃CPU、哪个进程在占内存、系统整体负载是多少。很多运维人员只会看CPU那一行的百分比,其实top里藏着大量有用的信息。

打开top之后,你会看到几个关键区域。第一行是系统运行时间和当前登录用户数;第二行是任务统计,包括总进程数、运行中、睡眠中、停止、僵尸进程数量;第三行是CPU状态,us是用户空间占用、sy是内核空间占用、id是空闲、wa是IO等待、st是被偷取的时间(虚拟机环境常见);第四行是内存状态,total总内存、free空闲、used已用、buff/cache缓存;第五行是swap交换分区状态。

重点关注这几个指标:如果wa(IO等待)长期超过20%,说明磁盘IO是瓶颈;如果id(空闲)低于5%,说明CPU已经非常紧张;如果有大量zombie进程,说明有程序异常退出没有被父进程回收。你还可以按M按内存排序、按P按CPU排序,快速找到资源消耗大户。

# 查看top并按内存排序
top -o %MEM

# 查看top并按CPU排序
top -o %CPU

# 只看某个用户的进程
top -u username

# 批量模式输出(适合脚本采集)
top -b -n 1 > /tmp/top_snapshot.txt

top的局限在于它是瞬时快照,你看到的只是那一秒的状态。如果问题是间歇性的,你可能需要用top -d参数设置刷新间隔,或者配合其他工具做持续监控。

二、vmstat命令:系统级资源状态的全面扫描

vmstat全称Virtual Memory Statistics,它不看单个进程,而是从系统整体层面告诉你内存、CPU、IO、进程的综合状态。很多人觉得vmstat输出的数字看不懂,其实掌握了每一列的含义之后,它比top更能反映系统的健康程度。

输入vmstat 1,每秒刷新一次,你会看到一个表格。从左到右依次是:r(运行队列中的进程数)、b(阻塞等待IO的进程数)、swpd(使用的swap空间)、free(空闲内存)、buff(buffer缓存)、cache(page缓存)、si(从swap读入内存的速率)、so(写入swap的速率)、bi(从块设备读入的速率)、bo(写入块设备的速率)、in(每秒中断次数)、cs(每秒上下文切换次数)、us、sy、id、wa、st。这一堆数字看着吓人,但其实有规律可循。

核心判断逻辑是这样的:如果r列长期大于CPU核心数,说明进程在排队等CPU,系统负载过高;如果b列大于0,说明有进程在等IO;如果si和so长期不为0,说明系统在频繁使用swap,物理内存不够了;如果bi和bo很大,说明磁盘IO很忙;如果cs特别高(比如超过10万),说明系统在频繁切换进程上下文,可能是进程太多或者锁竞争严重。

# 每秒采样一次,共采样5次
vmstat 1 5

# 显示活跃和非活跃内存
vmstat -a 1

# 显示slab信息
vmstat -m 1

# 显示磁盘分区信息
vmstat -d 1

# 显示系统启动以来的统计
vmstat -s

vmstat最实用的场景是:当你发现系统变慢,先敲一个vmstat 1看几秒钟,如果wa高就查磁盘,如果si/so高就查内存,如果r高就查CPU。它是一个快速分诊工具,帮你确定问题方向。

三、iostat命令:磁盘IO的精准诊断

如果说top看CPU和内存,vmstat看综合状态,那iostat就是专门盯着磁盘IO的。CentOS默认不一定装了iostat,它属于sysstat包,需要先安装:yum install sysstat -y。装完之后就能用了。

输入iostat -x 1,每秒刷新,你会看到每个磁盘设备的详细IO指标。关键列包括:rrqm/s(每秒合并的读请求)、wrqm/s(每秒合并的写请求)、r/s(每秒读次数)、w/s(每秒写次数)、rKB/s(每秒读KB)、wKB/s(每秒写KB)、await(IO平均等待时间,单位毫秒)、svctm(IO服务时间)、%util(磁盘利用率百分比)。

这里最重要的三个指标是await、%util和r/s+w/s。await超过10ms说明IO响应慢,超过20ms就比较严重了;%util接近100%说明磁盘已经跑满了,没有余量;r/s+w/s如果是机械硬盘超过200、SSD超过5000,就要注意是否有异常IO。如果你看到await很高但%util不高,可能是单次IO很大(比如大文件顺序读写),这种情况不一定是问题。

# 查看所有磁盘IO情况,每秒刷新
iostat -x 1

# 只看某个磁盘(比如sda)
iostat -x sda 1

# 显示扩展统计信息
iostat -xmt 1

# 查看历史数据(sysstat服务开启后)
sar -d -f /var/log/sa/sa$(date +%d -d "yesterday")

iostat还有一个高级用法:通过iostat -p sda 1可以看到分区级别的IO,比如/、/home、/var各分区的读写情况。这在排查某个分区IO异常时非常有用,比如/var/log分区被大量日志写满导致IO飙升。

四、三工具联合分析:实战排查流程

单独用每个工具都能发现一些问题,但真正的高手是把它们串起来用。下面我给你一套实战排查流程,遇到系统慢的时候按这个步骤走。

第一步:先敲top看整体。如果CPU的us很高,说明是用户程序在忙;如果sy很高,说明内核在忙(可能是驱动问题或者大量系统调用);如果wa很高,进入第二步。同时看top里哪个进程占用最高,记下PID。

第二步:敲vmstat 1看几秒。如果wa高,同时bi/bo也高,说明确实是磁盘IO问题;如果si/so不为0,说明内存不够开始用swap了,这时候要查是哪个进程在大量吃内存。如果r列大于CPU核数,说明CPU确实不够用,需要看是否可以优化程序或者扩容。

第三步:敲iostat -x 1确认磁盘状态。看%util是否接近100%,await是否过高,是读多还是写多。如果是写多,检查是否有大量日志写入、数据库刷盘、备份任务在跑;如果是读多,检查是否有大量随机读、是否是数据库查询导致的。

举个真实场景:某台CentOS服务器上MySQL跑得很慢。先top发现mysqld进程CPU占80%,wa占15%。再vmstat 1发现wa=15,bi=5000,bo=3000,说明有大量IO。然后iostat -x 1看到sda的%util=98%,await=25ms,r/s=200,w/s=3000。结论很清楚:MySQL在大量写磁盘,磁盘已经跑满,IO等待导致CPU虽然高但实际有效工作不多。解决方案:优化SQL减少写IO、调整innodb_flush_log_at_trx_commit参数、或者升级SSD。

再举一个场景:系统整体很慢但top里看不到哪个进程特别高。vmstat 1发现si和so都在持续增长,free内存很少,cache也不多。这说明物理内存不足,系统在疯狂用swap。iostat -x 1看到swap分区所在磁盘的IO很高。解决方案:加内存、或者找出吃内存的进程(用ps aux --sort=-%mem | head看)、或者调整swapiness参数减少swap使用倾向。

五、进阶技巧和注意事项

这三个工具虽然强大,但有几个点需要注意。第一,top看到的CPU占用是瞬时值,如果进程是短时间突发的,可能抓不到,这时候可以用pidstat -u 1持续监控特定进程。第二,vmstat的单位要搞清楚,内存默认是KB,磁盘IO默认是块(通常512字节),不要搞混。第三,iostat的await在高并发场景下可能不准,因为它是平均值,单次极端IO会被平滑掉,需要结合具体业务判断。

另外,CentOS 7和CentOS 8上这些工具的输出格式略有差异,但核心指标含义一致。CentOS 8上推荐用dnf install sysstat安装iostat。如果你需要长期监控,建议配合sar和cron定时采集数据,比如每5分钟采集一次vmstat和iostat,写入日志文件,出问题时回溯分析。

还有一个容易被忽略的点:当你看到系统负载很高时,不要急着加资源。先用这三个工具确认瓶颈到底在哪里。很多时候是程序写得烂、SQL没优化、日志没轮转、crontab里有个疯狂跑的脚本。找到根因再动手,比盲目扩容省钱得多。

六、总结:建立系统化的监控思维

top、vmstat、iostat这三个工具是CentOS运维的基本功,它们不需要安装、不需要重启、不影响业务,随时可以用。核心思路就是:top定位问题进程和整体资源方向,vmstat判断系统级的CPU/内存/IO综合状态,iostat精确诊断磁盘IO瓶颈。三者联合使用,基本能覆盖90%以上的性能问题定位场景。

真正的运维高手不是工具用得多,而是知道什么时候用什么工具、怎么把多个工具的输出关联起来分析。建议你在日常运维中养成习惯:系统正常时偶尔看一眼top和vmstat建立基线,出问题时快速三连排查。时间长了,你看几个数字就能知道系统状态,这才是真正的运维功力。