136 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| ==================
 | |
| HugeTLB Controller
 | |
| ==================
 | |
| 
 | |
| HugeTLB controller can be created by first mounting the cgroup filesystem.
 | |
| 
 | |
| # mount -t cgroup -o hugetlb none /sys/fs/cgroup
 | |
| 
 | |
| With the above step, the initial or the parent HugeTLB group becomes
 | |
| visible at /sys/fs/cgroup. At bootup, this group includes all the tasks in
 | |
| the system. /sys/fs/cgroup/tasks lists the tasks in this cgroup.
 | |
| 
 | |
| New groups can be created under the parent group /sys/fs/cgroup::
 | |
| 
 | |
|   # cd /sys/fs/cgroup
 | |
|   # mkdir g1
 | |
|   # echo $$ > g1/tasks
 | |
| 
 | |
| The above steps create a new group g1 and move the current shell
 | |
| process (bash) into it.
 | |
| 
 | |
| Brief summary of control files::
 | |
| 
 | |
|  hugetlb.<hugepagesize>.rsvd.limit_in_bytes            # set/show limit of "hugepagesize" hugetlb reservations
 | |
|  hugetlb.<hugepagesize>.rsvd.max_usage_in_bytes        # show max "hugepagesize" hugetlb reservations and no-reserve faults
 | |
|  hugetlb.<hugepagesize>.rsvd.usage_in_bytes            # show current reservations and no-reserve faults for "hugepagesize" hugetlb
 | |
|  hugetlb.<hugepagesize>.rsvd.failcnt                   # show the number of allocation failure due to HugeTLB reservation limit
 | |
|  hugetlb.<hugepagesize>.limit_in_bytes                 # set/show limit of "hugepagesize" hugetlb faults
 | |
|  hugetlb.<hugepagesize>.max_usage_in_bytes             # show max "hugepagesize" hugetlb  usage recorded
 | |
|  hugetlb.<hugepagesize>.usage_in_bytes                 # show current usage for "hugepagesize" hugetlb
 | |
|  hugetlb.<hugepagesize>.failcnt                        # show the number of allocation failure due to HugeTLB usage limit
 | |
|  hugetlb.<hugepagesize>.numa_stat                      # show the numa information of the hugetlb memory charged to this cgroup
 | |
| 
 | |
| For a system supporting three hugepage sizes (64k, 32M and 1G), the control
 | |
| files include::
 | |
| 
 | |
|   hugetlb.1GB.limit_in_bytes
 | |
|   hugetlb.1GB.max_usage_in_bytes
 | |
|   hugetlb.1GB.numa_stat
 | |
|   hugetlb.1GB.usage_in_bytes
 | |
|   hugetlb.1GB.failcnt
 | |
|   hugetlb.1GB.rsvd.limit_in_bytes
 | |
|   hugetlb.1GB.rsvd.max_usage_in_bytes
 | |
|   hugetlb.1GB.rsvd.usage_in_bytes
 | |
|   hugetlb.1GB.rsvd.failcnt
 | |
|   hugetlb.64KB.limit_in_bytes
 | |
|   hugetlb.64KB.max_usage_in_bytes
 | |
|   hugetlb.64KB.numa_stat
 | |
|   hugetlb.64KB.usage_in_bytes
 | |
|   hugetlb.64KB.failcnt
 | |
|   hugetlb.64KB.rsvd.limit_in_bytes
 | |
|   hugetlb.64KB.rsvd.max_usage_in_bytes
 | |
|   hugetlb.64KB.rsvd.usage_in_bytes
 | |
|   hugetlb.64KB.rsvd.failcnt
 | |
|   hugetlb.32MB.limit_in_bytes
 | |
|   hugetlb.32MB.max_usage_in_bytes
 | |
|   hugetlb.32MB.numa_stat
 | |
|   hugetlb.32MB.usage_in_bytes
 | |
|   hugetlb.32MB.failcnt
 | |
|   hugetlb.32MB.rsvd.limit_in_bytes
 | |
|   hugetlb.32MB.rsvd.max_usage_in_bytes
 | |
|   hugetlb.32MB.rsvd.usage_in_bytes
 | |
|   hugetlb.32MB.rsvd.failcnt
 | |
| 
 | |
| 
 | |
| 1. Page fault accounting
 | |
| 
 | |
| hugetlb.<hugepagesize>.limit_in_bytes
 | |
| hugetlb.<hugepagesize>.max_usage_in_bytes
 | |
| hugetlb.<hugepagesize>.usage_in_bytes
 | |
| hugetlb.<hugepagesize>.failcnt
 | |
| 
 | |
| The HugeTLB controller allows users to limit the HugeTLB usage (page fault) per
 | |
| control group and enforces the limit during page fault. Since HugeTLB
 | |
| doesn't support page reclaim, enforcing the limit at page fault time implies
 | |
| that, the application will get SIGBUS signal if it tries to fault in HugeTLB
 | |
| pages beyond its limit. Therefore the application needs to know exactly how many
 | |
| HugeTLB pages it uses before hand, and the sysadmin needs to make sure that
 | |
| there are enough available on the machine for all the users to avoid processes
 | |
| getting SIGBUS.
 | |
| 
 | |
| 
 | |
| 2. Reservation accounting
 | |
| 
 | |
| hugetlb.<hugepagesize>.rsvd.limit_in_bytes
 | |
| hugetlb.<hugepagesize>.rsvd.max_usage_in_bytes
 | |
| hugetlb.<hugepagesize>.rsvd.usage_in_bytes
 | |
| hugetlb.<hugepagesize>.rsvd.failcnt
 | |
| 
 | |
| The HugeTLB controller allows to limit the HugeTLB reservations per control
 | |
| group and enforces the controller limit at reservation time and at the fault of
 | |
| HugeTLB memory for which no reservation exists. Since reservation limits are
 | |
| enforced at reservation time (on mmap or shget), reservation limits never causes
 | |
| the application to get SIGBUS signal if the memory was reserved before hand. For
 | |
| MAP_NORESERVE allocations, the reservation limit behaves the same as the fault
 | |
| limit, enforcing memory usage at fault time and causing the application to
 | |
| receive a SIGBUS if it's crossing its limit.
 | |
| 
 | |
| Reservation limits are superior to page fault limits described above, since
 | |
| reservation limits are enforced at reservation time (on mmap or shget), and
 | |
| never causes the application to get SIGBUS signal if the memory was reserved
 | |
| before hand. This allows for easier fallback to alternatives such as
 | |
| non-HugeTLB memory for example. In the case of page fault accounting, it's very
 | |
| hard to avoid processes getting SIGBUS since the sysadmin needs precisely know
 | |
| the HugeTLB usage of all the tasks in the system and make sure there is enough
 | |
| pages to satisfy all requests. Avoiding tasks getting SIGBUS on overcommited
 | |
| systems is practically impossible with page fault accounting.
 | |
| 
 | |
| 
 | |
| 3. Caveats with shared memory
 | |
| 
 | |
| For shared HugeTLB memory, both HugeTLB reservation and page faults are charged
 | |
| to the first task that causes the memory to be reserved or faulted, and all
 | |
| subsequent uses of this reserved or faulted memory is done without charging.
 | |
| 
 | |
| Shared HugeTLB memory is only uncharged when it is unreserved or deallocated.
 | |
| This is usually when the HugeTLB file is deleted, and not when the task that
 | |
| caused the reservation or fault has exited.
 | |
| 
 | |
| 
 | |
| 4. Caveats with HugeTLB cgroup offline.
 | |
| 
 | |
| When a HugeTLB cgroup goes offline with some reservations or faults still
 | |
| charged to it, the behavior is as follows:
 | |
| 
 | |
| - The fault charges are charged to the parent HugeTLB cgroup (reparented),
 | |
| - the reservation charges remain on the offline HugeTLB cgroup.
 | |
| 
 | |
| This means that if a HugeTLB cgroup gets offlined while there is still HugeTLB
 | |
| reservations charged to it, that cgroup persists as a zombie until all HugeTLB
 | |
| reservations are uncharged. HugeTLB reservations behave in this manner to match
 | |
| the memory controller whose cgroups also persist as zombie until all charged
 | |
| memory is uncharged. Also, the tracking of HugeTLB reservations is a bit more
 | |
| complex compared to the tracking of HugeTLB faults, so it is significantly
 | |
| harder to reparent reservations at offline time.
 |