Featured image of post htop

htop

htop类似于 top 命令,可以说htop是top的升级版,比top更加人性化,让用户可交互式操作,允许用户监视系统上运行的进程及其完整的命令行

💡 简介

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

image-20220819132922648

首先来说说最重要的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

image-20220819133923845

紧接在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

接下来看看界面右上角那堆神奇的数字

image-20220819134533230

首先 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。

image-20220819135345935

那知道 PID 之后可以干嘛呢?其实它的用途还是挺多的,譬如说你可以用 kill -KILL <pid> 来杀掉某个process;或是使用 kill -STOP 来暂停 process,再用 kill -CONT 让它继续运行(这超好用👍,但是很多人都不知道)

USER 栏位则没什么好解释的了,这代表的就是把这个 process 跑起来的用户。不管程序是谁写的,只要是我把它跑起来,那么 USER 那栏就会显示处我的用户名

PRI & NI

接下来的 PriorityNice 两个都是跟优先级有关的指标,注意数字越小表示优先级越高,也就可以分配到越多的 CPU 时间

image-20220819135734121

其中 PRI 是由系统帮你决定的,无法自行修改。

Nice 的部分预设值是 0,可以用 renice -n 19 -p <pid> 调整到最低优先级 19,想要调高的话最高也可以调到 -20

虽然 nice 值可以随自己喜好调高调低,但系统不见得都会听你的。有的系统比较友善会愿意参考你设的 nice 值,但也有一些只看 PRI,而根本不在乎 nice(你设你的我排我的),所以不要太期待提高 nice 可以为性能带来多大的变化。

VIRT/RES/SHR

这三个数字都是跟内存有关系的,分别代表 Virtual memoryResidentShared memory

image-20220819140137777

Virtual memory 的概念比较复杂一点,但基本上你可以把它想成 process 可以存取到的 memory 的综合。譬如说 head -n indes.js 内部运作的方式是先把 index.js 打开,然后读取前十行。虽然它只读取前十行,但 head process 已经把文件打开了(它其实由权限到整个文件的内容只是它没有这么做),所以 virtual memory 会把整个文件的大小都算进去。

Resident 正好相反,它指的是物理上这个进程到底占用了多少内存空间。以同样的例子来说,如果你只读取前十行,那么系统就只把前十行从硬盘读进内存,RES 也只算那世行。

因此在 htopRES 一定会小于 VIRT,而且通常是远小于。

Shared memory 的话顾名思义就是可以跟别的进程分享的 memory,像程序执行时常常会用的 glibc,或是在读取 read-only 文件时,这些东西都只需要读进内存一次就可以了,所以就会被算进 SHR 里面

虽然能跟其他 process 共用内存是好事,但这种事也强求不来,所以我一般只看 RES,很少在管 SHR 是多少

State

image-20220819140644242

接着来看这小小一个 S,代表的是进程的状态,比较常见的有以下几个状态:

  • R:意思是进程正在跑或者是在运行队列里面等待CPU执行

    如果你的程序长时间处于 R 状态但还是跑得很慢,代表的是程序算法效率太慢,或者是 CPU 是在太忙一直把这个进程放在队列里面(这可以再透过 CPU% 指标来确认是哪个问题)

  • S:目前正在休眠,有事做才会醒来

    通常定时执行的、要用户互动的程序如 ping 常常会处于 S 状态,毕竟 ping 一秒只发送一个封包,但现今的 CPU 一秒就可以跑十亿个循环,所以 CPU 当然在 ping 发包过后就马上跑这个进程踢到一边去睡觉,等一秒后睡醒了再回来

  • D:这个也是在休眠,只不过等待的一定是 IO,譬如说读取文件,写入文件等等

    如果你的进程长时间处于 D 状态,代表 IO 所占的时间比较多,是不是就被 CPU 踢出去然后睡觉去了。因此想要改善性能也要从 IO 着手,譬如用 redis 做快存或是换 SSD 等等,若只是单纯更换程序语言或是升级 CPU 可能没什么效果

    CPU%/MEM%

    image-20220819141319424

    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。

    image-20220819141656292

    因此如果想要知道就长期而言哪个进程最占 CPU 的话,就看看 TIME+ 的数值;

    如果想看短期的,那就是看先前提到的 CPU%

🛠 操作

使用语法

1
用法:htop [参数选项]

参数说明

参数 说明
-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 退出
渝ICP备2022001449号
本站总访问量