iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Software Development

教練我想玩eBPF系列 第 26

Day26 - Cgroups

  • 分享至 

  • xImage
  •  

今天開始我們要進入我們BCC專案學習的最後一個實例了,這次我們要看的是examples/networking/sockmap.py這隻程式。(原始碼)

不過在開始進入到正題之前,我們要先來聊聊Linux上的一個重要功能cgroups (control groups),cgroups是Linux kernel內建的一個機制,可以以進程為最小單位,對可使用的CPU、memory、裝置I/O等資源進行限制、分割。

cgroups目前有v1和v2兩個版本,在分組策略架構上有所差異,這邊介紹只以v1為主

在cgroup的架構內,我們可以針對不同的資源類型進行獨立管理(稱為不同的subsystem或controller) ,一些可能的資源類型和一部份的功能簡介如下

  • cpu: 對一定時間週期內,可使用的cpu時間長度限制
  • memory: 限制記憶體使用上限以及超出上限時的行為
  • blkio: 控制對硬碟等設備的訪問速度上限
  • cpuacct: 用來統計目前的CPU使用情況
  • devices: 控制可以訪問那些device
  • pids: 限制cgroup內可建立的pid數量,也就是進程數量

接著是hierarchy,cgroup使用樹狀結構來管理資源,一個hierarchy預設會有一個根結點,所有的process (pid都會attach在這個節點上)。

一個hierarchy可以對應到零個或多個上述的subsystem,並在一個節點內設置上述的那些限制,那這些限制就會套用到在這個節點內的所有process。

可以在hierarchy內建立子節點,那子節點就會預設套用父節點的所有設置,然後可以只針對有興趣的項目作更細緻的調正。

一個process在一棵hierarchy只能attach在一個節點上,可以對process設定所在的節點。從process fork出來的process會在同一個節點上,但是搬運process到不同的節點,並不會影響子process。

Linux透過虛擬檔案系統來提供修改調整cgroups的user space介面。
通常來說介面會被掛載在/sys/fs/cgroup這個路徑下。

我們可以透過mount來建立hierarchy並把他關連到一個或多個subsystem

# 關連到CPU
mkdir /sys/fs/cgroup/cpu
mount -t cgroup -o cpu none /sys/fs/cgroup/cpu
# 關連到CPU和CPUACCT
mkdir /sys/fs/cgroup/cpu,cpuacct
mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct
# 不過/sys/fs/cgroup目錄可能會被系統設置為read only,避免隨意變更,而且通常不需要增減hierarchy本身,只是在hierarchy內增減節點管理

查看所有目前的hierarchy

ls /sys/fs/cgroup/ -l
total 0
dr-xr-xr-x 4 root root  0  十  11 22:50 blkio
lrwxrwxrwx 1 root root 11  十  11 22:50 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11  十  11 22:50 cpuacct -> cpu,cpuacct
dr-xr-xr-x 4 root root  0  十  11 22:50 cpu,cpuacct
dr-xr-xr-x 2 root root  0  十  11 22:50 cpuset
dr-xr-xr-x 4 root root  0  十  11 22:50 devices
dr-xr-xr-x 2 root root  0  十  11 22:50 freezer
dr-xr-xr-x 2 root root  0  十  11 22:50 hugetlb
dr-xr-xr-x 4 root root  0  十  11 22:50 memory
dr-xr-xr-x 2 root root  0  十  11 22:50 misc
lrwxrwxrwx 1 root root 16  十  11 22:50 net_cls -> net_cls,net_prio
dr-xr-xr-x 2 root root  0  十  11 22:50 net_cls,net_prio
lrwxrwxrwx 1 root root 16  十  11 22:50 net_prio -> net_cls,net_prio
dr-xr-xr-x 2 root root  0  十  11 22:50 perf_event
dr-xr-xr-x 4 root root  0  十  11 22:50 pids
dr-xr-xr-x 2 root root  0  十  11 22:50 rdma
dr-xr-xr-x 5 root root  0  十  11 22:50 systemd
dr-xr-xr-x 5 root root  0  十  11 22:50 unified

接著查看cpu的根結點

ls /sys/fs/cgroup/cpu/ -l
total 0
-rw-r--r--  1 root root 0  十  11 21:39 cgroup.clone_children
-rw-r--r--  1 root root 0  十  11 21:39 cgroup.procs
-r--r--r--  1 root root 0  十  11 21:39 cgroup.sane_behavior
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.stat
-rw-r--r--  1 root root 0  十  11 21:39 cpuacct.usage
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_all
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_percpu
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_percpu_sys
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_percpu_user
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_sys
-r--r--r--  1 root root 0  十  11 21:39 cpuacct.usage_user
-rw-r--r--  1 root root 0  十  11 21:39 cpu.cfs_period_us
-rw-r--r--  1 root root 0  十  11 21:39 cpu.cfs_quota_us
-rw-r--r--  1 root root 0  十  11 21:39 cpu.shares
-r--r--r--  1 root root 0  十  11 21:39 cpu.stat
drwxr-xr-x  4 root root 0  八  24 14:50 docker
-rw-r--r--  1 root root 0  十  11 21:39 notify_on_release
-rw-r--r--  1 root root 0  十  11 21:39 release_agent
drwxr-xr-x 96 root root 0  十  11 06:05 system.slice
-rw-r--r--  1 root root 0  十  11 21:39 tasks
drwxr-xr-x  2 root root 0  十  11 21:31 user.slice

由於前面可以看到cpu被link到cpu,cpuacct,所以可以同時查看到cpu.*和cpuacct.*的選項。

透過cpu.cfs_quota_us和cpu.cfs_period_us我們就能控制這個節點上所有process在period內可使用的CPU時間(quota)。

透過cat tasks我們可以看到所有attach在這個節點上的pid。

可以看到有三個資料夾docker, system.slice, user.slice,是三個hierarchy上的子節點,我們可以簡單的透過mkdir的方式建立子節點。由於這台設備上有跑docker,所以docker會在/sys/fs/cgroup/cpu/docker/目錄下為每個container建立獨立的子節點,透過cgroup的方式限制容器的資源使用量。

docker ps --format="{{.ID}}"
90f64cb70ee0
177d1a3920ec

ls /sys/fs/cgroup/cpu/docker -l
total 0
drwxr-xr-x 2 root root 0  八  24 14:50 177d1a3920ec9....
drwxr-xr-x 2 root root 0  八  24 14:50 90f64cb70ee068...
-rw-r--r-- 1 root root 0  十  11 21:39 cgroup.clone_children
-rw-r--r-- 1 root root 0  十  11 21:39 cgroup.procs
...

在許多發行版上使用systemd來做為核心系統管理程式,也就會透過systemd來管理cgroup,因此在設置kubelet時會建議將cgroup driver從cgroupfs改成systemd,統一由systemd來管理,避免同時有兩個系統在調整cgroup

cgroup v2調整了管理介面的結構,只保留了單一個hierarchy (/sys/fs/cgroup/unified)管理所有的subsystem,因為切出多個hierarchy來管理的方式被認為是不必要且增加系統複雜度的。

到這邊大概介紹完了cgroup,由於這次sockmap.py使用的program type的hook point會在cgroup上,所以趁這個機會詳細了解了一下cgroup。

本系列30天鐵人文章同步發表在我的個人部落格


上一篇
Day25 - eBPC tc direct
下一篇
Day27 - BCC sockmap (上)
系列文
教練我想玩eBPF30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言