进程统计(Process Accounting)

进程统计(Process Accounting)

多数UNIX系统提供一个进程统计的选项。当开启时,每次有进程终止时都会写一条记录。这些记录记载了命令名、CPU使用时间、用户ID、组ID和开始时间等等。

超级用户执行accton命令带一个路径参数可以开启统计记录功能,不带任何参数关闭统计功能。

不同平台的路径通常如下:

  • FreeBSD和Mac OS X:/var/account/acct
  • Linux:/var/account/pacct
  • Solaris:/var/adm/pacct

统计记录(accounting record)是对应于进程的,而不是程序。由内核在fork之后为一个子进程初始化一个新记录,而不是一个新程序被执行。虽然exec不能创建一个新的统计记录,但是命令名会改变,并且AFORK标记被清除。这意味着,如果我们有一个由三个程序组成的链——A exec B, B exec C, 最后C退出,这时只写一条统计记录。命令名最后写的是C,但是CPU时间是三个程序的总和。

统计记录定义在<sys/acct.h>头文件中,看上去如下所示:

typedef  u_short comp_t;   /* 3-bit base 8 exponent; 13-bit fraction */

struct  acct
{
  char   ac_flag;     /* flag (see Figure 8.26) */
  char   ac_stat;     /* termination status (signal & core flag only) */
                      /* (Solaris only) */
  uid_t  ac_uid;      /* real user ID */
  gid_t  ac_gid;      /* real group ID */
  dev_t  ac_tty;      /* controlling terminal */
  time_t ac_btime;    /* starting calendar time */
  comp_t ac_utime;    /* user CPU time (clock ticks) */
  comp_t ac_stime;    /* system CPU time (clock ticks) */
  comp_t ac_etime;    /* elapsed time (clock ticks) */
  comp_t ac_mem;      /* average memory usage */
  comp_t ac_io;       /* bytes transferred (by read and write) */
                      /* "blocks" on BSD systems */
  comp_t ac_rw;       /* blocks read or written */
                      /* (not present on BSD systems) */
  char   ac_comm[8];  /* command name: [8] for Solaris, */
                      /* [10] for Mac OS X, [16] for FreeBSD, and */
                      /* [17] for Linux */
};

ac_stat成员并不是进程真正终止的状态,但是它是终止状态的一部分。如果进程不是正常终止的,这个字节中唯一的信息是core-flag位(通常是高位)和信号数(通常是低七位)。如果进程是正常结束,是不能从统计文件中得到exit状态的。

ac_flagF标记是给所有子进程设置的(除非子进程执行了exec)。

Figure 8.26. Values for ac_flag from accounting record

ac_flag

Description

FreeBSD 5.2.1

Linux 2.4.22

Mac OS X 10.3

Solaris 9

AFORK

进程是由fork产生的,但从未调用exec

ASU

进程使用超级用户权限

ACOMPAT

进程使用兼容模式

ACORE

process dumped core

AXSIG

进程由信号终止

AEXPND

expanded accounting entry

Comments are closed.