csa accounting taskstats update
Subsystems (3)
PATCH 1/1 csa accounting taskstats update
Hi Andrew,
This patch addresses the feedbacks from you and Balbir.
This patch is generated against 2.6.18-rc3 plus your patch
+ csa-basic-accounting-over-taskstats-fix.patch
This patch is to be applied after your patch which you already added to -mm tree.
I test built on ia64, i386 and x86_64 build servers.
ChangeLog:
Feedbacks from Andrew Morton:
- define TS_COMM_LEN to 32
- change acct_stimexpd field of task_struct to be of cputime_t, which is to be used to save the tsk->stime of last timer interrupt update.
- a new Documentation/accounting/taskstats-struct.txt to describe fields of taskstats struct.
Feedback from Balbir Singh:
- keep the stime of a task to be zero when both stime and utime are zero as recoreded in task_struct.
Misc:
- convert accumulated RSS/VM from platform dependent pages-ticks to MBytes-usecs in the kernel
include/linux/taskstats.h +31 -9
@@ -32,14 +32,21 @@#define TASKSTATS_VERSION 2 -#define TS_COMM_LEN 16/* should sync up with TASK_COMM_LEN +#define TS_COMM_LEN 32/* should sync up with TASK_COMM_LEN * in linux/sched.h */ struct taskstats { -/* Version 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; -__u32 ac_exitcode;/* Exit status */ +__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 */ __u8 ac_nice;/* task_nice */
@@ -104,15 +111,30 @@ struct taskstats {__u64 ac_etime;/* Elapsed time [usec] */ __u64 ac_utime;/* User CPU time [usec] */ __u64 ac_stime;/* SYstem CPU time [usec] */ -__u64 ac_minflt;/* Minor Page Fault */ -__u64 ac_majflt;/* Major Page Fault */ +__u64 ac_minflt;/* Minor Page Fault Count */ +__u64 ac_majflt;/* Major Page Fault Count */ /* Basic Accounting Fields end */ /* Extended accounting fields start */ -__u64 acct_rss_mem1;/* accumulated rss usage */ -__u64 acct_vm_mem1;/* accumulated virtual memory usage */ -__u64 hiwater_rss;/* High-watermark of RSS usage */ -__u64 hiwater_vm;/* High-water virtual memory usage */ +/* 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 and virtual memory usage in duration of +* a task, in KBytes. +*/ +__u64 hiwater_rss;/* High-watermark of RSS usage, in KB */ +__u64 hiwater_vm;/* High-water VM usage, in KB */ + +/* 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 */
include/linux/sched.h +1 -1
@@ -967,7 +967,7 @@ struct task_struct {#if defined(CONFIG_TASK_XACCT )u64 acct_rss_mem1;/* accumulated rss usage */ u64 acct_vm_mem1;/* accumulated virtual memory usage */ -clock_t acct_stimexpd;/* clock_t-converted stime since last update */ +cputime_t acct_stimexpd;/* stime since last update */ #endif #ifdef CONFIG_NUMA struct mempolicy *mempolicy;
kernel/tsacct.c +14 -11
@@ -20,6 +20,7 @@#include <linux/sched.h> #include <linux/tsacct_kern.h> #include <linux/acct.h> +#include <linux/jiffies.h> #define USEC_PER_TICK (USEC_PER_SEC/HZ)
@@ -62,33 +63,35 @@ void bacct_add_tsk(struct taskstats *sta stats->ac_stime =cputime_to_msecs (tsk->stime) *USEC_PER_MSEC ; stats->ac_minflt = tsk->min_flt; stats->ac_majflt = tsk->maj_flt; -/* Each process gets a minimum of one usec cpu time */ -if ((stats->ac_utime ==0 ) && (stats->ac_stime ==0 )) { - stats->ac_stime =1 ; - }strncpy (stats->ac_comm, tsk->comm,sizeof (stats->ac_comm)); }#ifdef CONFIG_TASK_XACCT + +#define KB 1024 +#define MB (1024*KB)/* * fill in extended accounting fields */ void xacct_add_tsk (struct taskstats *stats,struct task_struct *p) { - stats->acct_rss_mem1 = p->acct_rss_mem1; - stats->acct_vm_mem1 = p->acct_vm_mem1; +/* convert pages-jiffies to Mbyte-usec */ + stats->coremem =jiffies_to_usecs (p->acct_rss_mem1) *PAGE_SIZE /MB ; + stats->virtmem =jiffies_to_usecs (p->acct_vm_mem1) *PAGE_SIZE /MB ;if (p->mm) { - stats->hiwater_rss = p->mm->hiwater_rss; - stats->hiwater_vm = p->mm->hiwater_vm; +/* adjust to KB unit */ + stats->hiwater_rss = p->mm->hiwater_rss *PAGE_SIZE /KB ; + stats->hiwater_vm = p->mm->hiwater_vm *PAGE_SIZE /KB ; } stats->read_char = p->rchar; stats->write_char = p->wchar; stats->read_syscalls = p->syscr; stats->write_syscalls = p->syscw; } - +#undef KB +#undef MB/** * acct_update_integrals - update mm integral fields in task_struct
@@ -97,8 +100,8 @@ void xacct_add_tsk(struct taskstats *stavoid acct_update_integrals (struct task_struct *tsk) {if (likely (tsk->mm)) { -long delta = -cputime_to_jiffies (tsk->stime) - tsk->acct_stimexpd; +long delta =cputime_to_jiffies ( +cputime_sub (tsk->stime, tsk->acct_stimexpd));if (delta ==0 )return ;
Documentation/accounting/taskstats-struct.txt new file +161 -0
161 lines not on this page · raw message
Quoted 9 lines · On Tue, 08 Aug 2006 12:33:29 -0700 Jay Lan <[email protected]> wrote:
ChangeLog:
Feedbacks from Andrew Morton:
- defineTS_COMM_LENto 32
- changeacct_stimexpdfield oftask_structto be ofcputime_t, which is to be used to save thetsk->stimeof last timer interrupt update.
- a newDocumentation/accounting/taskstats-struct.txtto describe fields of taskstats struct.
Quoted 7 lines
Feedback from Balbir Singh:
- keep the stime of a task to be zero when both stime and utime are zero as recoreded intask_struct.Misc:
- convert accumulated RSS/VM from platform dependent pages-ticks to MBytes-usecs in the kernel
hm, lot of things, thanks.
Where does one go to obtain the userspace side of things so we can play with this stuff?