linux性能检测之ps详解
前面主要记录了sysstat安装包里面带的几个工具,这里记录一下linux系统自带的ps命令跟pidstat有些类似,也是我们排查问题经常用到的一个系统命令。
一、介绍
1.1 ps简介
ps用于报告当前进程的快照。ps显示关于活动进程选择的信息。
ps有三种写法风格:
1.UNIX:选项可以组合到一起,选项前面必须有-连接符号。
2.BSD:选项可以组合到一起,选项前面不要有-连接符号。
3.GNU:选项前面有两个--连接符号。
1.2 ps的格式
ps [options]
1.3 选项
基本选项:
-A, -e:所有进程
-a : 所有的都是tty,会话领导除外
a: 所有与tty,包括其他用户
-d : 忽略会话
-N, --deselect:显示所有的程序,除了执行ps指令终端机下的程序之外。
r:只显示运行进程
T:该终端上的所有进程
x:显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。
按列表选择:
-C : 命令名称
-G, --Group <GID> : 实际组ID或名称
-g, --group <group>:会话或有效组名
-p, p, --pid <PID> :进程ID
--ppid <PID> :父进程标识
-q, q, --quick-pid <PID>:进程ID(快速模式)
-s, --sid <session>:会话ID
-t, t, --tty <tty>:终端
-u, U, --user <UID>:有效的用户ID或名称
-U, --User <UID> :实际用户ID或名称
输出格式:
-F:额外输出
-f:全格式,包括命令行
f, --forest:ascii进程树
-H:显示流程层级
-j:jobs格式
j:BSD作业控制格式
-l : 长格式
l : 显示一个长列表,具有 F、S、UID、PID、PPID、C、PRI、NI、ADDR、SZ、PSS、WCHAN、TTY、TIME 和 CMD 字段。
-M, Z :添加安全数据(适用于SELinux)
-O <format>:预装了默认列
O <format> :具有BSD的特性
-o, o, --format <format>:用户定义的格式
s : 信号格式
u:面向用户的格式。这包括 USER、PID、%CPU、%MEM、SZ、RSS、TTY、STAT、STIME、TIME 和 COMMAND 字段。
v:虚拟内存格式
X:注册格式
-y:不显示标志,与-l一起使用
--context:显示安全上下文(适用于SELinux)
--headers:重复标题行,每页一个
--no-headers :不要打印头
--cols, --columns, --width <num>:设置屏幕宽度
--rows, --lines <num>:设置屏幕高度
显示主题:
H:将它们作为进程
-L:可能与LWP和NLWP列
-m, m:显示所有进程
-T : 可能用SPID列
其他选项:
-c:使用-l选项显示调度类
c : 显示真实的命令名称
e:显示命令后的环境
k, --sort:指定排序顺序为:[+ | - ]键[,[+ | - ]键[,...]]
L:显示格式说明符
n:显示数字uid和wchan
S, --cumulative:包括一些已死进程数据
-y:不显示标志,显示rss(只和-l)
-V, V, --version : 显示版本信息并退出
-w, w : 无限输出宽度
--help <simple|list|output|threads|misc|all> : 显示不同的帮助和退出
博文来自:www.51niux.com
二、示例
示例1:默认显示当前shell中的进程,以及-A,-a和a
# ps #相当于ps -T
PID TTY TIME CMD
34655 pts/7 00:00:00 bash
42153 pts/7 00:00:00 ps
# ps -A #-A是显示所有进程跟-e的用法一样,-d也是显示所有进程,但是忽略会话进程,所以显示的内容比-A要少
PID TTY TIME CMD
1 ? 00:00:14 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:01 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
# ps -a # 显示现行终端机下的所有进程,包括其他用户的进程;
PID TTY TIME CMD
40890 pts/5 00:00:00 man
40901 pts/5 00:00:00 less
41741 pts/6 00:00:00 man
41752 pts/6 00:00:00 less
42212 pts/7 00:00:00 ps
# ps a #所有的tty,包括其他用户
PID TTY STAT TIME COMMAND
1784 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux
33341 pts/5 Ss 0:00 -bash
34059 pts/6 Ss 0:00 -bash
34655 pts/7 Ss 0:00 -bash
40890 pts/5 S+ 0:00 man ps
40901 pts/5 S+ 0:00 less -s
41741 pts/6 S+ 0:00 man ps
41752 pts/6 S+ 0:00 less -s
42213 pts/7 R+ 0:00 ps a
#ps a #这是另一个机器的记录
PID TTY STAT TIME COMMAND
5279 tty3 Ss+ 0:00 /sbin/mingetty /dev/tty3
5281 tty4 Ss+ 0:00 /sbin/mingetty /dev/tty4
5285 tty5 Ss+ 0:00 /sbin/mingetty /dev/tty5
5287 tty6 Ss+ 0:00 /sbin/mingetty /dev/tty6
5617 tty2 Ss+ 0:00 -bash
24352 pts/0 R+ 0:00 ps a
31362 pts/0 Ss 0:00 -bash
示例二、显示正在运行的进程
#ps auxr #a是显示现在终端下的所有程序包括其他的用户,u是以用户为主的格式来显示程序状况,x显示所有的程序不以终端来区分,r就是显示正在运行的进程。从结果可以看到只打印了运行的进程。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3868 9.8 0.0 1030080 26392 ? Rl 2016 52782:01 libvirtd --daemon
root 13320 0.5 0.0 0 0 ? R 2016 1231:24 [vhost-13300]
root 23945 1.9 0.0 758132 25460 ? Rl Mar01 718:54 /usr/bin/knotify4
root 24798 10.0 0.0 110236 1160 pts/14 R+ 17:48 0:00 ps auxr
示例三、输出格式的示例
--headers和--no-headers的对比:
# ps -C qemu-kvm #就相当于ps --headers -C qemu-kvm,这里-C就是只打印命令名称的进程。
PID TTY TIME CMD
1948 ? 02:06:07 qemu-kvm
1968 ? 01:47:33 qemu-kvm
1981 ? 11:31:38 qemu-kvm
1997 ? 00:11:01 qemu-kvm
2008 ? 00:24:07 qemu-kvm
# ps --no-headers -C qemu-kvm #--no-headers就是不打印标题,也就是不打印PID,TTY这些标头内容。
1948 ? 02:06:11 qemu-kvm
1968 ? 01:47:37 qemu-kvm
1981 ? 11:31:59 qemu-kvm
1997 ? 00:11:02 qemu-kvm
2008 ? 00:24:08 qemu-kvm
-F,-f和f的对比:
从上图的截图可以看出,-F显示的是最详细的,-f次之,f会显示运行状态而-F和-f没有显示运行状态。
# ps f -F -C qemu-kvm #可以混合用一下输出格式,让f的运行状态也显示到输出结果弥补-F显示的不足。
-j和j显示的区别:
-l和l的区别:
#F:代表这个程序的flag,4代表使用者为superuser也就是root。
#S:代表这个程序的状态(STAT)。
#UID:代表执行者的用户uid。
#PID:进程的ID号。
#PPID:父进程的ID。
#C:CPU使用资源百分比。
#RPI:指进程的执行优先级,其值越少越早被执行。
#NI:这个进程的nice值,其表示进程可被执行的优先级的修正数值。
#ADDR:这个是内核函数,指数该程序在内存的那个部分。如果是个执行程序,一般就是-。
#SZ:进程的核心映像的页面大小。
#WCHAN:目前这个程序是否正在运作当中,若为-表示正在运行。
#TTY:与进程关联的终端(tty)。
#VSZ:虚拟内存中进程的大小,以千字节为单位。
#RSS:实际内存使用大小
#STAT:代表这个程序的状态(STAT)。
#TIME :使用掉的CPU时间。
#CMD:所下达的指令名称
#COMMAND:该程序的实际指令是什么。
s,u,v,X的使用
-H:显示进程的层次(和其它的命令合用,如:ps -Ha)
示例四、-o自定义格式输出
上面我靠一堆对比,肯定也记不住,也不用记住,只要记住ps随着输出选项的不同可以又不同值的输出,那么如何比较灵活的,只输出我们所关心的一些选项值呢?这就需要用到了-o这个自定义格式输出,也是我们经常用到的一个命令。
# ps u -C salt-master #u的意思是显示详细内容,然后-C已经说过了指定一个命令,比如想查看一个进程所占用内存,这里显示的是百分比而非实际占用
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1630 0.0 2.1 293372 22216 ? S 20:50 0:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1635 0.4 3.2 399556 32604 ? Sl 20:50 0:10 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1636 0.0 2.2 379396 22664 ? Sl 20:50 0:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1639 0.0 2.4 379396 24816 ? Sl 20:50 0:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1646 0.0 2.1 293372 22004 ? S 20:50 0:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1647 0.0 3.1 1008576 32388 ? Sl 20:50 0:01 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1650 0.0 3.1 1008708 32388 ? Sl 20:50 0:01 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1654 0.0 3.1 1008712 32392 ? Sl 20:50 0:01 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1659 0.0 3.1 1008716 32392 ? Sl 20:50 0:01 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1660 0.0 3.1 1008716 32396 ? Sl 20:50 0:01 /usr/bin/python2.6 /usr/bin/salt-master -d
root 1666 0.0 2.2 682516 22852 ? Sl 20:50 0:00 /usr/bin/python2.6 /usr/bin/salt-master -d
# ps -o pid,comm,args,pcpu,%cpu,%mem,pmem,rsz,vsz,stime,user,uid -C salt-master #这就需要-o来制定格式,-o那一长串用逗号隔开的参数表示要输出的值。
#其中rsz表示实际的内存占用,单位是KB,前面的百分比换算后跟RSZ的值是相近的。
系统标识下列字段说明符:
addr : 通常情况下,表示进程栈的段号;如果为内核进程,则为预处理数据区的地址。该字段的缺省头为 ADDR。
args:说明正在执行的完整命令名。包含所有命令行参数,尽管可能发生截断。该字段的缺省头为 COMMAND。
bnd:表示进程或内核线程绑定到哪个(如果有)处理器。该字段的缺省头为 BND。
c : 每次系统时钟周期和发现进程或线程运行时增加进程或线程的 CPU 利用率。调度程序通过每秒除 2 将该值衰减。对于 sched_other 策略,CPU 利用率用于确定进程调度优先级。大值表示一个 CPU 密集处理且造成更低的进程优先级而小值表示一个 I/O 密集处理且造成更高的优先级。该字段的缺省头为 C。
class:表示内核线程的调度策略。策略为 sched_other、sched_fifo 和 sched_rr。该字段的缺省头为 CLS。
comm:表示正在执行的命令的短名称。不包含命令行参数。该字段的缺省头为 COMMAND。
cpu:确定进程调度优先级。每次系统时钟周期和发现进程或线程运行时增加进程或线程的 CPU 利用率。调度程序通过每秒除 2 将该值衰减。对于 sched_other 策略,大值表示一个 CPU 密集处理且造成更低的进程优先级而小值表示一个 I/O 密集处理且造成更高的优先级。
etime:表示进程启动后所用的时间。所用时间以下列格式显示:[[ dd-]hh:]mm:ss其中 dd 指定天数,hh 指定小时数,mm 指定分钟数及 ss 指定秒数。该字段的缺省头为 ELAPSED。
fname : 表示进程的可执行文件的基础名的前 8 个字节。该字段的缺省头为 COMMAND。
group:表示该进程的有效组标识。显示文本组标识。如果不能得到文本组标识,使用十进制表示。该字段的缺省头为 GROUP。
nice:表示进程细调值的十进制值。该字段的缺省头为 NI。
pcpu:表示使用的 CPU 时间占可用 CPU 时间的比例,以百分比表示。该字段的缺省头为 %CPU。
pgid:表示进程组标识的十进制值。该字段的缺省头为 PGID。
pid:表示进程标识的十进制值。该字段的缺省头为 PID。
ppid:表示父进程标识的十进制值。该字段的缺省头为 PPID。
pmem : 表示进程使用的实际内存的百分比。该字段的缺省头为 %MEM。
pri : 表示进程或内核线程的优先级;数字越大优先级越低。该字段的缺省头为 PRI。
psr : 表示绑定内核线程的处理器(如果有)的逻辑处理器号。该字段的缺省头为 PSR。
rgroup:表示该进程的实际组标识。显示文本组标识。如果不能得到文本组标识,使用十进制表示。该字段的缺省头为 RGROUP。
ruser:表示该进程的实际用户标识。显示文本用户标识。如果不能得到文本用户标识,使用十进制表示。该字段的缺省头为 RUSER。
rgid : 使用一个十进制整数表示该进程的实际组标识号。该字段的缺省头为 RGID。
rss : 表示该进程的实际内存(驻留集)大小(单位是 1 KB)。该字段的缺省头为 RSS。
rsz:表示该进程的实际内存(驻留集)大小(单位是 1 KB)。该字段的缺省头为 RSZ。
ruid : 使用一个十进制整数表示该进程的实际用户标识号。该字段的缺省头为 RUID。
s : 表示该进程的状态。该字段的缺省头为 S。
sid : 表示会话导带的进程标识。该字段的缺省头为 SID。
scount:表示内核线程的暂挂数。该字段的缺省头为 SC。
sched:表示内核线程的调度策略。该字段的缺省头为 SCH。
stime:表示进程的启动时间。LANG 环境变量控制该字段的外观。该字段的缺省头为 STIME。
THREAD表示下列字段:使用 -o THREAD 标志实际上不显示线程,除非也指定 -m 标志。
用户名(uname 字段)
进程的进程及父进程标识(pid 和 ppid 字段)
线程的内核线程标识(tid 字段)
进程或内核线程的状态(S 字段)
进程或内核线程的 CPU 利用率(C 字段)
进程或内核线程的优先级(PRI 字段)
进程或内核线程的暂挂数( scount 字段)
进程或内核线程的等待通道( WCHAN 字段)
进程或内核线程的标志(F 字段)
进程的控制终端(tty 字段)
进程或内核线程绑定到的 CPU (bnd 字段)
正在由进程执行的命令(comm 字段)
tid: 表示内核线程的线程标识。该字段的缺省头为 TID。
time: 表示进程启动后的累计 CPU 时间。时间以下列格式显示:[ dd-]hh:mm:ss其中 dd 指定天数,hh 指定小时数,mm 指定分钟数及 ss 指定秒数。该字段的缺省头为 TIME。
tty : 表示该进程的控制终端名。该字段的缺省头为 TT。
user : 表示该进程的有效用户标识。显示文本用户标识。如果不能得到文本用户标识,使用十进制表示。该字段的缺省头为 USER。
vsz : 使用十进制整数表示虚拟内存中进程的大小,以千字节为单位。该字段的缺省头为 VSZ。
wchan : 表示该进程或内核线程为之等待或休眠的事件。对于内核线程,如果内核线程正在运行,该字段为空。对于进程,如果只有一个内核线程正在休眠,等待通道定义为该休眠内核线程的等待通道;否则显示一个星号。
上面有一些选项可以用下面的一种形式表示:
字段 字段 缺省值
描述符 说明符 头
%a args COMMAND
%c comm COMMAND
%t etime ELAPSED
%G group GROUP
%n nice NI
%C pcpu %CPU
%r pgid PGID
%p pid PID
%P ppid PPID
%g rgroup RGROUP
%u ruser RUSER
%x time TIME
%y tty TTY
%U user USER
%z vsz VSZ
# ps L #通过这个命令可以查看有哪些显示格式以及对应的说明符
示例五、--sort排序示例
# ps aux --sort=-pcpu #这是按CPU百分比降序排序,如果不是-号是+号的话就是按CPU百分比升序排序。
#STAT进程的状态。下面是STAT状态码:
R:运行,正在运行或再运行队列中等待。
S:处于休眠状态。
T:停止或被追踪。
D:无法中断的休眠状态(通常IO的进程)。
Z:僵尸进程。
<:优先级高的进程。
N:优先级较低的进程。
L:内存锁页。
s:进程的领导者,在它之下有子进程。
l:多进程的。
+:位于后台的进程组。
博文来自:www.51niux.com
三、一些常用例子
# ps aux|more #分页查看系统中现在运行着那些程序。#ps -ef|more 效果一致
# ps -mp 2008 -o THREAD,tid,pid #列出当前用户下,pid为2008所包含的所有线程。以及本地线程(tid),以及pid号。
# ps -p 2008 -L #当然也可以用这种指定pid号,然后用-L来显示子进程的形式,但是看着显示的略显简陋哈。
PID LWP TTY TIME CMD
2008 2008 ? 00:12:26 qemu-kvm
2008 2011 ? 00:09:48 qemu-kvm
2008 2012 ? 00:06:11 qemu-kvm
2008 2014 ? 00:00:00 qemu-kvm
# ps -p 2008 -L -F -f -l #不是有很多显示参数吗,可以加显示参数让其显得丰富起来。或者用:# ps u -p 2008 -L 可以显示内存使用率和cpu使用率
# ps -mp 2008 -o THREAD,tid --no-headers|wc -l #那2008就是启动了5-1=4,也就是启动了4个线程
5
#ps uf -C httpd #用到了f参数,查看httpd命令的父子进程关系。
#ps u --ppid 1484 #当然也可以通过指定父进程的ppid号来显示父进程的子进程,这种方式打印的只会是子进程。
#ps auxf #通过这个命了可以看全部的进程的父子进程关系,这里就不截图了,太多了。或者用:#ps axjf
# ps -f -u postfix,qemu #显示postfix用户和qemu用户所运行的进程,多个用户之间用,隔开。
# ps aux --sort=+pmem #一般我们会对内存百分比或者cpu百分比进行排序,一般是升序排序,这样我们就不用再上翻窗口后者加管道符,后面跟more啊或者head之类的命令了。这里是按内存百分比升序排序。当然也可以通过:# ps aux|sort -k 4 -n这种形式来排序。
# ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm #ps -o也是一个重要用法,前面已经说过-o的用法了,这里说一下-o的自定义标题功能。这里就是让uname的显示和cpu的显示都改变。
#ps -e -o pid,comm,etime #显示进程的运行时间。可见我们的系统上面的进程运行了920天,3小时51分39秒,而我们的sshd进程运行了37小时48分钟,ntpd时间进程运行了919天17小时6分钟29秒
PID COMMAND ELAPSED
1 init 920-03:51:39
2 kthreadd 920-03:51:39
3 migration/0 920-03:51:39
4 ksoftirqd/0 920-03:51:39
21445 sshd 37:48
21474 bash 37:29
23538 ntpd 919-17:06:29
#watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem | head -15' #这是watch命令可以用来实时捕捉ps显示进程,每一秒刷新一次,比top可能刷新频繁一点。
# watch -n 1 'ps -o pid,uname,cmd,rsz,pcpu --sort -rsz -u root|head -15' #这是单引号哈。将root用户,实际内存使用数前15名打印出来。