要實現linux限制進程上限的功能,需要用到Cgroups技術,它的全程Linux Control Group,用於限制一個進程組能夠使用的資源(CPU、內存、磁盤、網絡帶寬)上限,還能夠對進程進行優先級設置,以及進行將進程掛起恢復的操作。
Cgroups給用戶暴露出來的操作接口是文件系統,以目錄和文件的方式組織在/sys/fs/cgroup
路徑下。
執行ls /sys/fs/cgroup
命令可以看到如下文件列表
root@ubuntu:$ ls /sys/fs/cgroup
blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event rdma unified
cpu cpu,cpuacct devices hugetlb net_cls net_prio pids systemd
代表了可操作的各種資源
以cpu資源爲例,查看cpu
目錄,執行ls /sys/fs/cgroup/cpu
可以看到如下列表
root@ubuntu:$ ls /sys/fs/cgroup/cpu
cgroup.clone_children cpuacct.usage_all cpuacct.usage_user notify_on_release user.slice
cgroup.procs cpuacct.usage_percpu cpu.cfs_period_us release_agent
cgroup.sane_behavior cpuacct.usage_percpu_sys cpu.cfs_quota_us system.slice
cpuacct.stat cpuacct.usage_percpu_user cpu.shares tasks
cpuacct.usage cpuacct.usage_sys cpu.stat
其中tasks
文件列出了受限制的進程pid列表,cpu.cfs_period_us
和cpu.cfs_quota_us
文件搭配使用可以達到限制cpu使用率的目的,打開兩個文件分別看到內容如下
cpu.cfs_period_us
100000
cpu.cfs_quota_us
-1
表示100000us時間內不限制分配的cpu時間長度(-1表示不限制,如果將-1換成30000則表示允許分配30000us即30ms的cpu時間)
實踐一下
cgroup是樹型結構的,可以在當前樹下新建子節點,根目錄/sys/fs/cgroup/cpu
一般表示整個計算機。所以我們不是直接操作/sys/fs/cgroup/cpu
下面的文件,而是在目錄樹下創建一個名爲test
的子目錄,查看目錄可以發現操作系統會在新建的test
目錄下自動生成了該系統對應的資源限制文件
root@ubuntu:$ cd /sys/fs/cgroup/cpu
root@ubuntu:/sys/fs/cgroup/cpu$ mkdir test
root@ubuntu:/sys/fs/cgroup/cpu$ cd test
root@ubuntu:/sys/fs/cgroup/cpu$
root@ubuntu:/sys/fs/cgroup/cpu/test$ ls
cgroup.clone_children cpuacct.usage cpuacct.usage_percpu_sys cpuacct.usage_user cpu.shares tasks
cgroup.procs cpuacct.usage_all cpuacct.usage_percpu_user cpu.cfs_period_us cpu.stat
cpuacct.stat cpuacct.usage_percpu cpuacct.usage_sys cpu.cfs_quota_us notify_on_release
接下來,先啓動兩個用於測試的死循環進程,進程號分別爲15007和15952
root@ubuntu:/sys/fs/cgroup/cpu/test$ while : ; do : ; done &
[1] 15007
root@ubuntu:/sys/fs/cgroup/cpu/test$ while : ; do : ; done &
[2] 15952
查看此時的cpu使用情況,cpu使用率達到了93.8%
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15952 root 20 0 22776 2960 1212 R 50.0 0.1 18:18.90 bash
15007 root 20 0 22776 1684 0 R 43.8 0.1 24:04.92 bash
修改cpu.cfs_quota_us
文件和tasks
文件
root@ubuntu:/sys/fs/cgroup/cpu/test$ echo "40000" > cpu.cfs_quota_us
root@ubuntu:/sys/fs/cgroup/cpu/test$ echo -e "15007\n15952" > tasks
查看此時的cpu使用情況,發現cpu使用率成功降下來了
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15952 root 20 0 22776 2960 1212 R 20.3 0.1 20:04.56 bash
15007 root 20 0 22776 1684 0 R 19.9 0.1 25:50.57 bash
添加限制的進程
root@ubuntu:/sys/fs/cgroup/cpu/test$ echo -e "1234" > tasks
雖然上面寫文件使用的符號是單大於號>
,但實際上並不會覆蓋原本文件,實際效果是添加一個pid爲1234的進程到該cgroup組中
移除進程限制
在cgroup數中,一個進程必須屬於一個cgroup,所以不能從一個cgroup憑空刪除一個進程,只能將進程移動到其他cgroup節點,所以刪除操作也便成爲了將進程移動到cgroup樹的根節點
root@ubuntu:/sys/fs/cgroup/cpu/test$ echo "15007" > ../tasks
刪除cgroup組
刪除cgroup文件夾即可,但這裏使用rm -rf test
是行不通的,需要使用rmdir
命令。(刪除時需確保cgroup組中沒有進程存在)
root@ubuntu:/sys/fs/cgroup/cpu$ rmdir test