HugeTLB 控制器 【ChatGPT】

HugeTLB 控制器

HugeTLB 控制器可以通過首先掛載 cgroup 文件系統來創建。

# mount -t cgroup -o hugetlb none /sys/fs/cgroup

通過上述步驟,初始或父 HugeTLB 組將在 /sys/fs/cgroup 中可見。在啓動時,此組包括系統中的所有任務。/sys/fs/cgroup/tasks 列出了此 cgroup 中的任務。

可以在父組 /sys/fs/cgroup 下創建新組:

# cd /sys/fs/cgroup
# mkdir g1
# echo $$ > g1/tasks

上述步驟創建了一個新組 g1,並將當前 shell 進程(bash)移入其中。

控制文件的簡要摘要:

- hugetlb.<hugepagesize>.rsvd.limit_in_bytes            # 設置/顯示“hugepagesize”巨大頁保留的限制
- hugetlb.<hugepagesize>.rsvd.max_usage_in_bytes        # 顯示“hugepagesize”巨大頁保留和無保留故障的最大使用量
- hugetlb.<hugepagesize>.rsvd.usage_in_bytes            # 顯示“hugepagesize”巨大頁的當前保留和無保留故障
- hugetlb.<hugepagesize>.rsvd.failcnt                   # 顯示由於 HugeTLB 保留限制而導致的分配失敗次數
- hugetlb.<hugepagesize>.limit_in_bytes                 # 設置/顯示“hugepagesize”巨大頁故障的限制
- hugetlb.<hugepagesize>.max_usage_in_bytes             # 顯示記錄的“hugepagesize”巨大頁的最大使用量
- hugetlb.<hugepagesize>.usage_in_bytes                 # 顯示“hugepagesize”巨大頁的當前使用量
- hugetlb.<hugepagesize>.failcnt                        # 顯示由於 HugeTLB 使用限制而導致的分配失敗次數
- hugetlb.<hugepagesize>.numa_stat                      # 顯示分配給此 cgroup 的巨大頁內存的 numa 信息

對於支持三種巨大頁大小(64k、32M 和 1G)的系統,控制文件包括:

  • 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. 頁面故障記賬

hugetlb.<hugepagesize>.limit_in_bytes hugetlb.<hugepagesize>.max_usage_in_bytes hugetlb.<hugepagesize>.usage_in_bytes hugetlb.<hugepagesize>.failcnt

HugeTLB 控制器允許用戶限制每個控制組的 HugeTLB 使用(頁面故障),並在頁面故障期間強制執行限制。由於 HugeTLB 不支持頁面回收,在頁面故障時強制執行限制意味着,如果應用程序嘗試超出其限制故障 HugeTLB 頁面,應用程序將收到 SIGBUS 信號。因此,應用程序需要事先準確知道自己使用了多少 HugeTLB 頁面,並且系統管理員需要確保機器上有足夠的可用頁面以滿足所有用戶的請求,以避免進程收到 SIGBUS。

  1. 保留記賬

hugetlb.<hugepagesize>.rsvd.limit_in_bytes hugetlb.<hugepagesize>.rsvd.max_usage_in_bytes hugetlb.<hugepagesize>.rsvd.usage_in_bytes hugetlb.<hugepagesize>.rsvd.failcnt

HugeTLB 控制器允許限制每個控制組的 HugeTLB 保留,並在保留時和對沒有保留的 HugeTLB 內存的故障時強制執行控制器限制。由於保留限制是在保留時(在 mmap 或 shget 上)強制執行的,如果內存在事先保留,保留限制永遠不會導致應用程序收到 SIGBUS 信號。對於 MAP_NORESERVE 分配,保留限制的行爲與故障限制相同,強制在故障時使用內存,並導致應用程序在超出其限制時收到 SIGBUS。

保留限制優於上述頁面故障限制,因爲保留限制是在保留時(在 mmap 或 shget 上)強制執行的,並且如果內存在事先保留,永遠不會導致應用程序收到 SIGBUS 信號。這允許更容易地回退到其他選擇,例如非 HugeTLB 內存。在頁面故障記賬的情況下,要避免進程收到 SIGBUS 是非常困難的,因爲系統管理員需要準確知道系統中所有任務的 HugeTLB 使用量,並確保有足夠的頁面來滿足所有請求。在過度分配的系統上避免任務收到 SIGBUS 幾乎是不可能的。

  1. 共享內存的注意事項

對於共享的 HugeTLB 內存,首次導致內存被保留或故障的任務將對其進行記賬,而隨後對此保留或故障內存的所有使用將不再進行記賬。

只有在取消保留或釋放 HugeTLB 文件時,共享的 HugeTLB 內存纔會取消記賬。通常情況下,這是在導致保留或故障的任務退出時而不是在其退出時。

  1. HugeTLB cgroup 下線的注意事項

當 HugeTLB cgroup 下線時,仍然對其進行保留或故障記賬時的行爲如下:

  • 故障記賬會記入父 HugeTLB cgroup(重新分配),
  • 保留記賬仍留在下線的 HugeTLB cgroup 上。

這意味着,如果一個 HugeTLB cgroup 在仍然有 HugeTLB 保留記賬的情況下下線,該 cgroup 將持續存在爲殭屍,直到所有 HugeTLB 保留取消記賬。HugeTLB 保留的行爲方式與內存控制器相匹配,其 cgroup 也會持續存在爲殭屍,直到所有記賬內存取消記賬。此外,與 HugeTLB 故障的跟蹤相比,HugeTLB 保留的跟蹤更加複雜,因此在下線時重新分配保留是相當困難的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章