[26/3/24]top工具
各个 Top 的学习目标
top: 必须会看头部信息以及排序,无需精通htop:能用来查进程树、内存泄漏,杀掉僵尸进程btop:支持鼠标,不用单独学习
Top 工具
- 查看平均负载
第一行的右侧:load average: 0.02, 0.05, 0.00
这三个数字分别代表过去 1分钟、5分钟、15分钟 内系统的平均负载。
要与电脑的逻辑核心数比大小,如果超过逻辑核心数,那么就很卡了。
- 查看 IO 等待
第三行:%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
这一行只看 wa,其全称为:I/O Wait,含义是:CPU 正在“干等”硬盘/网卡读写数据的时间百分比。
如果 wa 数值很高(比如 30.0 甚至更高),说明 CPU 没偷懒,是硬盘读写太慢了。这时候换更快的 SSD 或者优化模型读取方式,而不是去优化代码逻辑。
- 排序显示
(注意都是大写字母!需要 shift)****
M :内存占用排序
P :CPU占用排序
q : 退出 top
Htop 工具
界面布局
A. 顶部区域:系统仪表盘
这是最上面几行,显示的是“整体状况”。
- 左侧:你会看到 CPU 的使用率进度条(通常有 1 到 8 个甚至更多,取决于你的 CPU 核心数),下面是内存和交换分区的进度条。
- 右侧:显示任务、线程、平均负载和运行时间。
B. 中间区域:进程列表
这是占据屏幕最大空间的区域,显示当前正在运行的程序列表。
- 默认情况下,列表是按照 CPU 使用率排序的。
- 每一行代表一个进程,每一列代表不同的属性。
- 最关键的是:你可以用键盘的上下方向键滚动查看,这在普通的
top命令里是做不到的(普通 top 默认只显示一屏)。
C. 底部区域:功能菜单
屏幕最底下有一行带背景色的提示,例如 F1 Help、F2 Setup 等。
顶部系统状态详解
1. CPU 栏:那些颜色代表什么?
你看到的 16 个进度条,里面可能填充了不同颜色。这些颜色代表了 CPU 时间的不同去向:
- 蓝色:表示 低优先级进程 使用的 CPU(Nice 值为正的进程)。
- 绿色:表示 用户空间进程 使用的 CPU(这是我们最常关注的部分,比如你的应用程序、网页等)。
- 红色:表示 内核空间进程 使用的 CPU(系统底层操作,如驱动、文件系统操作)。
- 青色:表示 I/O 等待(CPU 正在等待硬盘或网卡的数据,如果这个很高,说明硬盘读写可能是瓶颈)。
小技巧:如果你想知道确切的含义,在 Htop 界面按 h 键,可以看到帮助图例。
2. 内存栏:物理内存 vs 交换内存
CPU 栏下面通常有两个关于内存的进度条:
- Mem (Memory):物理内存(你的 RAM 条)。
-
- 绿色:已使用的内存。
- 蓝色:缓冲区/缓存。这部分内存虽然被占用了,但如果程序需要,系统会立刻释放它,所以不算真正的“满”。
- Swp (Swap):交换分区(虚拟内存)。
-
- 当物理内存不够用时,系统会把一部分数据临时存到硬盘上。
- 经验法则:如果这个进度条开始变红,说明你的物理内存严重不足,电脑可能会变卡。
3. Load Average(平均负载)
在右上角,你会看到类似 load average: 0.50, 0.60, 0.55 的三个数字。这是衡量系统“忙碌程度”的关键指标:
- 这三个数字分别代表:过去 1分钟、5分钟、15分钟 内的平均负载。
- 怎么判断负载高不高?
-
- 我们要和核心数做对比。你的电脑有 16 个核心。
- 如果平均负载是 1.0,意味着有一个核心在满负荷工作,其他 15 个在休息。
- 如果平均负载是 16.0,意味着所有核心都在满负荷工作。
- 如果平均负载超过 16.0(比如 20.0),说明任务排起了长队,系统开始卡顿了。
对你来说:只要这三个数字通常小于 16,你的系统就是健康的。
进程管理
1. 进程排序:谁占用了最多的资源?
默认情况下,Htop 是按 CPU 使用率(%)从高到低排序的。但有时我们需要找占用内存最大的程序。
- 快捷键法: (注意是大写的,要按 Shift!)
-
- 按
P键:按 CPU 使用率排序(默认)。 - 按
M键:按内存使用率排序。 - 按
T键:按运行时间排序。
- 按
- 鼠标法(如果你的终端支持):
-
- 直接用鼠标点击顶部的列标题(如
CPU%或MEM%),点击一次升序,再点一次降序。
- 直接用鼠标点击顶部的列标题(如
2. 进程搜索:我知道它的名字
如果你想找一个特定的程序(比如你想找 bash 进程),在几百个列表里用眼睛找太累了。
- 操作:按键盘上的
F3键。 - 效果:屏幕底部会出现一个搜索框。
- 输入:输入你要找的进程名(例如
bash),Htop 会自动高亮显示匹配的进程,你可以按F3继续查找下一个匹配项。
3. 进程筛选:只看我想看的
如果你只想看属于当前用户的进程,或者只看名字里包含 python 的进程,筛选功能非常有用。
- 操作:按键盘上的
F4键。 - 效果:屏幕底部会出现一个筛选框。
- 输入:输入关键词(例如
system),列表会瞬间“变干净”,只显示包含该关键词的进程。 - 退出筛选:再次按
F4清空输入框,或者按Esc键退出筛选模式。 - 多个条件可以用
|隔开,比如:bash|python(显示名字里有 bash 或 python 的)。 - 补充:要查看某个用户的进程需要按
u
杀死进程
- 先找到进程,保证高亮行选中需要操作的进程
- 按下
F9或者k这样就可以打开发送列表 - 在发送列表里选择需要发送的信号,然后回车
- 一般是
15正常退出;9强制杀死。
查看进程树
1. 树状视图:看清“家族谱系”
之前我们看到的都是平铺的列表。按一下 F5 键,世界立刻变得立体了。
- 操作:按
F5。 - 效果:列表会变成树状结构,类似于
pstree命令的输出。 - 解读:
-
- 你会看到进程前面有竖线(
│)和分支(├─)。 - 顶层的通常是
systemd(PID 1) 或init,它是所有进程的“祖宗”。 - 父进程与子进程:如果进程 A 下面连着进程 B,那么 A 是父进程,B 是子进程。
- 你会看到进程前面有竖线(
应用场景:
刚才你提到的僵尸进程,在树状视图里通常会标注为 <defunct> 或 <zombie>。如果你发现一个僵尸进程,你需要顺着树状图往上找,找到它的父进程,通常只有重启或杀死父进程,僵尸进程才会消失。
2. 自定义配置:想看什么由你定
有时候我们需要看进程的 IO 情况(读写硬盘的速度),或者想知道进程的启动完整命令,默认的列可能不够用。
- 进入设置:按
F2键。屏幕左侧会出现 Setup 菜单。 - 添加列:
-
- 在左侧菜单选择
Columns(通常默认就是选中这个)。 - 在右侧的列表里移动光标,找到你感兴趣的项,比如:
- 在左侧菜单选择
-
-
IO_RATE:当前的读写速率。PPID:父进程 ID。Command:完整的启动命令(默认显示的比较短)。
-
-
- 选中你想添加的项目,按
F5(Add),它就会出现在右边的已选列表中。
- 选中你想添加的项目,按
- 移动列:在已选列表中,按
F6或方向键调整列的左右顺序。 - 退出设置:按
F10或Esc保存并退出。
3. 设置保存
Htop 会自动将你的配置(包括你添加的列、排序方式、是否开启树状视图等)保存在 ~/.config/htop/htoprc 文件中。下次打开时,它依然是你上次设置的样子。
Nice 值与进程优先级
1. 使用场景
想象这样一个场景:
你在一个边缘设备上部署了一个 AI 模型进行实时视频检测(这是最消耗 CPU/GPU 的任务),同时设备还在后台运行一些日志上传、系统维护脚本。
- 如果不调优先级:后台的日志脚本可能会抢占 CPU,导致你的 AI 检测帧率下降,画面卡顿,这在实时检测中是不可接受的。
- 如果调了优先级:你可以告诉系统:“AI 进程是老板,日志脚本是路人。CPU 必须先伺候好 AI,有空了再去跑日志。”
这就是 Nice 值 的作用。
2. 什么是 Nice 值?
在 Linux 中,优先级用 Nice 值 来表示,范围是 -20 到 19。
- -20:最高优先级(非常“霸道”,也就是很不 Nice)。
- 0:默认优先级。
- 19:最低优先级(非常“谦让”,也就是很 Nice)。
核心逻辑:数值越小,优先级越高;数值越大,优先级越低。
3. Htop 中的操作方法
在 Htop 中,调整优先级非常简单:
- 选中进程:用方向键选中你的目标进程。
- 提高优先级(变小):按键盘上的
F7键(对应Nice -)。这会让 Nice 值变小,进程变得更重要。
-
- 注意:提高优先级(变负数)通常需要 Root 权限。
- 降低优先级(变大):按键盘上的
F8键(对应Nice +)。这会让 Nice 值变大,进程变得谦让。
4. 如何在 Htop 中看 Nice 值?
在进程列表中,有一列叫 NI (Nice)。
- 大部分进程默认是
0。 - 如果你按了
F7,它可能变成-1,-2… - 如果你按了
F8,它可能变成1,2…
5. 补充知识
作为 Edge AI 工程师,Nice 值是压榨硬件性能、保证实时性的利器。
- 高优先级 (-20 ~ -1):留给关键的 AI 推理进程、实时控制进程。
- 默认优先级 (0):留给常规业务。
- 低优先级 (1 ~ 19):留给后台备份、日志清理等无关紧要的任务。
实用补充:H
(注意是大写的 H )
功能:开启/关闭用户线程显示,或者说,用来查看子线程。
因为写的程序可能是多线程的,那么具体是哪个线程导致的性能瓶颈呢?
就需要先按 H 再按 P,按照 CPU 排序看哪个子线程占用最多。
实用补充:s
功能:会调用strace 工具,在屏幕上打印你的程序正在请求的所有操作系统内核接口(系统调用) 。
这可以用来排查,当前的程序那么高占用是为什么,比如说死循环读取一个不存在的文件。
知识点补充:关于内存
实战惊魂场景: 当你把模型部署到一台只有 8GB 内存的边缘设备上,模型跑了几天后,你打开 htop,会惊恐地发现物理内存的进度条几乎是全满的(大部分是蓝色或黄色,取决于终端配色) ! 很多新手此时会立刻慌神,以为发生了严重的内存泄漏,甚至准备重启机器。
Linux 的设计理念是 “Free memory is wasted memory”(空闲的内存就是被浪费的内存) 。 当你的程序读取过一个 1GB 的模型文件后,即使程序退出了,Linux 也会把这 1GB 的数据死死地留在内存的 cache 里。为什么?因为万一你马上又要跑这个模型呢?直接从内存读(极速)总比再去读慢吞吞的硬盘好。
你应该怎么看? 在 htop 里,永远不要被那根长长的、包含 cache 的内存条吓到。 真正衡量你程序是否漏内存的,绝对不是看系统总内存,而是要在下面具体的进程列表里,死死盯住你那个程序的 RES (常驻内存) 这一列。如果 RES 随着时间推移像爬楼梯一样稳步上涨且从不回落,那才是真正的 C++ 内存泄漏!