💡 简介
htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing),支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。与top相比,htop有以下优点:
- 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行
- 在启动上,比top 更快
- 杀进程时不需要输入进程号
- htop 支持鼠标操作
⚙ 安装
-
Debian 安装
1
apt install htop
-
CentOS 安装
1
yum install -y htop
📊 指标介绍
身为一名程序员,一定多多少少用过top或者htop,虽然大家都说htop很好用,但许多人打开htop也只看得懂CPT、Mem、PID、Command这些简单的栏位,对于Load average、NI、State、SHR就没那么熟悉。
接下来就给大家介绍htop每个栏位的意义是什么
CPU
首先来说说最重要的CPU,在htop左上角会列出各CPU的使用率,值得注意的是这里显示的是CPU的逻辑核心数,譬如说你的电脑有四核心八线程,意思是同时可以执行八个thread,那么这里就会显示八个CPU。
另外不知道有没有人注意到这个使用率的bar包含了红色和绿色,有时甚至还会有蓝色等其他颜色,这其实是有意义的:
- 红色 代表的是 Kernel thread 占用的CPU,像是系统需要自动做process scheduling、memory management 等待,是整个系统中最重要、优先级也是最高的任务
- 绿色 代表的是 normal priority thread,进程的优先级比 kernel thread 低一些,一般来说使用者执行的程序如果没有特别调整优先级的化,都会在这一类。
- 蓝色 代表的是 low priority thread,因为优先级比较低、分配到的CPU自然也比较少,适合
我ok,你先跑
那类比较无关紧要的process,如果CPU已经被操到快不行了,或是memory真的不够用了,第一个杀掉的也是这类process
Memory & Swap
紧接在CPU下面的是memory跟swap的使用量,memory这边应该大家都看得懂,值得一提的是它的颜色也是有意义的:
- 绿色 指的是被process占用的内存量,譬如说你开的浏览器、VSCode、终端等等程序,还有正在执行的htop都算是这一类
- 蓝色 则是 buffer pages,它是用来储存一些 metadata。譬如说当你的i一次执行
ls -l
时系统回去硬盘看看这个文件夹有哪些文件,每个文件的权限等等,然后帮你存在 buffer pages 里面,当你短时间内再执行ls -l
时就不用再进入硬盘(因为这个操作很慢)了,直接从 buffer 中拿即可。 - 黄色 是 cache pages ,跟 buffer 很像,只不过 buffer 存的是 metadata,而 cache存的是文件内容。像你第一次下
cat index.js
时就会把内存读取到 cache pages,如果你 cat之后发现代码太长,决定先看前十行就好了,那执行下head -n 10 index.js
就会从cache pages
中直接读取
这也代表着内存使用量并非越低越好,毕竟放在那里闲着也没啥用,不如让系统把闲置的一部分拿去当 buffer 跟 cache,读取时能不碰硬盘就不碰硬盘,这样才可以让程序执行得更快。
Load average
接下来看看界面右上角那堆神奇的数字
首先 Tasks 栏位的 25, 50 thr; 1 running
代表的是目前总共有 25 个进程、 50 个线程,其中 1 个线程正在运行(这数字最大就是你的逻辑核心数)
而 Load average 是用来判断目前系统有多繁忙,三个数字分别代表的是系统在最近 1 分钟、5 分钟、15 分钟内,平均有多少个 thread 需要CPU。
一般来说服务器完全没在用时 LA 会低于 1,例如上图中这台服务器就是。
所以如果觉得自己运行的程序跑得很慢,不妨先看看 LA 确认瓶颈是不是在 CPU,如果 LA 很低且程序慢得夸张,那么很有可能时程序并没有善用多核心,或是瓶颈卡在了硬盘跟网路IO上;如果 LA 已经很高了但还是觉得太慢,那就只能改善算法或是换更快的 CPU 了。
PID/USER
上面讲完之后来看看下面这一大块,这部分每行都是一个进程,而 PID 就是每个 process 的 ID。
那知道 PID 之后可以干嘛呢?其实它的用途还是挺多的,譬如说你可以用 kill -KILL <pid>
来杀掉某个process;或是使用 kill -STOP
来暂停 process,再用 kill -CONT
让它继续运行(这超好用👍,但是很多人都不知道)
而 USER 栏位则没什么好解释的了,这代表的就是把这个 process 跑起来的用户。不管程序是谁写的,只要是我把它跑起来,那么 USER 那栏就会显示处我的用户名
PRI & NI
接下来的 Priority 跟 Nice 两个都是跟优先级有关的指标,注意数字越小表示优先级越高,也就可以分配到越多的 CPU 时间
其中 PRI 是由系统帮你决定的,无法自行修改。
而 Nice 的部分预设值是 0,可以用 renice -n 19 -p <pid>
调整到最低优先级 19,想要调高的话最高也可以调到 -20
虽然 nice 值可以随自己喜好调高调低,但系统不见得都会听你的。有的系统比较友善会愿意参考你设的 nice 值,但也有一些只看 PRI,而根本不在乎 nice(你设你的我排我的),所以不要太期待提高 nice 可以为性能带来多大的变化。
VIRT/RES/SHR
这三个数字都是跟内存有关系的,分别代表 Virtual memory、Resident、Shared memory
Virtual memory 的概念比较复杂一点,但基本上你可以把它想成 process 可以存取到的 memory 的综合。譬如说 head -n indes.js
内部运作的方式是先把 index.js
打开,然后读取前十行。虽然它只读取前十行,但 head process 已经把文件打开了(它其实由权限到整个文件的内容只是它没有这么做),所以 virtual memory 会把整个文件的大小都算进去。
而 Resident 正好相反,它指的是物理上这个进程到底占用了多少内存空间。以同样的例子来说,如果你只读取前十行,那么系统就只把前十行从硬盘读进内存,RES 也只算那世行。
因此在 htop 中 RES 一定会小于 VIRT,而且通常是远小于。
而 Shared memory 的话顾名思义就是可以跟别的进程分享的 memory,像程序执行时常常会用的 glibc
,或是在读取 read-only 文件时,这些东西都只需要读进内存一次就可以了,所以就会被算进 SHR 里面
虽然能跟其他 process 共用内存是好事,但这种事也强求不来,所以我一般只看 RES,很少在管 SHR 是多少
State
接着来看这小小一个 S,代表的是进程的状态,比较常见的有以下几个状态:
-
R:意思是进程正在跑或者是在运行队列里面等待CPU执行
如果你的程序长时间处于 R 状态但还是跑得很慢,代表的是程序算法效率太慢,或者是 CPU 是在太忙一直把这个进程放在队列里面(这可以再透过 CPU% 指标来确认是哪个问题)
-
S:目前正在休眠,有事做才会醒来
通常定时执行的、要用户互动的程序如 ping 常常会处于 S 状态,毕竟 ping 一秒只发送一个封包,但现今的 CPU 一秒就可以跑十亿个循环,所以 CPU 当然在 ping 发包过后就马上跑这个进程踢到一边去睡觉,等一秒后睡醒了再回来
-
D:这个也是在休眠,只不过等待的一定是 IO,譬如说读取文件,写入文件等等
如果你的进程长时间处于 D 状态,代表 IO 所占的时间比较多,是不是就被 CPU 踢出去然后睡觉去了。因此想要改善性能也要从 IO 着手,譬如用 redis 做快存或是换 SSD 等等,若只是单纯更换程序语言或是升级 CPU 可能没什么效果
CPU%/MEM%
CPU% 意思是在你这段时间平均用了几颗 CPU,因为 htop 预设 3 秒更新一次,加入前 1.5 秒你用了一颗,后 1.5 秒都没用,那平均就是 50%;如果你这三秒刚好用满四个核心,那就是 400%。
因为 CPU% 是很短期的数据,所以当你突然觉得服务器dangdang的快不行时,直接看 CPU% 就可以知道是谁在作怪,然后看是要用 signal 把它暂时还是干脆直接杀掉算了
MEM% 也很类似,就是使用内存量的比例。要注意的时它是用 RES 指标来做计算的,所以如果服务器配有 4 GB 的内存,某个 process 的 RES 是 1 GB,那它就是用掉实际内存的 25%。
TIME+
最后要来说说 TIME+,这个时间很有意思,它代表的并不是程序从启动到现在总共经过了多久,而是这个程序总共占用了多少的 CPU Time。
因此如果想要知道就长期而言哪个进程最占 CPU 的话,就看看 TIME+ 的数值;
如果想看短期的,那就是看先前提到的 CPU%
🛠 操作
使用语法
|
|
参数说明
参数 | 说明 |
---|---|
-h \ –help | 输出帮助信息 |
-d \ –delay=DELAY | 设置刷新间隔时间,单位:0.1秒 |
-C \ –no-color | 界面无颜色 |
-s \ –sort-key=COLUMN | 按照指定列排序 |
-t \ –tree | 按照树结构试图显示 |
-u \ –user=<USERNAME> | 只显示指定用户进程信息 |
-p \ –pid=<pid> | 只显示指定pid进程信息 |
-v \ –version | 输出版本信息 |
功能键说明
功能键 | 说明 |
---|---|
F1 | 获取功能键命令帮助 |
F2 | 设置界面展示内容(可以设置颜色方案、列等等) |
F3 | 搜索,可以搜索 command 列中的信息 |
F4 | 过滤,可以过滤 command 列中匹配的进程 |
F5 | 按照进程数样式显示 |
F6 | 排序,根据选择的列进行排序 |
F7 | 减小进程优先级 |
F8 | 增加进程优先级 |
F9 | 杀死进程(需要先选择中进程,然后选择需要发送的信号量) |
F10 | 退出 |