About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / cgroups / memory.txt

Custom Search

Based on kernel version 3.15.4. Page generated on 2014-07-07 09:00 EST.

1	Memory Resource Controller
3	NOTE: The Memory Resource Controller has generically been referred to as the
4	      memory controller in this document. Do not confuse memory controller
5	      used here with the memory controller that is used in hardware.
7	(For editors)
8	In this document:
9	      When we mention a cgroup (cgroupfs's directory) with memory controller,
10	      we call it "memory cgroup". When you see git-log and source code, you'll
11	      see patch's title and function names tend to use "memcg".
12	      In this document, we avoid using it.
14	Benefits and Purpose of the memory controller
16	The memory controller isolates the memory behaviour of a group of tasks
17	from the rest of the system. The article on LWN [12] mentions some probable
18	uses of the memory controller. The memory controller can be used to
20	a. Isolate an application or a group of applications
21	   Memory-hungry applications can be isolated and limited to a smaller
22	   amount of memory.
23	b. Create a cgroup with a limited amount of memory; this can be used
24	   as a good alternative to booting with mem=XXXX.
25	c. Virtualization solutions can control the amount of memory they want
26	   to assign to a virtual machine instance.
27	d. A CD/DVD burner could control the amount of memory used by the
28	   rest of the system to ensure that burning does not fail due to lack
29	   of available memory.
30	e. There are several other use cases; find one or use the controller just
31	   for fun (to learn and hack on the VM subsystem).
33	Current Status: linux-2.6.34-mmotm(development version of 2010/April)
35	Features:
36	 - accounting anonymous pages, file caches, swap caches usage and limiting them.
37	 - pages are linked to per-memcg LRU exclusively, and there is no global LRU.
38	 - optionally, memory+swap usage can be accounted and limited.
39	 - hierarchical accounting
40	 - soft limit
41	 - moving (recharging) account at moving a task is selectable.
42	 - usage threshold notifier
43	 - memory pressure notifier
44	 - oom-killer disable knob and oom-notifier
45	 - Root cgroup has no limit controls.
47	 Kernel memory support is a work in progress, and the current version provides
48	 basically functionality. (See Section 2.7)
50	Brief summary of control files.
52	 tasks				 # attach a task(thread) and show list of threads
53	 cgroup.procs			 # show list of processes
54	 cgroup.event_control		 # an interface for event_fd()
55	 memory.usage_in_bytes		 # show current res_counter usage for memory
56					 (See 5.5 for details)
57	 memory.memsw.usage_in_bytes	 # show current res_counter usage for memory+Swap
58					 (See 5.5 for details)
59	 memory.limit_in_bytes		 # set/show limit of memory usage
60	 memory.memsw.limit_in_bytes	 # set/show limit of memory+Swap usage
61	 memory.failcnt			 # show the number of memory usage hits limits
62	 memory.memsw.failcnt		 # show the number of memory+Swap hits limits
63	 memory.max_usage_in_bytes	 # show max memory usage recorded
64	 memory.memsw.max_usage_in_bytes # show max memory+Swap usage recorded
65	 memory.soft_limit_in_bytes	 # set/show soft limit of memory usage
66	 memory.stat			 # show various statistics
67	 memory.use_hierarchy		 # set/show hierarchical account enabled
68	 memory.force_empty		 # trigger forced move charge to parent
69	 memory.pressure_level		 # set memory pressure notifications
70	 memory.swappiness		 # set/show swappiness parameter of vmscan
71					 (See sysctl's vm.swappiness)
72	 memory.move_charge_at_immigrate # set/show controls of moving charges
73	 memory.oom_control		 # set/show oom controls.
74	 memory.numa_stat		 # show the number of memory usage per numa node
76	 memory.kmem.limit_in_bytes      # set/show hard limit for kernel memory
77	 memory.kmem.usage_in_bytes      # show current kernel memory allocation
78	 memory.kmem.failcnt             # show the number of kernel memory usage hits limits
79	 memory.kmem.max_usage_in_bytes  # show max kernel memory usage recorded
81	 memory.kmem.tcp.limit_in_bytes  # set/show hard limit for tcp buf memory
82	 memory.kmem.tcp.usage_in_bytes  # show current tcp buf memory allocation
83	 memory.kmem.tcp.failcnt            # show the number of tcp buf memory usage hits limits
84	 memory.kmem.tcp.max_usage_in_bytes # show max tcp buf memory usage recorded
86	1. History
88	The memory controller has a long history. A request for comments for the memory
89	controller was posted by Balbir Singh [1]. At the time the RFC was posted
90	there were several implementations for memory control. The goal of the
91	RFC was to build consensus and agreement for the minimal features required
92	for memory control. The first RSS controller was posted by Balbir Singh[2]
93	in Feb 2007. Pavel Emelianov [3][4][5] has since posted three versions of the
94	RSS controller. At OLS, at the resource management BoF, everyone suggested
95	that we handle both page cache and RSS together. Another request was raised
96	to allow user space handling of OOM. The current memory controller is
97	at version 6; it combines both mapped (RSS) and unmapped Page
98	Cache Control [11].
100	2. Memory Control
102	Memory is a unique resource in the sense that it is present in a limited
103	amount. If a task requires a lot of CPU processing, the task can spread
104	its processing over a period of hours, days, months or years, but with
105	memory, the same physical memory needs to be reused to accomplish the task.
107	The memory controller implementation has been divided into phases. These
108	are:
110	1. Memory controller
111	2. mlock(2) controller
112	3. Kernel user memory accounting and slab control
113	4. user mappings length controller
115	The memory controller is the first controller developed.
117	2.1. Design
119	The core of the design is a counter called the res_counter. The res_counter
120	tracks the current memory usage and limit of the group of processes associated
121	with the controller. Each cgroup has a memory controller specific data
122	structure (mem_cgroup) associated with it.
124	2.2. Accounting
126			+--------------------+
127			|  mem_cgroup     |
128			|  (res_counter)     |
129			+--------------------+
130			 /            ^      \
131			/             |       \
132	           +---------------+  |        +---------------+
133	           | mm_struct     |  |....    | mm_struct     |
134	           |               |  |        |               |
135	           +---------------+  |        +---------------+
136	                              |
137	                              + --------------+
138	                                              |
139	           +---------------+           +------+--------+
140	           | page          +---------->  page_cgroup|
141	           |               |           |               |
142	           +---------------+           +---------------+
144	             (Figure 1: Hierarchy of Accounting)
147	Figure 1 shows the important aspects of the controller
149	1. Accounting happens per cgroup
150	2. Each mm_struct knows about which cgroup it belongs to
151	3. Each page has a pointer to the page_cgroup, which in turn knows the
152	   cgroup it belongs to
154	The accounting is done as follows: mem_cgroup_charge_common() is invoked to
155	set up the necessary data structures and check if the cgroup that is being
156	charged is over its limit. If it is, then reclaim is invoked on the cgroup.
157	More details can be found in the reclaim section of this document.
158	If everything goes well, a page meta-data-structure called page_cgroup is
159	updated. page_cgroup has its own LRU on cgroup.
160	(*) page_cgroup structure is allocated at boot/memory-hotplug time.
162	2.2.1 Accounting details
164	All mapped anon pages (RSS) and cache pages (Page Cache) are accounted.
165	Some pages which are never reclaimable and will not be on the LRU
166	are not accounted. We just account pages under usual VM management.
168	RSS pages are accounted at page_fault unless they've already been accounted
169	for earlier. A file page will be accounted for as Page Cache when it's
170	inserted into inode (radix-tree). While it's mapped into the page tables of
171	processes, duplicate accounting is carefully avoided.
173	An RSS page is unaccounted when it's fully unmapped. A PageCache page is
174	unaccounted when it's removed from radix-tree. Even if RSS pages are fully
175	unmapped (by kswapd), they may exist as SwapCache in the system until they
176	are really freed. Such SwapCaches are also accounted.
177	A swapped-in page is not accounted until it's mapped.
179	Note: The kernel does swapin-readahead and reads multiple swaps at once.
180	This means swapped-in pages may contain pages for other tasks than a task
181	causing page fault. So, we avoid accounting at swap-in I/O.
183	At page migration, accounting information is kept.
185	Note: we just account pages-on-LRU because our purpose is to control amount
186	of used pages; not-on-LRU pages tend to be out-of-control from VM view.
188	2.3 Shared Page Accounting
190	Shared pages are accounted on the basis of the first touch approach. The
191	cgroup that first touches a page is accounted for the page. The principle
192	behind this approach is that a cgroup that aggressively uses a shared
193	page will eventually get charged for it (once it is uncharged from
194	the cgroup that brought it in -- this will happen on memory pressure).
196	But see section 8.2: when moving a task to another cgroup, its pages may
197	be recharged to the new cgroup, if move_charge_at_immigrate has been chosen.
199	Exception: If CONFIG_MEMCG_SWAP is not used.
200	When you do swapoff and make swapped-out pages of shmem(tmpfs) to
201	be backed into memory in force, charges for pages are accounted against the
202	caller of swapoff rather than the users of shmem.
204	2.4 Swap Extension (CONFIG_MEMCG_SWAP)
206	Swap Extension allows you to record charge for swap. A swapped-in page is
207	charged back to original page allocator if possible.
209	When swap is accounted, following files are added.
210	 - memory.memsw.usage_in_bytes.
211	 - memory.memsw.limit_in_bytes.
213	memsw means memory+swap. Usage of memory+swap is limited by
214	memsw.limit_in_bytes.
216	Example: Assume a system with 4G of swap. A task which allocates 6G of memory
217	(by mistake) under 2G memory limitation will use all swap.
218	In this case, setting memsw.limit_in_bytes=3G will prevent bad use of swap.
219	By using the memsw limit, you can avoid system OOM which can be caused by swap
220	shortage.
222	* why 'memory+swap' rather than swap.
223	The global LRU(kswapd) can swap out arbitrary pages. Swap-out means
224	to move account from memory to swap...there is no change in usage of
225	memory+swap. In other words, when we want to limit the usage of swap without
226	affecting global LRU, memory+swap limit is better than just limiting swap from
227	an OS point of view.
229	* What happens when a cgroup hits memory.memsw.limit_in_bytes
230	When a cgroup hits memory.memsw.limit_in_bytes, it's useless to do swap-out
231	in this cgroup. Then, swap-out will not be done by cgroup routine and file
232	caches are dropped. But as mentioned above, global LRU can do swapout memory
233	from it for sanity of the system's memory management state. You can't forbid
234	it by cgroup.
236	2.5 Reclaim
238	Each cgroup maintains a per cgroup LRU which has the same structure as
239	global VM. When a cgroup goes over its limit, we first try
240	to reclaim memory from the cgroup so as to make space for the new
241	pages that the cgroup has touched. If the reclaim is unsuccessful,
242	an OOM routine is invoked to select and kill the bulkiest task in the
243	cgroup. (See 10. OOM Control below.)
245	The reclaim algorithm has not been modified for cgroups, except that
246	pages that are selected for reclaiming come from the per-cgroup LRU
247	list.
249	NOTE: Reclaim does not work for the root cgroup, since we cannot set any
250	limits on the root cgroup.
252	Note2: When panic_on_oom is set to "2", the whole system will panic.
254	When oom event notifier is registered, event will be delivered.
255	(See oom_control section)
257	2.6 Locking
259	   lock_page_cgroup()/unlock_page_cgroup() should not be called under
260	   mapping->tree_lock.
262	   Other lock order is following:
263	   PG_locked.
264	   mm->page_table_lock
265	       zone->lru_lock
266		  lock_page_cgroup.
267	  In many cases, just lock_page_cgroup() is called.
268	  per-zone-per-cgroup LRU (cgroup's private LRU) is just guarded by
269	  zone->lru_lock, it has no lock of its own.
271	2.7 Kernel Memory Extension (CONFIG_MEMCG_KMEM)
273	With the Kernel memory extension, the Memory Controller is able to limit
274	the amount of kernel memory used by the system. Kernel memory is fundamentally
275	different than user memory, since it can't be swapped out, which makes it
276	possible to DoS the system by consuming too much of this precious resource.
278	Kernel memory won't be accounted at all until limit on a group is set. This
279	allows for existing setups to continue working without disruption.  The limit
280	cannot be set if the cgroup have children, or if there are already tasks in the
281	cgroup. Attempting to set the limit under those conditions will return -EBUSY.
282	When use_hierarchy == 1 and a group is accounted, its children will
283	automatically be accounted regardless of their limit value.
285	After a group is first limited, it will be kept being accounted until it
286	is removed. The memory limitation itself, can of course be removed by writing
287	-1 to memory.kmem.limit_in_bytes. In this case, kmem will be accounted, but not
288	limited.
290	Kernel memory limits are not imposed for the root cgroup. Usage for the root
291	cgroup may or may not be accounted. The memory used is accumulated into
292	memory.kmem.usage_in_bytes, or in a separate counter when it makes sense.
293	(currently only for tcp).
294	The main "kmem" counter is fed into the main counter, so kmem charges will
295	also be visible from the user counter.
297	Currently no soft limit is implemented for kernel memory. It is future work
298	to trigger slab reclaim when those limits are reached.
300	2.7.1 Current Kernel Memory resources accounted
302	* stack pages: every process consumes some stack pages. By accounting into
303	kernel memory, we prevent new processes from being created when the kernel
304	memory usage is too high.
306	* slab pages: pages allocated by the SLAB or SLUB allocator are tracked. A copy
307	of each kmem_cache is created every time the cache is touched by the first time
308	from inside the memcg. The creation is done lazily, so some objects can still be
309	skipped while the cache is being created. All objects in a slab page should
310	belong to the same memcg. This only fails to hold when a task is migrated to a
311	different memcg during the page allocation by the cache.
313	* sockets memory pressure: some sockets protocols have memory pressure
314	thresholds. The Memory Controller allows them to be controlled individually
315	per cgroup, instead of globally.
317	* tcp memory pressure: sockets memory pressure for the tcp protocol.
319	2.7.3 Common use cases
321	Because the "kmem" counter is fed to the main user counter, kernel memory can
322	never be limited completely independently of user memory. Say "U" is the user
323	limit, and "K" the kernel limit. There are three possible ways limits can be
324	set:
326	    U != 0, K = unlimited:
327	    This is the standard memcg limitation mechanism already present before kmem
328	    accounting. Kernel memory is completely ignored.
330	    U != 0, K < U:
331	    Kernel memory is a subset of the user memory. This setup is useful in
332	    deployments where the total amount of memory per-cgroup is overcommited.
333	    Overcommiting kernel memory limits is definitely not recommended, since the
334	    box can still run out of non-reclaimable memory.
335	    In this case, the admin could set up K so that the sum of all groups is
336	    never greater than the total memory, and freely set U at the cost of his
337	    QoS.
339	    U != 0, K >= U:
340	    Since kmem charges will also be fed to the user counter and reclaim will be
341	    triggered for the cgroup for both kinds of memory. This setup gives the
342	    admin a unified view of memory, and it is also useful for people who just
343	    want to track kernel memory usage.
345	3. User Interface
347	0. Configuration
349	a. Enable CONFIG_CGROUPS
351	c. Enable CONFIG_MEMCG
352	d. Enable CONFIG_MEMCG_SWAP (to use swap extension)
353	d. Enable CONFIG_MEMCG_KMEM (to use kmem extension)
355	1. Prepare the cgroups (see cgroups.txt, Why are cgroups needed?)
356	# mount -t tmpfs none /sys/fs/cgroup
357	# mkdir /sys/fs/cgroup/memory
358	# mount -t cgroup none /sys/fs/cgroup/memory -o memory
360	2. Make the new group and move bash into it
361	# mkdir /sys/fs/cgroup/memory/0
362	# echo $$ > /sys/fs/cgroup/memory/0/tasks
364	Since now we're in the 0 cgroup, we can alter the memory limit:
365	# echo 4M > /sys/fs/cgroup/memory/0/memory.limit_in_bytes
367	NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo,
368	mega or gigabytes. (Here, Kilo, Mega, Giga are Kibibytes, Mebibytes, Gibibytes.)
370	NOTE: We can write "-1" to reset the *.limit_in_bytes(unlimited).
371	NOTE: We cannot set limits on the root cgroup any more.
373	# cat /sys/fs/cgroup/memory/0/memory.limit_in_bytes
374	4194304
376	We can check the usage:
377	# cat /sys/fs/cgroup/memory/0/memory.usage_in_bytes
378	1216512
380	A successful write to this file does not guarantee a successful setting of
381	this limit to the value written into the file. This can be due to a
382	number of factors, such as rounding up to page boundaries or the total
383	availability of memory on the system. The user is required to re-read
384	this file after a write to guarantee the value committed by the kernel.
386	# echo 1 > memory.limit_in_bytes
387	# cat memory.limit_in_bytes
388	4096
390	The memory.failcnt field gives the number of times that the cgroup limit was
391	exceeded.
393	The memory.stat file gives accounting information. Now, the number of
394	caches, RSS and Active pages/Inactive pages are shown.
396	4. Testing
398	For testing features and implementation, see memcg_test.txt.
400	Performance test is also important. To see pure memory controller's overhead,
401	testing on tmpfs will give you good numbers of small overheads.
402	Example: do kernel make on tmpfs.
404	Page-fault scalability is also important. At measuring parallel
405	page fault test, multi-process test may be better than multi-thread
406	test because it has noise of shared objects/status.
408	But the above two are testing extreme situations.
409	Trying usual test under memory controller is always helpful.
411	4.1 Troubleshooting
413	Sometimes a user might find that the application under a cgroup is
414	terminated by the OOM killer. There are several causes for this:
416	1. The cgroup limit is too low (just too low to do anything useful)
417	2. The user is using anonymous memory and swap is turned off or too low
419	A sync followed by echo 1 > /proc/sys/vm/drop_caches will help get rid of
420	some of the pages cached in the cgroup (page cache pages).
422	To know what happens, disabling OOM_Kill as per "10. OOM Control" (below) and
423	seeing what happens will be helpful.
425	4.2 Task migration
427	When a task migrates from one cgroup to another, its charge is not
428	carried forward by default. The pages allocated from the original cgroup still
429	remain charged to it, the charge is dropped when the page is freed or
430	reclaimed.
432	You can move charges of a task along with task migration.
433	See 8. "Move charges at task migration"
435	4.3 Removing a cgroup
437	A cgroup can be removed by rmdir, but as discussed in sections 4.1 and 4.2, a
438	cgroup might have some charge associated with it, even though all
439	tasks have migrated away from it. (because we charge against pages, not
440	against tasks.)
442	We move the stats to root (if use_hierarchy==0) or parent (if
443	use_hierarchy==1), and no change on the charge except uncharging
444	from the child.
446	Charges recorded in swap information is not updated at removal of cgroup.
447	Recorded information is discarded and a cgroup which uses swap (swapcache)
448	will be charged as a new owner of it.
450	About use_hierarchy, see Section 6.
452	5. Misc. interfaces.
454	5.1 force_empty
455	  memory.force_empty interface is provided to make cgroup's memory usage empty.
456	  You can use this interface only when the cgroup has no tasks.
457	  When writing anything to this
459	  # echo 0 > memory.force_empty
461	  Almost all pages tracked by this memory cgroup will be unmapped and freed.
462	  Some pages cannot be freed because they are locked or in-use. Such pages are
463	  moved to parent (if use_hierarchy==1) or root (if use_hierarchy==0) and this
464	  cgroup will be empty.
466	  The typical use case for this interface is before calling rmdir().
467	  Because rmdir() moves all pages to parent, some out-of-use page caches can be
468	  moved to the parent. If you want to avoid that, force_empty will be useful.
470	  Also, note that when memory.kmem.limit_in_bytes is set the charges due to
471	  kernel pages will still be seen. This is not considered a failure and the
472	  write will still return success. In this case, it is expected that
473	  memory.kmem.usage_in_bytes == memory.usage_in_bytes.
475	  About use_hierarchy, see Section 6.
477	5.2 stat file
479	memory.stat file includes following statistics
481	# per-memory cgroup local status
482	cache		- # of bytes of page cache memory.
483	rss		- # of bytes of anonymous and swap cache memory (includes
484			transparent hugepages).
485	rss_huge	- # of bytes of anonymous transparent hugepages.
486	mapped_file	- # of bytes of mapped file (includes tmpfs/shmem)
487	pgpgin		- # of charging events to the memory cgroup. The charging
488			event happens each time a page is accounted as either mapped
489			anon page(RSS) or cache page(Page Cache) to the cgroup.
490	pgpgout		- # of uncharging events to the memory cgroup. The uncharging
491			event happens each time a page is unaccounted from the cgroup.
492	swap		- # of bytes of swap usage
493	writeback	- # of bytes of file/anon cache that are queued for syncing to
494			disk.
495	inactive_anon	- # of bytes of anonymous and swap cache memory on inactive
496			LRU list.
497	active_anon	- # of bytes of anonymous and swap cache memory on active
498			LRU list.
499	inactive_file	- # of bytes of file-backed memory on inactive LRU list.
500	active_file	- # of bytes of file-backed memory on active LRU list.
501	unevictable	- # of bytes of memory that cannot be reclaimed (mlocked etc).
503	# status considering hierarchy (see memory.use_hierarchy settings)
505	hierarchical_memory_limit - # of bytes of memory limit with regard to hierarchy
506				under which the memory cgroup is
507	hierarchical_memsw_limit - # of bytes of memory+swap limit with regard to
508				hierarchy under which memory cgroup is.
510	total_<counter>		- # hierarchical version of <counter>, which in
511				addition to the cgroup's own value includes the
512				sum of all hierarchical children's values of
513				<counter>, i.e. total_cache
515	# The following additional stats are dependent on CONFIG_DEBUG_VM.
517	recent_rotated_anon	- VM internal parameter. (see mm/vmscan.c)
518	recent_rotated_file	- VM internal parameter. (see mm/vmscan.c)
519	recent_scanned_anon	- VM internal parameter. (see mm/vmscan.c)
520	recent_scanned_file	- VM internal parameter. (see mm/vmscan.c)
522	Memo:
523		recent_rotated means recent frequency of LRU rotation.
524		recent_scanned means recent # of scans to LRU.
525		showing for better debug please see the code for meanings.
527	Note:
528		Only anonymous and swap cache memory is listed as part of 'rss' stat.
529		This should not be confused with the true 'resident set size' or the
530		amount of physical memory used by the cgroup.
531		'rss + file_mapped" will give you resident set size of cgroup.
532		(Note: file and shmem may be shared among other cgroups. In that case,
533		 file_mapped is accounted only when the memory cgroup is owner of page
534		 cache.)
536	5.3 swappiness
538	Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only.
539	Please note that unlike the global swappiness, memcg knob set to 0
540	really prevents from any swapping even if there is a swap storage
541	available. This might lead to memcg OOM killer if there are no file
542	pages to reclaim.
544	Following cgroups' swappiness can't be changed.
545	- root cgroup (uses /proc/sys/vm/swappiness).
546	- a cgroup which uses hierarchy and it has other cgroup(s) below it.
547	- a cgroup which uses hierarchy and not the root of hierarchy.
549	5.4 failcnt
551	A memory cgroup provides memory.failcnt and memory.memsw.failcnt files.
552	This failcnt(== failure count) shows the number of times that a usage counter
553	hit its limit. When a memory cgroup hits a limit, failcnt increases and
554	memory under it will be reclaimed.
556	You can reset failcnt by writing 0 to failcnt file.
557	# echo 0 > .../memory.failcnt
559	5.5 usage_in_bytes
561	For efficiency, as other kernel components, memory cgroup uses some optimization
562	to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the
563	method and doesn't show 'exact' value of memory (and swap) usage, it's a fuzz
564	value for efficient access. (Of course, when necessary, it's synchronized.)
565	If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP)
566	value in memory.stat(see 5.2).
568	5.6 numa_stat
570	This is similar to numa_maps but operates on a per-memcg basis.  This is
571	useful for providing visibility into the numa locality information within
572	an memcg since the pages are allowed to be allocated from any physical
573	node.  One of the use cases is evaluating application performance by
574	combining this information with the application's CPU allocation.
576	Each memcg's numa_stat file includes "total", "file", "anon" and "unevictable"
577	per-node page counts including "hierarchical_<counter>" which sums up all
578	hierarchical children's values in addition to the memcg's own value.
580	The output format of memory.numa_stat is:
582	total=<total pages> N0=<node 0 pages> N1=<node 1 pages> ...
583	file=<total file pages> N0=<node 0 pages> N1=<node 1 pages> ...
584	anon=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
585	unevictable=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
586	hierarchical_<counter>=<counter pages> N0=<node 0 pages> N1=<node 1 pages> ...
588	The "total" count is sum of file + anon + unevictable.
590	6. Hierarchy support
592	The memory controller supports a deep hierarchy and hierarchical accounting.
593	The hierarchy is created by creating the appropriate cgroups in the
594	cgroup filesystem. Consider for example, the following cgroup filesystem
595	hierarchy
597		       root
598		     /  |   \
599	            /	|    \
600		   a	b     c
601			      | \
602			      |  \
603			      d   e
605	In the diagram above, with hierarchical accounting enabled, all memory
606	usage of e, is accounted to its ancestors up until the root (i.e, c and root),
607	that has memory.use_hierarchy enabled. If one of the ancestors goes over its
608	limit, the reclaim algorithm reclaims from the tasks in the ancestor and the
609	children of the ancestor.
611	6.1 Enabling hierarchical accounting and reclaim
613	A memory cgroup by default disables the hierarchy feature. Support
614	can be enabled by writing 1 to memory.use_hierarchy file of the root cgroup
616	# echo 1 > memory.use_hierarchy
618	The feature can be disabled by
620	# echo 0 > memory.use_hierarchy
622	NOTE1: Enabling/disabling will fail if either the cgroup already has other
623	       cgroups created below it, or if the parent cgroup has use_hierarchy
624	       enabled.
626	NOTE2: When panic_on_oom is set to "2", the whole system will panic in
627	       case of an OOM event in any cgroup.
629	7. Soft limits
631	Soft limits allow for greater sharing of memory. The idea behind soft limits
632	is to allow control groups to use as much of the memory as needed, provided
634	a. There is no memory contention
635	b. They do not exceed their hard limit
637	When the system detects memory contention or low memory, control groups
638	are pushed back to their soft limits. If the soft limit of each control
639	group is very high, they are pushed back as much as possible to make
640	sure that one control group does not starve the others of memory.
642	Please note that soft limits is a best-effort feature; it comes with
643	no guarantees, but it does its best to make sure that when memory is
644	heavily contended for, memory is allocated based on the soft limit
645	hints/setup. Currently soft limit based reclaim is set up such that
646	it gets invoked from balance_pgdat (kswapd).
648	7.1 Interface
650	Soft limits can be setup by using the following commands (in this example we
651	assume a soft limit of 256 MiB)
653	# echo 256M > memory.soft_limit_in_bytes
655	If we want to change this to 1G, we can at any time use
657	# echo 1G > memory.soft_limit_in_bytes
659	NOTE1: Soft limits take effect over a long period of time, since they involve
660	       reclaiming memory for balancing between memory cgroups
661	NOTE2: It is recommended to set the soft limit always below the hard limit,
662	       otherwise the hard limit will take precedence.
664	8. Move charges at task migration
666	Users can move charges associated with a task along with task migration, that
667	is, uncharge task's pages from the old cgroup and charge them to the new cgroup.
668	This feature is not supported in !CONFIG_MMU environments because of lack of
669	page tables.
671	8.1 Interface
673	This feature is disabled by default. It can be enabled (and disabled again) by
674	writing to memory.move_charge_at_immigrate of the destination cgroup.
676	If you want to enable it:
678	# echo (some positive value) > memory.move_charge_at_immigrate
680	Note: Each bits of move_charge_at_immigrate has its own meaning about what type
681	      of charges should be moved. See 8.2 for details.
682	Note: Charges are moved only when you move mm->owner, in other words,
683	      a leader of a thread group.
684	Note: If we cannot find enough space for the task in the destination cgroup, we
685	      try to make space by reclaiming memory. Task migration may fail if we
686	      cannot make enough space.
687	Note: It can take several seconds if you move charges much.
689	And if you want disable it again:
691	# echo 0 > memory.move_charge_at_immigrate
693	8.2 Type of charges which can be moved
695	Each bit in move_charge_at_immigrate has its own meaning about what type of
696	charges should be moved. But in any case, it must be noted that an account of
697	a page or a swap can be moved only when it is charged to the task's current
698	(old) memory cgroup.
700	  bit | what type of charges would be moved ?
701	 -----+------------------------------------------------------------------------
702	   0  | A charge of an anonymous page (or swap of it) used by the target task.
703	      | You must enable Swap Extension (see 2.4) to enable move of swap charges.
704	 -----+------------------------------------------------------------------------
705	   1  | A charge of file pages (normal file, tmpfs file (e.g. ipc shared memory)
706	      | and swaps of tmpfs file) mmapped by the target task. Unlike the case of
707	      | anonymous pages, file pages (and swaps) in the range mmapped by the task
708	      | will be moved even if the task hasn't done page fault, i.e. they might
709	      | not be the task's "RSS", but other task's "RSS" that maps the same file.
710	      | And mapcount of the page is ignored (the page can be moved even if
711	      | page_mapcount(page) > 1). You must enable Swap Extension (see 2.4) to
712	      | enable move of swap charges.
714	8.3 TODO
716	- All of moving charge operations are done under cgroup_mutex. It's not good
717	  behavior to hold the mutex too long, so we may need some trick.
719	9. Memory thresholds
721	Memory cgroup implements memory thresholds using the cgroups notification
722	API (see cgroups.txt). It allows to register multiple memory and memsw
723	thresholds and gets notifications when it crosses.
725	To register a threshold, an application must:
726	- create an eventfd using eventfd(2);
727	- open memory.usage_in_bytes or memory.memsw.usage_in_bytes;
728	- write string like "<event_fd> <fd of memory.usage_in_bytes> <threshold>" to
729	  cgroup.event_control.
731	Application will be notified through eventfd when memory usage crosses
732	threshold in any direction.
734	It's applicable for root and non-root cgroup.
736	10. OOM Control
738	memory.oom_control file is for OOM notification and other controls.
740	Memory cgroup implements OOM notifier using the cgroup notification
741	API (See cgroups.txt). It allows to register multiple OOM notification
742	delivery and gets notification when OOM happens.
744	To register a notifier, an application must:
745	 - create an eventfd using eventfd(2)
746	 - open memory.oom_control file
747	 - write string like "<event_fd> <fd of memory.oom_control>" to
748	   cgroup.event_control
750	The application will be notified through eventfd when OOM happens.
751	OOM notification doesn't work for the root cgroup.
753	You can disable the OOM-killer by writing "1" to memory.oom_control file, as:
755		#echo 1 > memory.oom_control
757	This operation is only allowed to the top cgroup of a sub-hierarchy.
758	If OOM-killer is disabled, tasks under cgroup will hang/sleep
759	in memory cgroup's OOM-waitqueue when they request accountable memory.
761	For running them, you have to relax the memory cgroup's OOM status by
762		* enlarge limit or reduce usage.
763	To reduce usage,
764		* kill some tasks.
765		* move some tasks to other group with account migration.
766		* remove some files (on tmpfs?)
768	Then, stopped tasks will work again.
770	At reading, current status of OOM is shown.
771		oom_kill_disable 0 or 1 (if 1, oom-killer is disabled)
772		under_oom	 0 or 1 (if 1, the memory cgroup is under OOM, tasks may
773					 be stopped.)
775	11. Memory Pressure
777	The pressure level notifications can be used to monitor the memory
778	allocation cost; based on the pressure, applications can implement
779	different strategies of managing their memory resources. The pressure
780	levels are defined as following:
782	The "low" level means that the system is reclaiming memory for new
783	allocations. Monitoring this reclaiming activity might be useful for
784	maintaining cache level. Upon notification, the program (typically
785	"Activity Manager") might analyze vmstat and act in advance (i.e.
786	prematurely shutdown unimportant services).
788	The "medium" level means that the system is experiencing medium memory
789	pressure, the system might be making swap, paging out active file caches,
790	etc. Upon this event applications may decide to further analyze
791	vmstat/zoneinfo/memcg or internal memory usage statistics and free any
792	resources that can be easily reconstructed or re-read from a disk.
794	The "critical" level means that the system is actively thrashing, it is
795	about to out of memory (OOM) or even the in-kernel OOM killer is on its
796	way to trigger. Applications should do whatever they can to help the
797	system. It might be too late to consult with vmstat or any other
798	statistics, so it's advisable to take an immediate action.
800	The events are propagated upward until the event is handled, i.e. the
801	events are not pass-through. Here is what this means: for example you have
802	three cgroups: A->B->C. Now you set up an event listener on cgroups A, B
803	and C, and suppose group C experiences some pressure. In this situation,
804	only group C will receive the notification, i.e. groups A and B will not
805	receive it. This is done to avoid excessive "broadcasting" of messages,
806	which disturbs the system and which is especially bad if we are low on
807	memory or thrashing. So, organize the cgroups wisely, or propagate the
808	events manually (or, ask us to implement the pass-through events,
809	explaining why would you need them.)
811	The file memory.pressure_level is only used to setup an eventfd. To
812	register a notification, an application must:
814	- create an eventfd using eventfd(2);
815	- open memory.pressure_level;
816	- write string like "<event_fd> <fd of memory.pressure_level> <level>"
817	  to cgroup.event_control.
819	Application will be notified through eventfd when memory pressure is at
820	the specific level (or higher). Read/write operations to
821	memory.pressure_level are no implemented.
823	Test:
825	   Here is a small script example that makes a new cgroup, sets up a
826	   memory limit, sets up a notification in the cgroup and then makes child
827	   cgroup experience a critical pressure:
829	   # cd /sys/fs/cgroup/memory/
830	   # mkdir foo
831	   # cd foo
832	   # cgroup_event_listener memory.pressure_level low &
833	   # echo 8000000 > memory.limit_in_bytes
834	   # echo 8000000 > memory.memsw.limit_in_bytes
835	   # echo $$ > tasks
836	   # dd if=/dev/zero | read x
838	   (Expect a bunch of notifications, and eventually, the oom-killer will
839	   trigger.)
841	12. TODO
843	1. Make per-cgroup scanner reclaim not-shared pages first
844	2. Teach controller to account for shared-pages
845	3. Start reclamation in the background when the limit is
846	   not yet hit but the usage is getting closer
848	Summary
850	Overall, the memory controller has been a stable controller and has been
851	commented and discussed quite extensively in the community.
853	References
855	1. Singh, Balbir. RFC: Memory Controller, http://lwn.net/Articles/206697/
856	2. Singh, Balbir. Memory Controller (RSS Control),
857	   http://lwn.net/Articles/222762/
858	3. Emelianov, Pavel. Resource controllers based on process cgroups
859	   http://lkml.org/lkml/2007/3/6/198
860	4. Emelianov, Pavel. RSS controller based on process cgroups (v2)
861	   http://lkml.org/lkml/2007/4/9/78
862	5. Emelianov, Pavel. RSS controller based on process cgroups (v3)
863	   http://lkml.org/lkml/2007/5/30/244
864	6. Menage, Paul. Control Groups v10, http://lwn.net/Articles/236032/
865	7. Vaidyanathan, Srinivasan, Control Groups: Pagecache accounting and control
866	   subsystem (v3), http://lwn.net/Articles/235534/
867	8. Singh, Balbir. RSS controller v2 test results (lmbench),
868	   http://lkml.org/lkml/2007/5/17/232
869	9. Singh, Balbir. RSS controller v2 AIM9 results
870	   http://lkml.org/lkml/2007/5/18/1
871	10. Singh, Balbir. Memory controller v6 test results,
872	    http://lkml.org/lkml/2007/8/19/36
873	11. Singh, Balbir. Memory controller introduction (v6),
874	    http://lkml.org/lkml/2007/8/17/69
875	12. Corbet, Jonathan, Controlling memory use in cgroups,
876	    http://lwn.net/Articles/243795/
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.