ps -ef、 ps aux、top、pidstat

linux中ps -efps aux都支持用来查看进程快照,下面总结了他们的显示格式区别和各列的含义。(ps -aux已废弃,不要再用了)
推荐使用ps -ef

ps -ef 标准的格式显示进程(System V风格)

UID PID PPID C STIME TTY TIME CMD
用户 进程id 父进程id cpu百分比 启动时间 所在终端 占用cpu时间 命令参数
root 1 0 0 06:50 ? 00:00:10 /sbin/init
root 40 1 0 12:33 pts/0 00:00:03 /java/

其中各列的内容意思如下

  • UID //用户ID、但输出的是用户名
  • PID //进程的ID
  • PPID //父进程ID
  • C //进程占用CPU的百分比
  • STIME //进程启动时间
  • TTY //该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
  • TIME //进程使用cpu的时间
  • CMD //命令的名称和参数

ps -ef展示启动时间

ps -ef、ps aux命令可以展示进程的大概信息,启动时间展示不完整,如果想得知进程的详细启动时间,怎么办呢?

linux:
$ ps -eo pid,lstart,cmd

outPut:
PID STARTED CMD
1 Mon Jun 19 21:31:08 2017 /sbin/init
2 Mon Jun 19 21:31:08 2017 [kthreadd]
3 Mon Jun 19 21:31:08 2017 [ksoftirqd/0]

ps aux BSD的格式来显示

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.2 19221 2989 ? S 12:20 00:09 /sbin/init

同ps -ef 不同的有列有

  • USER //用户名
  • %CPU //进程占用的CPU百分比
  • %MEM //占用内存的百分比
  • VSZ //该进程使用的虚拟內存量(KB)
  • RSS //该进程占用的固定內存量(KB)(驻留中页的数量)
  • STAT //进程的状态
  • START //该进程被触发启动时间
  • TIME //该进程实际使用CPU运行的时间

其中STAT状态位常见的状态字符有

  • D //无法中断的休眠状态(通常 IO 的进程);
  • R //正在运行可中在队列中可过行的;
  • S //处于休眠状态;
  • T //停止或被追踪;
  • W //进入内存交换 (从内核2.6开始无效);
  • X //死掉的进程 (基本很少见);
  • Z //僵尸进程;
  • < //优先级高的进程
  • N //优先级较低的进程
  • L //有些页被锁进内存;
  • s //进程的领导者(在它之下有子进程);
  • l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
    • //位于后台的进程组;

top

使用示例

$ top -p 4989
$ top

列说明

PID,USER进程号,用户名。

NI,nice,好看不好看。。动态修正CPU调度。范围(-20~19)。越大,cpu调度越一般,越小,cpu调度越偏向它。一般用于后台进程,调整也是往大了调,用来给前台进程让出CPU资源。

PR:优先级,会有两种格式,一种是数字(默认20),一种是RT字符串。

PR默认是20,越小,优先级越高。修改nice可以同时修改PR,测试过程:先开一个窗口,运行wc,另开一个窗口运行top,按N按照PID倒序排,按r输入要renice的PID,然后输入-19~20之间的值,可以看到NI变成输入的值,PR=PR+NI。修改NI得到PR的范围是0~39。优先级由高到低

RT是real-time。只能用chrt -p (1~99) pid来修改。chrt -p 1 1234会将1234的PR改成-2,chrt -p 98 1234变成-99。chrt -p 99 1234会变成RT......只要chrt过,修改nice后PR不会再更改。修改chrt得到的PR范围是RT~-2。优先级由高到低

VIRT:一个进程瞬时可以访问的所有内存总和大小,包括RES自己在使用的,共享的类库,和其他进程共享的内存,内存中的文件数据。共享的类库,一个大文件,只有一个程序片段被用到,这个文件会被 map到VIRT和SHR中,程序片段会在RES中。

S:状态S -- Process Status. The status of the task which can be one of:
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.

%CPU,总体CPU百分比,按H可以显示所有线程。8个核,从0~800%。
%mem,RES占总MEM的百分比
TIME+,自启动到现在占用的CPU时间。

pidstat 进程的信息

使用示例

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

# pid4989的cpu详细详细,每个1s打印一次,打印8次
pidstat -u -p 4989 1 8
# 内存
pidstat -r -p 4989 1 8
# 磁盘
pidstat -d -p 4989 1 8
# 展示三者
pidstat -urd -p 4989 1 8
# -h 在一行展示所有信息
pidstat -urdh -p 4989 1 8
# 更多
man pidstat

参数说明

-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数