结构体 taskstats

本文档包含对结构体 taskstats 字段的解释。

结构体 taskstats 中有三个不同的字段组

  1. 通用和基本帐户字段

    如果设置了 CONFIG_TASKSTATS,则启用 taskstats 接口,并在任务的 do_exit() 时收集通用字段和基本帐户字段以进行传递。

  2. 延迟帐户字段

    这些字段位于

    /* Delay accounting fields start */
    

    /* Delay accounting fields end */
    

    如果设置了 CONFIG_TASK_DELAY_ACCT,则收集它们的值。

  3. 扩展帐户字段

    这些字段位于

    /* Extended accounting fields start */
    

    /* Extended accounting fields end */
    

    如果设置了 CONFIG_TASK_XACCT,则收集它们的值。

  4. 每个任务和每个线程的上下文切换计数统计信息

  5. SMT 机器的时间帐户

  6. 用于内存回收的扩展延迟帐户字段

未来的扩展应将字段添加到 taskstats 结构的末尾,并且不应更改结构中每个字段的相对位置。

struct taskstats {
  1. 通用和基本帐户字段

    /* The version number of this struct. This field is always set to
     * TAKSTATS_VERSION, which is defined in <linux/taskstats.h>.
     * Each time the struct is changed, the value should be incremented.
     */
    __u16   version;
    
    /* The exit code of a task. */
    __u32   ac_exitcode;            /* Exit status */
    
    /* The accounting flags of a task as defined in <linux/acct.h>
     * Defined values are AFORK, ASU, ACOMPAT, ACORE, and AXSIG.
     */
    __u8    ac_flag;                /* Record flags */
    
    /* The value of task_nice() of a task. */
    __u8    ac_nice;                /* task_nice */
    
    /* The name of the command that started this task. */
    char    ac_comm[TS_COMM_LEN];   /* Command name */
    
    /* The scheduling discipline as set in task->policy field. */
    __u8    ac_sched;               /* Scheduling discipline */
    
    __u8    ac_pad[3];
    __u32   ac_uid;                 /* User ID */
    __u32   ac_gid;                 /* Group ID */
    __u32   ac_pid;                 /* Process ID */
    __u32   ac_ppid;                /* Parent process ID */
    
    /* The time when a task begins, in [secs] since 1970. */
    __u32   ac_btime;               /* Begin time [sec since 1970] */
    
    /* The elapsed time of a task, in [usec]. */
    __u64   ac_etime;               /* Elapsed time [usec] */
    
    /* The user CPU time of a task, in [usec]. */
    __u64   ac_utime;               /* User CPU time [usec] */
    
    /* The system CPU time of a task, in [usec]. */
    __u64   ac_stime;               /* System CPU time [usec] */
    
    /* The minor page fault count of a task, as set in task->min_flt. */
    __u64   ac_minflt;              /* Minor Page Fault Count */
    
    /* The major page fault count of a task, as set in task->maj_flt. */
    __u64   ac_majflt;              /* Major Page Fault Count */
    
  2. 延迟帐户字段

    /* Delay accounting fields start
     *
     * All values, until the comment "Delay accounting fields end" are
     * available only if delay accounting is enabled, even though the last
     * few fields are not delays
     *
     * xxx_count is the number of delay values recorded
     * xxx_delay_total is the corresponding cumulative delay in nanoseconds
     *
     * xxx_delay_total wraps around to zero on overflow
     * xxx_count incremented regardless of overflow
     */
    
    /* Delay waiting for cpu, while runnable
     * count, delay_total NOT updated atomically
     */
    __u64   cpu_count;
    __u64   cpu_delay_total;
    
    /* Following four fields atomically updated using task->delays->lock */
    
    /* Delay waiting for synchronous block I/O to complete
     * does not account for delays in I/O submission
     */
    __u64   blkio_count;
    __u64   blkio_delay_total;
    
    /* Delay waiting for page fault I/O (swap in only) */
    __u64   swapin_count;
    __u64   swapin_delay_total;
    
    /* cpu "wall-clock" running time
     * On some architectures, value will adjust for cpu time stolen
     * from the kernel in involuntary waits due to virtualization.
     * Value is cumulative, in nanoseconds, without a corresponding count
     * and wraps around to zero silently on overflow
     */
    __u64   cpu_run_real_total;
    
    /* cpu "virtual" running time
     * Uses time intervals seen by the kernel i.e. no adjustment
     * for kernel's involuntary waits due to virtualization.
     * Value is cumulative, in nanoseconds, without a corresponding count
     * and wraps around to zero silently on overflow
     */
    __u64   cpu_run_virtual_total;
    /* Delay accounting fields end */
    /* version 1 ends here */
    
  3. 扩展帐户字段

    /* Extended accounting fields start */
    
    /* Accumulated RSS usage in duration of a task, in MBytes-usecs.
     * The current rss usage is added to this counter every time
     * a tick is charged to a task's system time. So, at the end we
     * will have memory usage multiplied by system time. Thus an
     * average usage per system time unit can be calculated.
     */
    __u64   coremem;                /* accumulated RSS usage in MB-usec */
    
    /* Accumulated virtual memory usage in duration of a task.
     * Same as acct_rss_mem1 above except that we keep track of VM usage.
     */
    __u64   virtmem;                /* accumulated VM usage in MB-usec */
    
    /* High watermark of RSS usage in duration of a task, in KBytes. */
    __u64   hiwater_rss;            /* High-watermark of RSS usage */
    
    /* High watermark of VM  usage in duration of a task, in KBytes. */
    __u64   hiwater_vm;             /* High-water virtual memory usage */
    
    /* The following four fields are I/O statistics of a task. */
    __u64   read_char;              /* bytes read */
    __u64   write_char;             /* bytes written */
    __u64   read_syscalls;          /* read syscalls */
    __u64   write_syscalls;         /* write syscalls */
    
    /* Extended accounting fields end */
    
  4. 每个任务和每个线程的统计信息

    __u64   nvcsw;                  /* Context voluntary switch counter */
    __u64   nivcsw;                 /* Context involuntary switch counter */
    
  5. SMT 机器的时间帐户

    __u64   ac_utimescaled;         /* utime scaled on frequency etc */
    __u64   ac_stimescaled;         /* stime scaled on frequency etc */
    __u64   cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
    
  6. 用于内存回收的扩展延迟帐户字段

    /* Delay waiting for memory reclaim */
    __u64   freepages_count;
    __u64   freepages_delay_total;
    
}