系统监控之进程篇

Linux系统下可用于进程监控的常用命令主要有ps,top,htop

  1. ps 是Process Status(进程状态)的简写,从名字里就能看出这个命令就是为了监控进程而生的。
  2. 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筛选功能

  1. 点击F3 输入需要搜索的 需要匹配的字符
  2. 继续查找按F3
  3. 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起停进行控制

你可能感兴趣的:(系统监控之进程篇)