凌峰创科服务平台

Linux服务器CPU使用率为何居高不下?

CPU 使用率到底是什么?

我们要理解 Linux 是如何计算 CPU 使用率的,CPU 的时间被划分为不同的状态,使用率就是这些状态所占时间的百分比。

Linux服务器CPU使用率为何居高不下?-图1
(图片来源网络,侵删)
  1. us (user space) - 用户空间 CPU

    • 含义:CPU 执行用户进程(应用程序)所花费的时间。
    • us:通常意味着你的应用程序本身很繁忙,比如在进行大量计算、数据处理等,这是最常见的情况。
  2. sy (system) - 内核空间 CPU

    • 含义:CPU 执行内核系统调用(如文件读写、网络收发、内存分配等)所花费的时间。
    • sy:可能意味着系统调用过于频繁,文件 I/O 或网络 I/O 成为瓶颈,一个不健康的程序可能会产生过多的系统调用。
  3. ni (nice) - 优先级进程 CPU

    • 含义:执行通过 nicerenice 命令修改了优先级的用户进程所花费的时间。nice 值越高,优先级越低。
    • ni:通常有后台任务在执行,比如数据库的维护任务、编译任务等。
  4. id (idle) - 空闲 CPU

    Linux服务器CPU使用率为何居高不下?-图2
    (图片来源网络,侵删)
    • 含义:CPU 处于空闲状态,没有执行任何任务。100% - us - sy - ni - wa - hi - si 理论上等于 idid 很高说明 CPU 资源充足。
  5. wa (I/O wait) - 等待 I/O 的 CPU

    • 含义:CPU 空闲,但在等待磁盘或网络 I/O 操作完成。
    • wa这是一个非常关键的指标,它通常意味着磁盘或网络是瓶颈,而不是 CPU,CPU 闲着没事干,只能等着数据从磁盘或网络过来,你应该优先优化磁盘或网络,而不是 CPU。
  6. hi (hardware interrupts) - 硬件中断

    • 含义:CPU 响应硬件设备(如网卡、磁盘控制器)发出的中断请求所花费的时间。
    • 持续高 hi:通常指向某个硬件设备存在问题,例如网卡流量异常巨大或出现错误。
  7. si (software interrupts) - 软件中断

    • 含义:内核对硬件中断进行处理后,执行相关的软件处理逻辑所花费的时间。
    • 持续高 si:与 hi 类似,通常也是网络流量巨大或驱动问题的信号。

如何查看 CPU 使用率?

top - 实时动态视图 (最常用)

top 是一个交互式的进程查看器,可以实时显示系统资源使用情况。

Linux服务器CPU使用率为何居高不下?-图3
(图片来源网络,侵删)
top

关键解读:

  • 第一行 (Tasks, %Cpu(s), KiB Mem, KiB Swap)
    • %Cpu(s) 这一行是核心,你会看到 us, sy, ni, id, wa, hi, si 等所有 CPU 状态的百分比,这是判断 CPU 瓶颈类型的首要依据。
    • KiB Mem 显示总内存、已用、空闲、缓冲和缓存。
  • 下面是一个进程列表
    • %CPU:该进程的 CPU 使用率。
    • COMMAND:进程名或命令。
    • P 键可以按 %CPU 降序排列,快速找到最耗 CPU 的进程。
    • M 键可以按内存使用率降序排列。
    • q 键退出。

htop - top 的增强版 (推荐)

htoptop 的一个更现代化、更友好的替代品,颜色编码、垂直/水平分割、鼠标操作等功能使其更易用。

# 如果没有,需要先安装
# CentOS/RHEL: sudo yum install htop
# Ubuntu/Debian: sudo apt-get install htop
htop

关键解读:

  • 界面更直观,CPU 和内存的使用情况有彩色的条形图。
  • 进程列表操作更便捷,可以直接用鼠标点击排序或杀死进程。
  • 可以通过 F2 键进入设置,自定义要显示的列。

vmstat - 虚拟内存统计

vmstat 提供了进程、内存、分页、块 I/O、 traps 和 CPU 活动的摘要信息。

# 每2秒刷新一次,共刷新5次
vmstat 2 5

关键解读:

  • r:运行队列中进程的数量,如果这个数持续大于 CPU 的核心数,说明 CPU 负载很重。
  • us, sy, id, wa, st:这些列的含义与 top 一致,但它们是自上次刷新以来的平均值st (steal time) 是在虚拟化环境中,虚拟 CPU 等待物理 CPU 的时间,高 st 说明宿主机过载。

mpstat - 多 CPU/核心统计

mpstat 可以显示每个 CPU 核心的详细统计信息,这对于多核系统非常有用。

# 显示所有CPU的平均情况
mpstat
# 每隔2秒刷新一次,显示每个核心的详细情况
mpstat -P ALL 2

关键解读:

  • 你可以看到 CPU 列为 0, 1, 2... 的行,这表示每个物理核心的使用情况,如果某个核心 us 特别高,而其他核心很闲,说明你的应用可能没有做好多线程优化。

/proc/stat - CPU 信息的底层来源

所有上述命令的数据都来源于 /proc/stat 文件,你可以直接查看它。

cat /proc/stat

第一行 cpu 是所有核心的汇总,cpu0, cpu1 等是单个核心的数据,这是一个非常底层的接口,通常用于编写监控脚本。


CPU 使用率高,如何排查?

当发现 CPU 使用率持续很高时,遵循以下步骤进行排查:

第 1 步:初步定位

  1. 运行 htoptop
  2. 观察 %Cpu(s) 行,判断是哪种 CPU 状态高(us, sy, wa 等)。
    • us:应用问题,进入第 2 步。
    • sy:系统调用问题,进入第 2 步。
    • wa:I/O 问题,不要急着杀进程,先检查磁盘和网络性能。
    • hi/si:硬件/驱动问题,检查网卡流量等。

第 2 步:找到元凶进程

  1. htop 中按 P (大写) 按 CPU 使用率排序。
  2. 找到 CPU 使用率最高的那个或几个进程。
  3. 记下它们的 PID (进程ID) 和 COMMAND (命令名)

第 3 步:深入分析进程

假设你发现了一个高 CPU 的进程,java (PID 1234)。

方法 A:使用 tophtop 的线程视图

这是最直接的方法。

# 在htop中,按 t 键可以显示/隐藏线程
# 按H键可以切换显示线程模式
# 找到高CPU的线程,记下它的线程ID (TID)
# 在top中,按H键可以显示/隐藏线程
# 然后按 f 键,选择 "PID" 列,按 Enter 确认,这样就可以按线程排序了

方法 B:使用 ps 命令

# 显示所有进程,并按 %CPU 排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu
# 查看特定进程的线程
ps -Tp 1234 -o %cpu,tid,cmd
# -Tp 1234: 显示PID为1234的线程
# -o %cpu,tid,cmd: 指定要显示的列:CPU使用率, 线程ID, 命令

方法 C:使用 pidstat (最推荐)

pidstatsysstat 包的一部分,功能非常强大,可以监控特定进程的资源使用情况。

# 每隔2秒查看PID为123
分享:
扫描分享到社交APP
上一篇
下一篇