柴少的官方网站 技术在学习中进步,水平在分享中升华

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的对比:

图片.png
从上图的截图可以看出,-F显示的是最详细的,-f次之,f会显示运行状态而-F和-f没有显示运行状态。

# ps f -F -C qemu-kvm #可以混合用一下输出格式,让f的运行状态也显示到输出结果弥补-F显示的不足。


-j和j显示的区别:

图片.png


-l和l的区别:

图片.png

#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的使用

图片.png


-H:显示进程的层次(和其它的命令合用,如:ps -Ha)

图片.png


示例四、-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那一长串用逗号隔开的参数表示要输出的值。        
图片.png

#其中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百分比升序排序。

图片.png

#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号。
图片.png

# 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使用率图片.png

# ps -mp 2008 -o THREAD,tid --no-headers|wc -l  #那2008就是启动了5-1=4,也就是启动了4个线程
5


#ps  uf -C httpd #用到了f参数,查看httpd命令的父子进程关系。

图片.png

#ps u --ppid 1484 #当然也可以通过指定父进程的ppid号来显示父进程的子进程,这种方式打印的只会是子进程。

图片.png

#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的显示都改变。

图片.png


#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可能刷新频繁一点。

图片.png

# watch -n 1 'ps -o pid,uname,cmd,rsz,pcpu --sort -rsz  -u root|head -15'  #这是单引号哈。将root用户,实际内存使用数前15名打印出来。

图片.png


作者:忙碌的柴少 分类:linux性能检测工具 浏览:6283 评论:1
留言列表
poweredbytian
poweredbytian 牛逼  回复
发表评论
来宾的头像