作为一名运维工程师或开发者,日常工作中最常遇到的问题之一就是服务器性能瓶颈排查。而 CPU 与内存作为服务器最核心的硬件资源,其占用情况直接决定了服务的稳定性——高 CPU 使用率可能导致请求响应缓慢,内存不足则会引发进程被 OOM(Out of Memory)杀手终止。
Linux 系统提供了丰富的命令行工具,从基础的 top 到专业的 htop,再到深入内核的 vmstat,每一个工具都有其独特的定位。本文将从基础命令到进阶工具,再到实战场景,详细讲解如何精准查看 Linux 服务器的 CPU 与内存占用,帮你快速定位性能问题。
一、基础命令:快速掌握资源占用概况
对于刚接触 Linux 的新手,优先掌握几个基础命令,就能满足 80% 的日常需求。这些命令无需额外安装,系统默认自带,操作简单直观。
1. top:经典的系统资源监控工具
top 是 Linux 系统中最常用的资源监控命令,它以实时动态的方式展示系统整体状态,包括 CPU、内存、进程等关键信息。
如何使用?
直接在终端输入 top 即可启动,界面分为系统概览区和进程列表区两部分:
-
系统概览区(前5行):
- 第1行:系统时间、运行时间、登录用户数、系统负载(
load average: 0.00, 0.01, 0.05分别代表1分钟、5分钟、15分钟的平均负载,通常建议不超过 CPU 核心数)。 - 第2行:进程总数(
Tasks: 123 total)、运行中(running)、睡眠中(sleeping)、停止(stopped)、僵尸进程(zombie)数量。 - 第3行:CPU 占用率(
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st): us:用户空间程序占用 CPU 百分比(如应用程序);sy:内核空间(系统调用)占用 CPU 百分比;ni:优先级调整过的用户进程占用 CPU 百分比;id:空闲 CPU 百分比(越低表示 CPU 越繁忙);wa:等待 I/O(如磁盘读写)的 CPU 时间百分比(过高可能是磁盘性能问题);st:被虚拟机窃取的 CPU 时间(云服务器需关注)。- 第4-5行:内存与交换空间(Swap)使用情况:
Mem: 16384000k total, 8192000k used, 8192000k free, 1024000k buffers(物理内存总量、已用、空闲、缓存);Swap: 8192000k total, 0k used, 8192000k free, 2048000k cached(交换空间总量、已用、空闲、缓存)。
- 第1行:系统时间、运行时间、登录用户数、系统负载(
-
进程列表区:展示每个进程的资源占用,关键列包括:
PID:进程 ID;%CPU:进程占用 CPU 百分比;%MEM:进程占用内存百分比;COMMAND:进程名称。
实用快捷键:
P:按 CPU 使用率从高到低排序(快速找 CPU 占用最高的进程);M:按内存使用率从高到低排序;k:输入进程 PID 后杀死进程(需谨慎使用);q:退出top。
2. free:专注内存与交换空间详情
如果只需要查看内存和交换空间的使用情况,free 比 top 更简洁直接。
基础用法:
输入 free,默认以 千字节(KB) 为单位显示:
total used free shared buff/cache available
Mem: 16384000 8192000 4096000 65536 4096000 7864320
Swap: 8192000 0 8192000
更友好的单位:
加上 -h 参数(human-readable),自动转换为 KB/MB/GB 等易读单位:
free -h
total used free shared buff/cache available
Mem: 15Gi 7.8Gi 3.9Gi 64Mi 3.9Gi 7.5Gi
Swap: 7.9Gi 0B 7.9Gi
关键指标解释:
total:物理内存总量;used:已被应用程序直接使用的内存;free:完全未被使用的内存;buff/cache:内核用于缓存文件系统数据的内存(可被回收供应用使用);available:实际可被应用程序使用的内存(最关键指标,包含 free 和可回收的 buff/cache)。
3. ps:进程快照查询
top 是实时监控,而 ps 是进程快照(某一时刻的进程状态),适合快速筛选特定进程。
常用组合:ps aux
ps aux 会列出系统中所有进程的详细信息,包括 CPU、内存占用:
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168792 10240 ? Ss 08:00 0:02 /sbin/init
nginx 123 0.3 0.5 234560 45000 ? S 08:05 0:10 nginx: worker process
mysql 456 1.2 10.3 1234560 834000 ? Sl 08:08 0:30 /usr/sbin/mysqld
关键列解释:
%CPU:进程自启动以来的 CPU 使用率平均值;%MEM:进程占用物理内存的百分比;VSZ:进程占用的虚拟内存大小(KB);RSS:进程占用的物理内存大小(KB,实际使用的内存);STAT:进程状态(如R运行中、S睡眠中、Z僵尸进程)。
筛选进程:
结合 grep 可以快速找到目标进程,比如查看 nginx 相关进程:
ps aux | grep nginx
二、进阶工具:更直观、更专业的监控体验
基础命令满足日常需求,但当需要更美观的界面、更丰富的功能时,进阶工具会更高效。以下工具需要手动安装,但配置简单,体验更佳。
1. htop:top 的增强版(推荐)
htop 是 top 的现代化替代品,界面更友好、功能更强大——支持鼠标操作、颜色区分进程状态、横向滚动查看长命令,还能直接通过菜单杀死进程。
安装方法:
- CentOS/RHEL:
yum install htop -y(需先启用 EPEL 源:yum install epel-release -y); - Ubuntu/Debian:
apt install htop -y。
使用体验:
输入 htop 启动后,界面分为头部系统信息和进程列表:
- 头部显示 CPU 核心数(不同颜色代表不同状态:蓝色=低优先级进程、绿色=正常进程、红色=内核进程)、内存/交换空间使用进度条;
- 进程列表默认按 CPU 使用率排序,鼠标点击列标题可切换排序方式;
- 快捷键
F9可直接选择信号杀死进程(如SIGKILL强制终止),无需输入 PID。
2. vmstat:虚拟内存与系统活动监控
vmstat(Virtual Memory Statistics)主要用于监控系统的虚拟内存、进程、CPU 活动,适合分析系统整体性能趋势,尤其是 I/O 与 CPU 的关系。
基础用法:
输入 vmstat,输出系统整体状态(1次快照):
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4096000 102400 4096000 0 0 0 0 100 200 1 1 98 0 0
关键指标解释:
procs区:r(等待运行的进程数,长期大于 CPU 核心数表示 CPU 不足)、b(等待 I/O 的进程数);memory区:swpd(交换空间使用量)、free(空闲内存)、buff(缓冲区内存)、cache(缓存内存);swap区:si(从交换空间读入内存的大小,非0表示内存不足)、so(写入交换空间的大小,非0表示内存不足);io区:bi(从磁盘读入数据量)、bo(写入磁盘数据量);cpu区:与top一致(us/sy/id/wa/st)。
实时监控:
加上时间间隔(如每2秒刷新一次,共刷新5次):
vmstat 2 5
3. iostat:CPU 与磁盘 I/O 关联分析
很多时候,CPU 高占用并非程序本身导致,而是磁盘 I/O 阻塞(比如数据库查询慢导致进程等待)。iostat 可以同时监控 CPU 和磁盘 I/O,帮你找到根因。
安装方法:
iostat 属于 sysstat 包,需先安装:
- CentOS/RHEL:
yum install sysstat -y; - Ubuntu/Debian:
apt install sysstat -y。
基础用法:
输入 iostat,查看 CPU 和磁盘 I/O 状态:
iostat
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 09/20/2024 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 0.25 0.00 0.00 99.25
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.50 0.00 2.00 0 20
关键指标:
%iowait:CPU 等待磁盘 I/O 的时间百分比(过高说明磁盘性能瓶颈);tps:磁盘每秒 I/O 次数;kB_read/s/kB_wrtn/s:磁盘每秒读写数据量。
监控指定磁盘:
比如监控 sda 磁盘的实时状态(每2秒刷新):
iostat -d -x 2 sda
其中 -x 会显示更详细的磁盘指标(如 %util:磁盘繁忙时间百分比,接近100%表示磁盘满负荷)。
4. sar:历史资源使用情况查询
如果服务器突然出现性能问题,需要回溯历史数据(比如1小时前的 CPU 占用),sar 是最佳选择。它会周期性记录系统资源状态,默认保存最近7天的数据。
基础用法:
- 查看当天 CPU 占用历史(每10分钟一次):
sar -u - 查看昨天14:00-15:00的内存使用情况:
sar -r -f /var/log/sa/sa20 14:00:00 15:00:00(注:
sa20是日期对应的日志文件,比如每月20日的日志) - 实时记录 CPU 状态(每10秒一次,共记录5次):
sar -u 10 5
三、实战场景:如何快速定位性能问题?
掌握命令只是基础,更重要的是结合场景分析。以下是几个常见问题的排查思路:
场景1:CPU 使用率过高
步骤1:用 top 或 htop 按 CPU 排序,找到占用最高的进程(比如 PID=456 的 mysql)。
步骤2:查看该进程的具体行为:
- 用
ps aux | grep 456确认进程名称和启动参数; - 用
strace -p 456跟踪进程的系统调用(比如是否在频繁读写文件或网络); - 用
pidstat -u -p 456 1查看进程的 CPU 细分(用户态/内核态)。
步骤3:如果是数据库进程(如 MySQL),进一步查看慢查询日志;如果是应用进程,检查代码是否有死循环或资源泄漏。
场景2:内存不足(OOM 杀手触发)
步骤1:用 free -h 查看 available 内存是否过低(比如小于总内存的10%)。
步骤2:用 top 或 htop 按内存排序,找到内存占用最高的进程。
步骤3:分析进程内存使用是否合理:
- 用
pmap -x 456查看进程的内存映射(是否有异常的大内存段); - 检查应用是否有内存泄漏(比如 Java 应用用
jmap分析堆内存)。
步骤4:临时解决:关闭非必要进程;长期解决:升级内存或优化应用内存占用。
场景3:CPU 空闲但系统响应慢
现象:top 显示 %idle 很高,但服务卡顿。
排查:这种情况通常是I/O 阻塞导致。用 iostat 查看 %iowait 是否过高,或 vmstat 查看 b(等待 I/O 的进程数)是否大于0。如果是磁盘 I/O 问题,进一步检查磁盘是否满(df -h)或是否有坏道(smartctl)。
四、总结:工具选择指南
不同工具适用于不同场景,总结如下:
- 快速查看整体状态:
top(默认)、htop(推荐,体验更好); - 仅看内存:
free -h; - 进程快照与筛选:
ps aux | grep xxx; - 分析 CPU 与 I/O 关联:
iostat、vmstat; - 回溯历史数据:
sar; - 进程详细内存分析:
pmap、pidstat。
Linux 系统的资源监控工具看似繁多,但只要掌握核心逻辑——先看整体再聚焦细节,结合场景选择工具,就能快速定位问题。建议将常用命令加入 alias(比如 alias htop='htop -d 2' 让 htop 每2秒刷新),提升日常操作效率。

最后提醒:监控工具只是手段,解决性能问题的关键还是理解应用的资源需求——比如数据库需要足够的内存缓存数据,Web 服务器需要足够的 CPU 处理并发请求。只有结合业务场景,才能让监控工具发挥最大价值。








留言0