如何查看服务器实时负载|CPU 内存过高(服务器性能排查教程)

发布时间:2026-07-23 17:06

当服务器出现响应缓慢、网站加载超时或数据库连接失败时,最直接的原因往往是CPU或内存资源耗尽。如果不掌握查看实时负载的方法,排查问题就像在黑暗中摸索。本教程将带你从零开始,使用命令行工具和系统监控命令,精准定位服务器性能瓶颈。无论你是刚接触服务器的运维新手,还是需要临时排查问题的开发者,按照以下步骤操作,都能在5分钟内拿到关键数据。

## 前置准备

- 一台运行Linux系统的服务器(本教程以CentOS 7/8、Ubuntu 20.04/22.04为例,命令通用)

- 通过SSH客户端(如Termius、Xshell、Putty)登录服务器的权限,建议使用root用户或具有sudo权限的普通用户

- 基本的命令行操作常识:知道如何输入命令、按Enter执行、按Ctrl+C中断持续输出的命令

- 确认服务器已安装以下基础工具(绝大多数系统默认已安装):top、htop(可选)、free、df、iostat、vmstat、netstat或ss。如果缺少htop,可通过命令安装:CentOS使用`yum install htop -y`,Ubuntu使用`apt install htop -y`

## 分步操作步骤

### 1. 使用top命令快速查看实时CPU和内存概览

登录服务器后,在命令行输入`top`并回车。你会看到一个全屏动态刷新的表格,这是最基础的性能看板。重点关注以下几个区域:

- **第一行:系统概况**。显示当前时间、系统已运行时间、登录用户数、负载平均值(load average)。负载平均值有三个数值,分别代表过去1分钟、5分钟、15分钟的平均负载。如果1分钟数值远高于5分钟和15分钟,说明系统正在经历瞬时压力;如果三个数值都持续高于CPU核心数(例如4核CPU负载超过4.0),说明CPU资源严重不足。

- **第二行:进程与任务**。显示总进程数、正在运行(running)、休眠(sleeping)、停止(stopped)、僵尸(zombie)进程数量。如果僵尸进程数不为0,说明有进程未能正常退出,可能需要手动清理。

- **第三行:CPU状态**。us(用户空间占用百分比)、sy(内核空间占用百分比)、id(空闲百分比)、wa(等待I/O完成百分比)。当`wa`超过30%时,说明磁盘读写速度拖累了CPU,需要检查磁盘性能。当`id`长时间低于20%,说明CPU极度繁忙。

- **第四行和第五行:内存与交换分区**。Mem行显示物理内存总量、已用、空闲、缓存/缓冲区。Swap行显示交换分区使用情况。如果Swap的used值持续增长且不为0,说明物理内存不足,系统正在使用硬盘作为内存,这会导致性能急剧下降。

在top界面中,按`1`键可以展开显示每个CPU核心的使用率,按`q`键退出top。如果想按内存占用排序,先按`Shift+M`(大写M);想按CPU占用排序,按`Shift+P`。找到占用资源最高的进程,记住其PID(进程ID),后面排查时会用到。

### 2. 使用free命令精确分析内存使用细节

top给出的内存数据比较概括,使用`free -h`命令可以查看更清晰的内存分布。执行命令后,你会看到类似这样的输出:

```

total used free shared buff/cache available

Mem: 7.6G 3.2G 1.1G 245M 3.3G 3.9G

Swap: 2.0G 0.0B 2.0G

```

- **total**:物理内存总量

- **used**:已使用的内存(包含buff/cache)

- **free**:完全未被使用的内存

- **buff/cache**:系统用于缓存和缓冲的内存,这部分在应用程序需要时可以自动释放,因此不算真正的“已用”

- **available**:真正可用的内存(包括free和可回收的buff/cache)。这个数值才是判断内存是否充足的关键。如果available长期低于总内存的10%,说明内存紧张。

当发现内存不足时,执行`ps aux --sort=-%mem | head -20`可以列出内存占用前20的进程。重点关注那些占用超过10%的进程,判断是否为异常程序(比如挖矿病毒、内存泄漏的Java应用)。对于可疑进程,使用`kill -9 PID`强制终止,但需确认该进程不是关键服务。

### 3. 使用htop获得更直观的交互式监控

如果觉得top界面不够友好,可以安装并使用htop。执行`htop`命令后,你会看到彩色进度条和更清晰的布局。顶部有CPU、内存、Swap的条形图,下方进程列表支持鼠标点击操作。常用快捷键:

- **F6**:选择排序方式(按CPU、内存、PID等)

- **F9**:杀死选中的进程

- **F10**:退出

- **箭头键**:上下移动选中进程

htop特别适合需要长时间观察的场景,因为它支持横向滚动查看进程的完整命令行参数。如果某个进程的CPU占用率持续在100%附近波动,且进程名看起来像随机字符串(如`xmr`、`minerd`、`systemd-logind`等),极有可能是挖矿病毒。此时应立刻记录PID,然后使用`ls -l /proc/PID/exe`查看该进程对应的可执行文件路径,再通过`kill -9 PID`终止进程,最后删除对应文件并检查定时任务(`crontab -l`)是否有异常条目。

### 4. 结合vmstat和iostat定位磁盘I/O瓶颈

当CPU的`wa`值偏高时,需要检查磁盘性能。执行`vmstat 1 5`(每1秒输出一次,共5次),重点关注以下列:

- **r**:等待CPU运行的进程数。如果该值持续大于CPU核心数,说明CPU繁忙。

- **b**:处于不可中断睡眠状态的进程数(通常是在等待I/O)。如果该值长期大于0,说明磁盘I/O存在阻塞。

- **si、so**:从磁盘交换到内存(si)和从内存交换到磁盘(so)的数据量。如果这两个数值持续不为0,说明物理内存不足,正在大量使用交换分区。

进一步使用`iostat -x 1 3`查看每个磁盘的详细性能。关注以下指标:

- **%util**:磁盘处理I/O请求的忙碌百分比。如果该值接近100%,说明磁盘已达到性能上限,需要升级SSD或增加磁盘数量。

- **r/s、w/s**:每秒读/写请求次数。

- **rMB/s、wMB/s**:每秒读/写的数据量。对比磁盘的理论最大吞吐量(机械硬盘约100-200MB/s,SATA SSD约500MB/s,NVMe SSD约3000MB/s),判断是否达到瓶颈。

如果发现某个磁盘的%util持续100%,但数据量并不大(比如rMB/s只有几MB),说明存在大量小文件随机读写,常见于数据库或日志服务。此时可以尝试优化应用(如调整MySQL的innodb_io_capacity参数)或更换更高随机读写性能的磁盘。

### 5. 使用netstat或ss排查网络连接导致的资源占用

高CPU或内存有时并非由计算或存储引起,而是网络连接数过多。执行`ss -s`查看当前服务器的网络连接统计:

```

Total: 1234 (kernel 0)

TCP: 567 (estab 345, closed 0, orphaned 0, synrecv 0, timewait 123)

```

重点关注**estab**(已建立连接数)和**timewait**(等待关闭的连接数)。如果timewait数量超过1000,说明存在大量短连接未及时回收,可能导致端口耗尽。执行`ss -tan | grep TIME-WAIT | wc -l`可以精确统计TIME-WAIT数量。

如果发现某个端口(比如80或443)的连接数异常高,使用`ss -tan | grep :80 | awk '{print $6}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10`可以查看连接该端口的TOP10 IP地址。如果某个IP的连接数超过正常范围(比如单个IP超过100个连接),可能是被恶意攻击或爬虫过度抓取。此时可以在防火墙中临时屏蔽该IP:`iptables -A INPUT -s 该IP地址 -j DROP`(CentOS)或`ufw deny from 该IP地址`(Ubuntu)。

## 常见问题

**问题1:执行top或htop时,显示“command not found”**

原因:系统未安装该工具。对于top,几乎所有Linux发行版都预装,如果确实没有,执行`yum install procps-ng -y`(CentOS)或`apt install procps -y`(Ubuntu)。对于htop,按照前置准备中的安装命令操作即可。

**问题2:使用free -h发现available内存很少,但top显示used不高**

原因:buff/cache占用了大量内存,但系统认为这部分可以回收。执行`sync && echo 3 > /proc/sys/vm/drop_caches`可以手动清理缓存(需要root权限)。注意:这会清除文件系统缓存,可能导致后续磁盘读取变慢,但不会影响正在运行的进程。如果清理后available恢复正常,说明内存压力不大;如果清理后available仍然很低,说明物理内存确实不足。

**问题3:vmstat显示b列(等待I/O的进程)持续大于0,但iostat显示磁盘%util不高**

原因:可能是磁盘控制器或驱动问题,也可能是文件系统元数据操作导致。执行`strace -p 等待I/O的进程PID`可以跟踪该进程的系统调用,查看具体卡在哪个操作上。另外检查磁盘健康状态:`smartctl -a /dev/sda`(需要安装smartmontools),查看Reallocated_Sector_Ct(重映射扇区数)和Current_Pending_Sector(待处理扇区数),如果这两个数值不为0,说明磁盘存在物理坏道,需要尽快更换。

**问题4:使用kill -9终止高占用进程后,CPU或内存没有立即下降**

原因:进程可能已经变成僵尸进程(Z状态)。执行`ps aux | grep Z`查看是否有状态为Z的进程。僵尸进程无法被杀死,需要杀死其父进程才能清理。使用`ps -o ppid= -p 僵尸进程PID`找到父进程PID,然后`kill -9 父进程PID`。如果父进程是init(PID为1),则无法直接杀死,需要重启服务器。

**问题5:服务器负载突然飙升,但top中没有任何进程占用高CPU**

原因:可能是内核线程或硬件中断导致。执行`top -d 1`然后按`1`键查看每个CPU核心的使用率,如果某个核心的si(软中断)或hi(硬中断)占比很高,说明有大量网络数据包或硬件中断在消耗CPU。执行`cat /proc/interrupts`查看中断分布,如果某个中断号(如eth0的TX/RX)计数增长极快,说明网卡驱动或网络流量异常。可以尝试调整网卡队列:`ethtool -L eth0 combined 1`(将多队列合并为单队列,临时缓解)。

## 收尾总结

通过以上五个步骤,你已经掌握了从CPU、内存、磁盘I/O到网络连接的全方位排查方法。每次遇到服务器性能问题,建议按照以下顺序操作:先用`top`和`free -h`快速判断是CPU还是内存紧张,接着用`vmstat`和`iostat`定位是否由磁盘I/O引起,最后用`ss`检查网络连接。如果发现异常进程,立刻记录PID并追踪其来源。养成定期使用`htop`观察系统负载的习惯,在问题发生前就能发现苗头。记住,排查性能问题的核心是“数据驱动”——不要凭感觉猜测,而是让每个命令输出的数字告诉你真相。