Linux系统下可用于进程监控的常用命令主要有ps,top,htop
- ps 是Process Status(进程状态)的简写,从名字里就能看出这个命令就是为了监控进程而生的。
- top 和htop,从命令名字就可以看出它们的前世今生,top即峰值,表示的是动态打印出系统某一时段的各个指标的峰值,其中就包括系统内的进程。htop 是一个可交互式进程浏览器,就是top的升级版,并不是默认安装。
下面我们对每个命令的常用用法做简要分析。
1. ps
ps 的格式是ps [options]
一般的Linux命令选项参数都有两种格式的区别:长格式和短格式,但是ps由于为了兼容不同语法分割,短格式也分为两种:不带‘-’和带‘-’。可偏偏这两种风格后边接的有可能是同一个字符,并且表现的行为是有时一致,有时不一致。所以说ps选项对于初学者来说是一个大坑!
按照命令长短和是否存在横线可分为以下几种:
命令格式 | 风格说明 | 示例 |
---|---|---|
ps op | BSD 语法格式 | ps t tty1 |
ps -op | UNIX语法格式 | ps -t tty1 |
ps --option | GNU语法格式 | ps --tty tty1 |
注意:不同类型的option是可以混用的,但是混用最好用空格分开,因为UNIX语法和BSD语法连接使用时解析出来的操作参数可能会与你想要的不一致,例如:ps au ==> ps a u ;ps -au ==> ps -a -u
ps命令参数有很多,这里就不再过多赘述,详细可以ps --help all查阅,这里我们只给出应用频率最高的几组命令
常用命令组合
- ps aux
a:显示现行终端机下的所有进程(包括由此终端登陆的所有用户)
x:显示无控制的所有进程
所以ps ax 可以表示所有进程
u:以基于用户的格式打印
ps aux 格式说明如下
表头项 | 说明 |
---|---|
USER | 进程用户名 |
PID | 进程ID |
%CPU | CPU使用率 |
%MEM | 内存使用率 |
VSZ | virtual memory size 虚拟内存使用量(KB) |
RSS | resident set size 实际物理内存使用量(KB) |
TTY | 该进程属于哪个终端:?表示与终端机无关;tty1-tty6表示本机登陆程序;pts/0 pts/1 ... 表示由网络连接进主机的程序。 |
STAT | 进程状态,R-running S-sleep T-trace Z-zombie |
START | 启动时间 |
TIME | 实际使用CPU时间 |
COMMAND | 运行该程序的实际命令 |
英文简写速记
VSZ:(V = virtual memory) (SZ = size)
RSS:(R = resident) (S = set)(S = size)
tty:teletypes
pts:pseudo-terminal slave
注意 ps aux 与ps -aux 是不同的!!!
前面我们说到如果选项参数是连续的,那么有无‘-’直接影响到了命令的解析,比如ps aux就会被解析成 ps a u x ,同理ps -aux 可以被解析成ps -a -u x,注意没有-x这个选项,并且-u 后边会接参数代表user,如果系统中存在x这个用户,那么ps -aux 表示的是x用户对应的进程除去控制进程和无终端进程外的所有进程,并以基于用户的格式打印,如果没有此用户,则行为与 ps aux一致
- ps -ef
效果和ps aux 效果一致,只是结果的打印格式略微有区别
-e:表示显示当前全部进程 等同于 -A 所以 ps -ef 也可称为ps -Af
-f :表示完全格式打印
表头项 | 说明 |
---|---|
UID | 进程用户名 |
PID | 进程号 |
PPID | 父进程号 |
C | CPU资源占用百分比 |
STIME | 进程启动时间 |
TTY | 终端 |
TIME | CPU实际占用时间 |
CMD | 运行该程序的实际命令 |
- ps u -u [username]
u:以用户格式进行结果打印
-u:列出该用户的进程状态
2. top
top格式是top [options]
- 常用option主要有以下几个
参数 | 说明 |
---|---|
-c | 以全命令方式显示 |
-p [,pid] | 只显示对应pid的进程的运行信息 |
-n [,num] | 运行多少此后停止刷新 |
-d [,num] | 每num秒刷新一次 |
-S | 开启CPU时间累积模式,开启后会讲已完成或者消失的子进程的CPU时间累加在父进程上,注意是大写 |
2.1 top打印格式详解
- 第一行
top - 22:28:35 | up 10 days,1:24 | 1 user, | load average: 0.00,0.01,0.05 |
---|---|---|---|
系统当前时间 | 系统已运行时间 | 当前登陆用户 | 系统平均负载 |
特殊字段解释:load average :1分钟平均值,5分钟平均值,15分钟平均值。这个平均值=核心数表示满负载,过低证明此服务器任务不饱和,过高尤其是达到核心数的两倍以上,那就甭睡觉了。根据实际经验值,平均值不大于(核心数*0.7),算是安全状态,为什么平均值是核心数的0.7倍呢?因为这只是平均值,保证系统健壮,就必须预留出安全空间给访问峰值。
- 第二行
Tasks: 74 total, | 1 running, | 73 sleeping, | 0 stopped, | 0 zombie |
---|---|---|---|---|
进程总数 | 正在运行进程数 | 休眠中的进程数 | 停止的进程数 | 僵尸进程数 |
- 第三行
%Cpu(s): 0.3 us, | 0.3 sy, | 0.0 ni, | 99.3 id, | 0.0 wa, | 0.0 hi, | 0.0 si, | 0.0 st |
---|---|---|---|---|---|---|---|
user用户占用百分比 | system内核占用百分比 | nice用户进程空间内改变过优先级的进程占用百分比 | idle空闲百分比 | IO-wait进程等待占用百分比 | hardwareInterrupts硬件中断百分比 | softwareInterrupts关键中断 | stolenFromVM虚拟CPU的情况 |
注:id (idle)值用到的比较多,其表示系统的闲忙程度
- 第四行
KiB Mem : 1015564 total, | 80008 free, | 113580 used, | 821976 buff/cache |
---|---|---|---|
物理内存总数 | 空闲物理内存数 | 使用物理内存数 | 作为内核缓存的内存量 |
Mem = used + free + buff/cache
buff/cache是存在与实实在在的物理内存之中,一种缓冲机制,如果给所有应用分配足够内存后,内存依然存在剩余,Linux会尽量利用这些空闲空间,提高整体I/O效率,这部分又被划分成cache(page cache)和buffer(buffer cache)区分利用。
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.rst?id=HEAD
此文档中对这两个缓冲的解释
Buffers
Relatively temporary storage for raw disk blocks
shouldn't get tremendously large (20MB or so)
(原始磁盘块的临时存储,不可过大(20MB左右))
Cached
in-memory cache for files read from the disk (the
pagecache). Doesn't include SwapCached
(内存中高速缓存,用于存储磁盘中读取来的文件。(页面缓存),不包括SwapCached)
buff是块设备缓冲区,主要是为了提高内存和低速iO设备(如磁盘)之间的数据交换速度而设计。而cache是为了提高CPU与内存之间的数据交换速度而设计的。
我们扩展的想一下为什么要有buffer cache和page cache呢?
page cache(页缓存) :读文件时,首先会到页缓存中查找,看是否有数据,有,则将数据拷贝到用户空间,交由用户处理,没有,从磁盘中拷贝data页到页缓存中,再拷贝到用户空间。这样提高了第二次以后的读写效率,不会让CPU空太久。
buffer cache(缓冲):Linux是通过inode对磁盘文件进行管理的,当我们从磁盘中读取文件时,首先我们要将包含目标dentries和inodes页读进来,但是由于这个页不是data页而是Metadata页(元数据页),所以不会被读到页缓存中,其会被读到buffer cache中缓冲起来,只不过这次我们期待的是下次需要读取文件的inode在这张Metadata页中,如果命中,我们就节约了一次磁盘文件读取过程。
- 第五行
KiB Swap: 0 total, | 0 free, | 0 used. | 718124 avail Mem |
---|---|---|---|
交换区总量 | 交换区空闲量 | 交换区已使用量(注意此处为句号) | 回收buff/cache部分空间且不发生swap交换后,可以使用的内存 |
由第四行的扩展信息可知,buff/cache是缓冲机制,内存空闲时被占用,如果内存不够时,被占用的
部分内存将会被释放以供系统使用,那么多少内存可以被释放呢?这个由系统决定,由于某些正在运行的程序,并非所有的缓存页都可以被回收。
- 第六行
PID | USER | PR | NI | VIRT | RES | SHR | S | %CPU | %MEM | TIME+ | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|---|
进程ID | 所属用户 | 进程实际优先级(priority也叫动态优先级) | 优先值(nice也叫静态优先级) | 虚拟内存占用量 | 物理内存占用量 | 共享内存占用量 | 进程状态 | CPU使用占比 | 物理内存使用占比 | 累积CPU占用时间 | 命令 |
PR与NI到底有什么区别?
NI:nice值,又名静态优先级,默认继承于父进程,可以以手动设置,可以影响进程优先级,它只是代表着该进程抢占资源的能力,nice值越低的进程越不好说话,所谓会哭的孩子又奶吃,所以nice值越低的进程抢占CPU的能力越强,也就越有可能优先级高。
PR:priority,又名动态优先级,是根据内核调度动态变化的,是实际的优先级
它们之间的联系就是进程初始的PR是根据NI值的设定生成的。
2.2 常用命令
2.1 中我们详细分析了TOP打印出的字段代表着哪些含义,下面我们将详细的看一下常用的命令
- 排序篇
命令 | 说明 |
---|---|
M | 以驻留内存大小进行排序 |
P | 以cpu占用百分比排序 |
T | 以CPU占用时间排序 |
-
设置篇
f :可以设置进程表表头的选项,按f键后我们将进入设置界面,设置界面如下
设置命令 | 说明 |
---|---|
-> | 选中光标所在的表头项,然后可以利用上下方向键对表头显示进行设置 |
d | 删除光标所在的表头项 |
将光标选中的表头项(添加/删除)到表头 | |
s | 按照选定的表头项排序进程表 |
q或 |
离开当前设置模式 |
3. htop
htop 实际上就是top命令的升级版,更加直观清晰的打印出当前系统的详细信息,并且增加了很多高效的交互命令,完全可以取代top命令,唯一的缺点就是不是linux系统默认的命令,需要手动安装。例如,CentOS中直接应用命令yum install htop,即可。
当你运行htop,你会发现终端界面像GUI程序一样,简单方便快捷,每一步都有提示。
3.1 快捷键操作
它提供了F1~F10的快捷操作
快捷键 | 说明 |
---|---|
F1 | help 帮助 |
F2 | Setup 设置 |
F3 | Search 搜索进程 |
F4 | Filter 增量进程过滤器,只作用与命令字符串 |
F5 | sorted/Tree两种显示方式切换(sorted以排序方式显示,以s树型结构显示) |
F6 | SortBy/Collap,当F5设置为Sorted时SortBy可以设置以哪个数据对进程进行排序,如果设置为Tree时,可以设置树形某根结点折叠或展开显示 |
F7 | 减少Nice值以提高进程优先级 |
F8 | 增加Nice值以降低进程优先级 |
F9 | 对进程传递信号 |
F10 | 结束htop |
3.2 特殊快捷键详细解读
3.2.1 F2
按下F2,会发现最左一列是setup的类型,注意最下方是操作提示信息,可以做到无需记忆即可操作。
setup分类 | 说明 |
---|---|
Meters | 表示顶端显示信息的设置 |
DisPlay Options | 进程表中每一行的显示格式 |
Colors | 终端颜色设置 |
Colums | 进程表的表头项 |
-
Meters选项说明
-
DisPlay Options选项说明
下面是进程显示格式说明
选项 | 说明 |
---|---|
Tree View | 进程关系以树形结构显示 |
Shadow other users' processes | 将其他成员下辖的进程颜色至为暗色调 |
Hide kernel threads | 不显示内核线程 |
Hide userland process threads | 不显示用户程序内部线程 |
Display threads in a different color | 以不同的颜色显示线程 |
Show custom thread names | 显示自定义线程名,(程序中可以为自己的线程添加一个别名以助于区分) |
Show program path | 显示程序全路径 |
Highlight program "basename" | 高亮程序基名(基名相当于绝对路径中最后一个文件夹或文件的名字) |
Highlight large numbers in memory counters | 高亮显示内存占用量大的数值 |
leave a margin around header | 进程表表头与最上方系统数据中间留出空白显示 |
Detailed CPU time (System/IO-Wait/HardIRQ...) | 最上方系统信息中CPU信息已详细信息格式显示 |
Count CPUs from 0 instead of 1 | CPU个数统计从0开始 |
Update process names on every refresh | 每次刷新时更新进程名 |
Add guest time in CPU meter percentage | CPU百分比统计中加入为来宾操作系统运行一个虚拟CPU所花费的时间 |
-
进程表头项
经常用到的操作提示主要有以下几个
光标位置 | 提示 |
---|---|
在ActiveColumes下面对某一项时 | (调整进程表表头显示顺序F7向上F8向下) F9将此项溢出进程表表头 F10保存并返回 |
AvailableColums下面的某一项时 | F5 将当前选项添加至进程表的表头,F10保存并返回 |
下面我们将对常用的进程表头项进行讲解
表头项 | 含义 |
---|---|
PID | 进程ID号 |
USR | 该进程隶属于哪个账户 |
PRIORITY | 该进程的动态优先级 |
NICE | 该进程的静态优先级 |
M_SIZE | 该进程所占用的虚拟内存量 |
M_RESIDENT | 该进程所占用的物理内存量 |
M_SHARE | 该进程所占用的共享内存量 |
STATE | 进程当前状态 |
PERCENT_CPU | CPU占用百分比 |
PERCENT_MEM | 该进程当前物理内存占用百分比 |
TIME | CPU应用累积时间 |
Command | 进程启动命令 |
PPID | 父进程号 |
UTIME | 该进程在用户空间消耗的CPU时间 |
STIME | 该进程在内核空间消耗的CPU时间 |
3.2.2 F3
此查找功能为全字符匹配,没有正则匹配功能,全局搜索,如果只想匹配进程路径或者进程名中的字符,请使用F4筛选功能
- 点击F3 输入需要搜索的 需要匹配的字符
- 继续查找按F3
- Esc 退出查找模式
3.3 特殊命令
之前所讲的内容都是与设置有关,设置在第一次使用htop后,基本上不会有太大的变动,实际操作中最常用的实际上是以下几个命令
3.3.1 排序篇
常用命令 | 说明 |
---|---|
P | 以CPU占有率为排序基准 |
M | 以内存占有率大小为排序基准 |
T | 以CPU实际使用时间为排序基准 |
F5+F6 | 在F5为排序模式下,F6可以很直观的选择任何一个表头项进行排序 |
I | 升序降序切换 |
t 或F5 | 树形方式和排序方式切换,当进程表以树形方式显示的时候P,M,T,I等列排序命令将会失效 |
3.3.2 调试篇
调试命令 | 说明 |
---|---|
u | 只显示指定用户的进程 |
l | 显示光标所在进程的文件列表 |
s | 显示光标所在进程的系统调用情况,F9可以对trace起停进行控制 |