使用 ps 命令

ps 命令是一个灵活的工具,用于标识在系统上运行的程序及其正在使用的资源。 它显示关于系统中进程的统计信息和状态信息,如进程或线程标识、I/O 活动、CPU 或内存利用情况。

本节中,我们将讨论与 CPU 相关的选项和输出字段。

ps 命令的三个可能输出列以各不相同的方式报告 CPU 使用情况。

值为:
C
进程近来使用的 CPU 时间(以时钟滴答为单位)。
时间
从进程启动以来使用 CPU 的总时间(以分钟和秒为单位)。
CPU 百分比
从进程启动以来使用 CPU 的总时间除以线程启动后所经历的时间。 此时间是度量程序对 CPU 依赖程度的一种方法。

CPU 密集

下列 shell 脚本:
# ps -ef | egrep -v "STIME|$LOGNAME" | sort +3 -r | head -n 15
是一个集中系统中最近使用的 CPU 高度密集的用户进程(为了清楚起见,重新插入了标题行)的工具:
     UID   PID  PPID   C    STIME    TTY  TIME CMD
    mary 45742 54702 120 15:19:05 pts/29  0:02 ./looper
    root 52122     1  11 15:32:33 pts/31 58:39 xhogger
    root  4250     1   3 15:32:33 pts/31 26:03 xmconsole allcon
    root 38812  4250   1 15:32:34 pts/31  8:58 xmconstats 0 3 30
    root 27036  6864   1 15:18:35      -  0:00 rlogind
    root 47418 25926   0 17:04:26      -  0:00 coelogin <d29dbms:0>
    bick 37652 43538   0 16:58:40  pts/4  0:00 /bin/ksh
    bick 43538     1   0 16:58:38      -  0:07 aixterm
     luc 60062 27036   0 15:18:35 pts/18  0:00 -ksh

列 (C) 指示最近使用的 CPU。 循环程序的进程在列表中领先。 该C值可以使循环进程的 CPU 使用率最小化,因为调度程序在 120 时停止计数。 对于多线程的进程,此字段指出对该进程中的所有线程列示的 CP 总和。

下面的示例显示一个简单的五线程程序及无限循环程序中的所有线程:
ps -lmo THREAD -p 8060956
    USER     PID    PPID       TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
    root 8060956 6815882         - A  720 120  0        -   200001  pts/0   - ./a.out
       -       -       -   8716483 R  120 120  0        -   400000      -   - -
       -       -       -  17105017 R  120 120  0        -   400000      -   - -
       -       -       -  24182849 R  120 120  0        -   400000      -   - -
       -       -       -  24510589 R  120 120  0        -   400000      -   - -
       -       -       -  30277829 R  120 120  0        -   400000      -   - -
       -       -       -  35913767 R  120 120  0        -   400000      -   - -
在 CP 列中,值 720 指出此值下列示的各个线程的总和,即:(5 * 120) + (120)

CPU 时间比值

定期运行的 ps 命令将显示 CPU 时间TIME列和 CPU 时间与实时的比率%CPU列。 查找支配 CPU 使用的进程。 auv 选项提供了有关用户进程的类似信息。 auxvg 选项显示用户和系统进程。

下列示例取自于一个 4 路的 SMP 系统:
# ps au
USER       PID %CPU %MEM   SZ  RSS    TTY STAT    STIME TIME COMMAND
root     19048 24.6  0.0   28   44  pts/1 A    13:53:00  2:16 /tmp/cpubound
root     19388  0.0  0.0  372  460  pts/1 A      Feb 20  0:02 -ksh
root     15348  0.0  0.0  372  460  pts/4 A      Feb 20  0:01 -ksh
root     20418  0.0  0.0  368  452  pts/3 A      Feb 20  0:01 -ksh
root     16178  0.0  0.0  292  364      0 A      Feb 19  0:00 /usr/sbin/getty
root     16780  0.0  0.0  364  392  pts/2 A      Feb 19  0:00 -ksh
root     18516  0.0  0.0  360  412  pts/0 A      Feb 20  0:00 -ksh
root     15746  0.0  0.0  212  268  pts/1 A    13:55:18  0:00 ps au
%CPU是自进程启动以来分配给该进程的 CPU 时间的百分比。 它计算如下:
(process CPU time / process duration) * 100

设想有两个进程:一个启动并运行五秒钟,但并不结束;然后另一个启动并运行五秒钟,但并不结束。 ps 命令现在将显示 50%%CPU用于第一个进程 (5 秒 CPU 表示 10 秒耗用时间) , 100% 用于第二个进程 (5 秒 CPU 表示 5 秒耗用时间)。

在一个 SMP 上,这个值要除以系统中可用的 CPU 个数。 回顾上一个例子,这就是为什么%CPUcpubound 进程的值从不超过 25 ,因为该示例在四路处理器系统上运行。 cpubound 进程使用 100% 的一个处理器,但%CPU值除以可用 CPU 数。

THREAD 选项

ps 命令可以显示线程以及使用 ps -mo THREAD 命令将线程或进程绑定到的 CPU。 下面是一个示例:
# ps -mo THREAD
USER PID   PPID  TID   ST CP PRI SC WCHAN F      TT    BND COMMAND
root 20918 20660 -     A  0  60  1  -     240001 pts/1 -   -ksh
-    -     -     20005 S  0  60  1  -     400    -     -   -

TID列显示线程标识,BND列显示与处理器绑定的进程和线程。

正常情况下,会看到一个名为kproc(操作系统版本 4 中的 PID 为 516) 使用 CPU 时间。 当没有线程可以在某个时间片中运行时,调度程序将该时间片的 CPU 时间分配给这个内核进程 (kproc),称为空闲等待 kproc。 SMP 系统对每个处理器都有一个空闲 kproc。