diff options
| author | Keika Kobayashi <kobayashi.kk@ncos.nec.co.jp> | 2008-07-25 04:48:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-25 13:53:47 -0400 |
| commit | 873b47717732c2f33a4b14de02571a4295a02f0c (patch) | |
| tree | aaef0fe872dbd4ce5c290f3509e5db69f9a3f04a /include | |
| parent | 3e85ba034deec351f02cb55ff225bbd616463841 (diff) | |
per-task-delay-accounting: add memory reclaim delay
Sometimes, application responses become bad under heavy memory load.
Applications take a bit time to reclaim memory. The statistics, how long
memory reclaim takes, will be useful to measure memory usage.
This patch adds accounting memory reclaim to per-task-delay-accounting for
accounting the time of do_try_to_free_pages().
<i.e>
- When System is under low memory load,
memory reclaim may not occur.
$ free
total used free shared buffers cached
Mem: 8197800 1577300 6620500 0 4808 1516724
-/+ buffers/cache: 55768 8142032
Swap: 16386292 0 16386292
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 5069748 10612 3014060 0 0 0 0 3 26 0 0 100 0
0 0 0 5069748 10612 3014060 0 0 0 0 4 22 0 0 100 0
0 0 0 5069748 10612 3014060 0 0 0 0 3 18 0 0 100 0
Measure the time of tar command.
$ ls -s test.dat
1501472 test.dat
$ time tar cvf test.tar test.dat
real 0m13.388s
user 0m0.116s
sys 0m5.304s
$ ./delayget -d -p <pid>
CPU count real total virtual total delay total
428 5528345500 5477116080 62749891
IO count delay total
338 8078977189
SWAP count delay total
0 0
RECLAIM count delay total
0 0
- When system is under heavy memory load
memory reclaim may occur.
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 7159032 49724 1812 3012 0 0 0 0 3 24 0 0 100 0
0 0 7159032 49724 1812 3012 0 0 0 0 4 24 0 0 100 0
0 0 7159032 49848 1812 3012 0 0 0 0 3 22 0 0 100 0
In this case, one process uses more 8G memory
by execution of malloc() and memset().
$ time tar cvf test.tar test.dat
real 1m38.563s <- increased by 85 sec
user 0m0.140s
sys 0m7.060s
$ ./delayget -d -p <pid>
CPU count real total virtual total delay total
9021 7140446250 7315277975 923201824
IO count delay total
8965 90466349669
SWAP count delay total
3 21036367
RECLAIM count delay total
740 61011951153
In the later case, the value of RECLAIM is increasing.
So, taskstats can show how much memory reclaim influences TAT.
Signed-off-by: Keika Kobayashi <kobayashi.kk@ncos.nec.co.jp>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujistu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/delayacct.h | 19 | ||||
| -rw-r--r-- | include/linux/sched.h | 4 |
2 files changed, 23 insertions, 0 deletions
diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index ab94bc083558..f352f06fa063 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h | |||
| @@ -39,6 +39,8 @@ extern void __delayacct_blkio_start(void); | |||
| 39 | extern void __delayacct_blkio_end(void); | 39 | extern void __delayacct_blkio_end(void); |
| 40 | extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *); | 40 | extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *); |
| 41 | extern __u64 __delayacct_blkio_ticks(struct task_struct *); | 41 | extern __u64 __delayacct_blkio_ticks(struct task_struct *); |
| 42 | extern void __delayacct_freepages_start(void); | ||
| 43 | extern void __delayacct_freepages_end(void); | ||
| 42 | 44 | ||
| 43 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) | 45 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) |
| 44 | { | 46 | { |
| @@ -107,6 +109,18 @@ static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk) | |||
| 107 | return 0; | 109 | return 0; |
| 108 | } | 110 | } |
| 109 | 111 | ||
| 112 | static inline void delayacct_freepages_start(void) | ||
| 113 | { | ||
| 114 | if (current->delays) | ||
| 115 | __delayacct_freepages_start(); | ||
| 116 | } | ||
| 117 | |||
| 118 | static inline void delayacct_freepages_end(void) | ||
| 119 | { | ||
| 120 | if (current->delays) | ||
| 121 | __delayacct_freepages_end(); | ||
| 122 | } | ||
| 123 | |||
| 110 | #else | 124 | #else |
| 111 | static inline void delayacct_set_flag(int flag) | 125 | static inline void delayacct_set_flag(int flag) |
| 112 | {} | 126 | {} |
| @@ -129,6 +143,11 @@ static inline __u64 delayacct_blkio_ticks(struct task_struct *tsk) | |||
| 129 | { return 0; } | 143 | { return 0; } |
| 130 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) | 144 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) |
| 131 | { return 0; } | 145 | { return 0; } |
| 146 | static inline void delayacct_freepages_start(void) | ||
| 147 | {} | ||
| 148 | static inline void delayacct_freepages_end(void) | ||
| 149 | {} | ||
| 150 | |||
| 132 | #endif /* CONFIG_TASK_DELAY_ACCT */ | 151 | #endif /* CONFIG_TASK_DELAY_ACCT */ |
| 133 | 152 | ||
| 134 | #endif | 153 | #endif |
diff --git a/include/linux/sched.h b/include/linux/sched.h index d22ffe06d0eb..42036ffe6b00 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -672,6 +672,10 @@ struct task_delay_info { | |||
| 672 | /* io operations performed */ | 672 | /* io operations performed */ |
| 673 | u32 swapin_count; /* total count of the number of swapin block */ | 673 | u32 swapin_count; /* total count of the number of swapin block */ |
| 674 | /* io operations performed */ | 674 | /* io operations performed */ |
| 675 | |||
| 676 | struct timespec freepages_start, freepages_end; | ||
| 677 | u64 freepages_delay; /* wait for memory reclaim */ | ||
| 678 | u32 freepages_count; /* total count of memory reclaim */ | ||
| 675 | }; | 679 | }; |
| 676 | #endif /* CONFIG_TASK_DELAY_ACCT */ | 680 | #endif /* CONFIG_TASK_DELAY_ACCT */ |
| 677 | 681 | ||
