Linux設置進程分配CPU時間片上限

要實現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_uscpu.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章