top命令输出结果详解


其他相关
JVM调优实战 - deyang - 博客园
命令Linux\MySQL\Java - deyang - 博客园

top命令输出:

显示界面说明

top 界面分为两部分:系统概览区域进程列表区域

1. 系统概览区域

第一行:系统运行时间和负载
top - 15:30:45 up 10 days,  3:22,  2 users,  load average: 0.15, 0.10, 0.05
  • 15:30:45:当前时间
  • up 10 days, 3:22:系统已运行时间
  • 2 users:当前登录用户数
  • load average:系统1分钟、5分钟、15分钟的平均负载 【系统负载(Load Average):单位时间内处于可运行/不可中断状态的进程平均数】,对于单核CPU,1.00表示满负荷。对于多核CPU(例如8核),负载达到8.00才表示满负荷。数值低于1.00通常表示系统很空闲。
第二行:任务统计
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
  • 总进程数、运行中、休眠中、已停止和僵尸进程数量
第三行:CPU 使用情况
%Cpu(s):  5.3 us,  1.2 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • us:用户空间占用CPU百分比
  • sy:内核空间占用CPU百分比
  • ni:用户进程空间内改变过优先级的进程占用CPU百分比
  • id:空闲CPU百分比
  • wa:等待IO的CPU时间百分比
  • hi:硬件中断占用百分比
  • si:软件中断占用百分比
  • st:虚拟机偷取时间百分比
第四、五行:内存使用
MiB Mem :   7856.8 total,   1024.2 free,   4096.0 used,   2736.6 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   3248.8 avail Mem
  • 物理内存和交换分区的总量、空闲量、使用量和缓存

  • 进一步验证了核心公式:total = used + free + buff/cache

    63869700 (total) = 5316720 (free) + 52882548 (used) + 5670432 (buff/cache)

2. 进程列表区域

默认显示的列:

  • PID:进程ID
  • USER:进程所有者
  • PR:进程优先级
  • NI:nice值(负值表示高优先级,正值表示低优先级)
  • VIRT:进程使用的虚拟内存总量(KB)
  • RES:进程使用的、未被换出的物理内存大小(KB)
  • SHR:共享内存大小(KB)
  • S:进程状态(D=不可中断,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸)
  • %CPU:上次更新到现在的CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比
  • TIME+:进程使用的CPU时间总计(1/100秒)
  • COMMAND:命令名/命令行

常用交互命令

top 运行时可以输入以下命令:

排序控制

  • P:按CPU使用率排序(默认)
  • M:按内存使用率排序
  • T:按时间/累计时间排序
  • N:按PID排序
  • R:反向排序

显示控制

  • l:切换显示平均负载和启动时间
  • t:切换显示进程和CPU状态信息
  • m:切换显示内存信息
  • 1:展开显示各CPU核心的统计数据

进程控制

  • k:终止进程(输入PID)
  • r:重新设置进程的nice值

刷新控制

  • ds:改变刷新间隔(秒)
  • Space:立即刷新显示
  • q:退出top

命令行选项

top -d 5       # 设置刷新间隔为5秒
top -p 1234    # 仅监视PID为1234的进程
top -u username # 仅监视指定用户的进程
top -n 2       # 刷新2次后退出
top -b         # 批处理模式,输出到文件
top -H         # 显示线程而不是进程
top -c         # 显示完整命令路径

实用技巧

  1. 查找高CPU进程:运行top后按P
  2. 查找高内存进程:运行top后按M
  3. 监控特定用户top -u username
  4. 保存top输出top -b -n 1 > top.log
  5. 显示完整命令:运行top后按c
  6. 显示线程:运行top后按H

top 是系统管理员和开发人员诊断性能问题的重要工具,熟练掌握它可以快速定位系统资源瓶颈。

系统级 CPU 使用率和进程级 CPU 使用率

top 命令中,第三行的 CPU 使用情况(%Cpu(s)进程列表区域的 %CPU 有密切关联,但代表的含义不同:


1. 第三行的 %Cpu(s)(系统级 CPU 使用率)

这一行显示的是 整个系统 的 CPU 使用情况,按不同的 CPU 时间类型 划分:

%Cpu(s):  5.3 us,  1.2 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • us(user):用户空间进程占用的 CPU 百分比(普通应用程序)。
  • sy(system):内核空间占用的 CPU 百分比(系统调用、中断等)。
  • ni(nice):低优先级(nice 调整过)的用户进程占用的 CPU。
  • id(idle):CPU 空闲百分比。
  • wa(iowait):CPU 等待 I/O 操作的百分比(磁盘、网络等阻塞)。
  • hi(hardware interrupt):硬件中断占用的 CPU。
  • si(software interrupt):软件中断占用的 CPU。
  • st(steal time):虚拟机被 Hypervisor 偷走的 CPU 时间(仅虚拟化环境)。

这些值的总和是 100%,表示整个 CPU 的使用情况。


2. 进程列表的 %CPU(进程级 CPU 使用率)

在进程列表中,%CPU 表示 单个进程占用的 CPU 百分比

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
1234 root      20   0  500000  20000   5000 R  25.0  1.2   0:10.25 python3
  • %CPU:该进程 占用 CPU 的时间比例,计算方式:
    • 单核 CPU:如果某个进程占满 1 个核心,%CPU 会显示 100%
    • 多核 CPU:如果某个进程占满 1 个核心(如 4 核 CPU),%CPU 可能显示 100%(表示占用了 1 个核心的 100%),但 总和可以超过 100%(如 400% 表示占满 4 个核心)。

3. 两者的关系

对比项 第三行 %Cpu(s) 进程 %CPU
范围 整个系统的 CPU 使用情况 单个进程的 CPU 占用
计算方式 所有 CPU 核心的汇总(总和 100%) 单个进程占用的 CPU 时间比例(可以超过 100%)
示例 us=30%(所有用户进程占 30%) python3 %CPU=50%(该进程占 50% CPU 时间)

关键区别

  • 第三行 %Cpu(s)全局视角,告诉你 CPU 被哪些类型的任务占用(用户、内核、I/O 等)。
  • 进程 %CPU单个进程视角,告诉你某个进程具体占用了多少 CPU 资源。

如何结合使用?

  1. 如果 us(用户空间 CPU)很高 → 查看哪些进程 %CPU 高(按 P 排序)。
  2. 如果 sy(系统 CPU)很高 → 可能是内核任务或频繁系统调用(如 kworker 进程)。
  3. 如果 wa(I/O 等待)很高 → 检查磁盘或网络 I/O 瓶颈(iotop 辅助分析)。

总结

  • %Cpu(s) = 整个系统的 CPU 使用分布(按任务类型划分)。
  • %CPU = 单个进程的 CPU 占用率(可以超过 100%,在多核系统上)。
  • 两者结合 可以更精准地分析 CPU 瓶颈来源。

如果你发现系统 CPU 使用率高(如 us=80%),可以按 P 排序进程,找出 %CPU 最高的进程进行优化。

CPU 使用总和"安全范围"

在 Linux 系统中,%Cpu(s) 的整体使用情况没有一个绝对的"安全范围",因为不同应用场景对 CPU 的负载容忍度不同。但我们可以根据经验给出一般性建议:

1. 通用参考标准(非生产环境)

CPU 使用分类 建议关注阈值 可能的影响
us(用户进程) < 70% 正常应用运算,过高可能导致响应变慢
sy(系统进程) < 20% 过高可能预示内核瓶颈(如频繁系统调用)
wa(I/O 等待) < 5% 过高说明磁盘/网络是瓶颈(检查 iostat
id(空闲) > 20% 剩余 CPU 资源缓冲,低于此值可能压力大

总和参考

  • 短期峰值:允许 100%(如突发计算任务)。
  • 长期负载:建议平均 ≤ 70%~80%(留出余量应对突发请求)。

2. 生产环境关键建议

(1) 不同类型服务的关注点
  • CPU 密集型服务(如科学计算、AI训练):
    • 允许 us 长期较高(如 80%~90%),但需监控是否影响其他服务。
  • I/O 密集型服务(如数据库、Web服务器):
    • 重点监控 wa(应 < 10%),高 wa 可能需优化磁盘或网络。
  • 低延迟敏感服务(如金融交易):
    • 控制 us + sy < 60%,避免调度延迟。
(2) 多核 CPU 的注意事项
  • 如果系统有 N 个逻辑核心
    • 单个进程的 %CPU 可能达到 100% × N(如 8 核 CPU 上 800%)。
    • 全局 %Cpu(s) 仍以 100% 为基准(所有核心的均值)。

3. 异常情况判断

以下情况需要警惕:

  1. us 长期 > 90%
    → 应用层可能需优化代码或扩容。
  2. sy 长期 > 30%
    → 检查内核态开销(如系统调用频繁、上下文切换 cs 过高)。
  3. wa > 10%
    → 使用 iostat -x 1 查看磁盘利用率(%util)。
  4. id < 10% 且负载高
    → 系统已过载,需扩容或优化。

4. 如何动态监控?

  • 结合 load average(平均负载)
    • 如果 1 分钟负载 > CPU 核心数,且 id 低,说明 CPU 饱和。
    • 示例:4 核 CPU 负载 > 4 需关注。
  • 使用 vmstat 1
    • 查看 r(运行队列长度)和 cs(上下文切换次数)。
  • 长期趋势分析
    • 通过 sar -u 记录历史数据,观察峰值规律。

总结

  • 安全范围:长期平均 us + sy ≤ 70%~80%,id ≥ 20%。
  • 核心原则
    • 留出余量应对突发流量。
    • 关注 wasy 的异常增长。
    • 结合负载和核心数综合判断。

如果系统长期接近 100%,即使未报错,也应考虑优化或扩容!

显示每个 CPU 核心情况

top 命令中,按下 1(数字键1)可以 展开显示每个 CPU 核心的详细使用情况,而默认情况下 top 显示的是 所有 CPU 核心的汇总数据。它们之间的关系如下:


1. 默认视图(汇总所有 CPU 核心)

示例:

%Cpu(s):  8.3 us,  2.1 sy,  0.0 ni, 89.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • 这个数据是 所有 CPU 核心的平均值
  • 例如,如果系统有 4 个 CPU 核心8.3% us 表示:
    • 所有核心 的用户态 CPU 使用率 平均为 8.3%
    • 不代表每个核心都是 8.3%,可能有的核心 20%,有的核心 0%。

2. 按下 1 后(显示每个 CPU 核心的独立数据)

示例(4 核 CPU 系统):

%Cpu0  : 15.0 us,  3.0 sy,  0.0 ni, 82.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  5.0 us,  1.0 sy,  0.0 ni, 94.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 10.0 us,  2.0 sy,  0.0 ni, 88.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  3.0 us,  2.0 sy,  0.0 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • %Cpu0%Cpu1%Cpu2%Cpu3 分别代表 每个 CPU 核心的独立使用情况
  • 默认的汇总数据(%Cpu(s))是这些值的平均值
    • us(用户态)平均值 = (15.0 + 5.0 + 10.0 + 3.0) / 4 = 8.25 ≈ 8.3(与默认视图一致)
    • id(空闲)平均值 = (82.0 + 94.0 + 88.0 + 95.0) / 4 = 89.75 ≈ 89.6(与默认视图一致)

3. 关键关系

对比项 默认视图(%Cpu(s) 按下 1 后的视图(%Cpu0%Cpu1...)
数据来源 所有 CPU 核心的平均值 每个 CPU 核心的独立数据
计算方式 所有核心的 ussyid 等取平均 每个核心单独统计
适用场景 快速查看整体 CPU 负载 分析 CPU 负载是否均衡

4. 实际应用场景

(1) CPU 负载不均衡
  • 如果 某个核心的 us 很高(如 %Cpu0: 90% us),但其他核心很低(如 %Cpu1: 10% us
    • 可能是 单线程应用 只跑在一个核心上。
    • 也可能是 CPU 亲和性(affinity)设置问题,导致任务未均匀分配。
(2) 判断 CPU 瓶颈
  • 默认视图 %Cpu(s): 80% us
    • 如果 每个核心的 us 都接近 80%所有核心均满载,需扩容 CPU
    • 如果 只有 1 个核心 us=80%,其他核心 us=20%单线程瓶颈,需优化并行度
(3) 监控多核 CPU 的利用率
  • 理想情况:所有核心的负载接近平均值(均衡分布)。
  • 异常情况:某个核心长期 100%,其他核心空闲 → 可能存在 CPU 亲和性问题单线程任务阻塞

5. 如何进一步分析?

  • taskset:查看或设置进程的 CPU 亲和性(绑定到特定核心)。
  • mpstat -P ALL 1:实时监控每个 CPU 核心的使用情况(类似 top1 的效果)。
  • pidstat -t -p <PID> 1:查看某个进程的线程在哪些 CPU 核心上运行。

总结

  • 默认 %Cpu(s) 是所有 CPU 核心的平均值。
  • 按下 1 可查看每个核心的独立数据,帮助判断 CPU 负载是否均衡
  • 如果某个核心长期高负载,而其他核心空闲,可能是单线程任务或 CPU 亲和性问题,需要优化任务分配。

通过对比 默认视图单核视图,可以更精准地定位 CPU 性能瓶颈!

posted @ 2025-06-24 09:51  deyang  阅读(348)  评论(0)    收藏  举报