Commit 873b47717732c2f33a4b14de02571a4295a02f0c
Committed by
Linus Torvalds
1 parent
3e85ba034d
Exists in
master
and in
7 other branches
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>
Showing 4 changed files with 41 additions and 0 deletions Side-by-side Diff
include/linux/delayacct.h
... | ... | @@ -39,6 +39,8 @@ |
39 | 39 | extern void __delayacct_blkio_end(void); |
40 | 40 | extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *); |
41 | 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 | 45 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) |
44 | 46 | { |
... | ... | @@ -107,6 +109,18 @@ |
107 | 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 | 124 | #else |
111 | 125 | static inline void delayacct_set_flag(int flag) |
112 | 126 | {} |
... | ... | @@ -129,6 +143,11 @@ |
129 | 143 | { return 0; } |
130 | 144 | static inline int delayacct_is_task_waiting_on_io(struct task_struct *p) |
131 | 145 | { return 0; } |
146 | +static inline void delayacct_freepages_start(void) | |
147 | +{} | |
148 | +static inline void delayacct_freepages_end(void) | |
149 | +{} | |
150 | + | |
132 | 151 | #endif /* CONFIG_TASK_DELAY_ACCT */ |
133 | 152 | |
134 | 153 | #endif |
include/linux/sched.h
... | ... | @@ -672,6 +672,10 @@ |
672 | 672 | /* io operations performed */ |
673 | 673 | u32 swapin_count; /* total count of the number of swapin block */ |
674 | 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 | 680 | #endif /* CONFIG_TASK_DELAY_ACCT */ |
677 | 681 |
kernel/delayacct.c
... | ... | @@ -164,4 +164,17 @@ |
164 | 164 | spin_unlock_irqrestore(&tsk->delays->lock, flags); |
165 | 165 | return ret; |
166 | 166 | } |
167 | + | |
168 | +void __delayacct_freepages_start(void) | |
169 | +{ | |
170 | + delayacct_start(¤t->delays->freepages_start); | |
171 | +} | |
172 | + | |
173 | +void __delayacct_freepages_end(void) | |
174 | +{ | |
175 | + delayacct_end(¤t->delays->freepages_start, | |
176 | + ¤t->delays->freepages_end, | |
177 | + ¤t->delays->freepages_delay, | |
178 | + ¤t->delays->freepages_count); | |
179 | +} |
mm/vmscan.c
... | ... | @@ -38,6 +38,7 @@ |
38 | 38 | #include <linux/kthread.h> |
39 | 39 | #include <linux/freezer.h> |
40 | 40 | #include <linux/memcontrol.h> |
41 | +#include <linux/delayacct.h> | |
41 | 42 | |
42 | 43 | #include <asm/tlbflush.h> |
43 | 44 | #include <asm/div64.h> |
... | ... | @@ -1316,6 +1317,8 @@ |
1316 | 1317 | struct zone *zone; |
1317 | 1318 | enum zone_type high_zoneidx = gfp_zone(sc->gfp_mask); |
1318 | 1319 | |
1320 | + delayacct_freepages_start(); | |
1321 | + | |
1319 | 1322 | if (scan_global_lru(sc)) |
1320 | 1323 | count_vm_event(ALLOCSTALL); |
1321 | 1324 | /* |
... | ... | @@ -1395,6 +1398,8 @@ |
1395 | 1398 | } |
1396 | 1399 | } else |
1397 | 1400 | mem_cgroup_record_reclaim_priority(sc->mem_cgroup, priority); |
1401 | + | |
1402 | + delayacct_freepages_end(); | |
1398 | 1403 | |
1399 | 1404 | return ret; |
1400 | 1405 | } |