在 Singularity 中如果需要限制容器的資源,也可以通過 Linux 的 cgroup 來實現。Singularity 對資源的限制是通過一個 .toml 文件來定義的,Singularity 提供了一個樣例配置文件 /etc/singularity/cgroups/cgroups.toml,後面做資源限制的時候可以參考。
如果要使用 Singularity 來限制資源,需要在啓動容器的時候使用 --apply-cgroups 選項來指定定義的 .toml 文件,且必須使用 root 用戶來執行,比如:
$ sudo singularity shell --apply-cgroups cgroups.toml centos.sif
如果要在容器裏使用普通用戶可以 “–security uid:1000” 選項來運行容器。
限制CPU資源
在 Singularity 中可以通過三種方式來限制CPU資源
- shares
- quota/period
- cpus/mems
這裏只說說比較好演示的第三種方法,先看看我限制測試機器的cpu情況,使用 lscpu 來查看,共有4個cpu,如下:
$ lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
0 0 0 0 0:0:0:0 yes 2401.0000 1600.0000
1 0 0 1 1:1:1:0 yes 2401.0000 1600.0000
2 0 0 2 2:2:2:0 yes 2401.0000 1600.0000
3 0 0 3 3:3:3:0 yes 2401.0000 1600.0000
下面創建一個 cpu.toml 文件,來指定只使用第0和1個 CPU 內容如下:
[cpu]
cpus = "0-1"
然後我們使用 cpu.toml 來啓動容器
$ sudo singularity shell --security uid:1000 --apply-cgroups cpu.toml centos.simg
然後在容器裏運行一個應用程序,比如 sleep 命令,然後在容器裏查看這個 sleep 命令可以使用的CPU信息,由於容器被限制了最多隻能使用兩個CPU,所以其內部運行的容器也最多隻能使用兩個CPU。
Singularity centos.simg:/singularity-study> sleep 12345 &
[1] 21390
Singularity centos.simg:/singularity-study> cat /proc/21390/status | grep Cpus_allowed_list
Cpus_allowed_list: 0-1
下面我們修改 cpu.toml 文件,來使用機器的全部CPU,修改後內容如下
[cpu]
cpus = "0-3"
再次在容器中運行應用程序並查看CPU情況
$ sudo singularity shell --security uid:1000 --apply-cgroups cpu.toml centos.simg
Singularity centos.simg:/singularity-study> sleep 12345 &
[1] 31539
Singularity centos.simg:/singularity-study> cat /proc/31539/status | grep Cpus_allowed_list
Cpus_allowed_list: 0-3
限制內存資源
和限制CPU類似,要限制內存也可以通過一個 .toml 文件來限制,比如:
[memory]
limit = 524288000
swap = 524288000
disableOOMKiller = false
這裏
- limit - 指定了內存的限制,單位是字節
- swap - 指定了 mem + swap 的限制,單位是字節
- disableOOMKiller - 指定當內存超限後,是否啓用kill容器策略
下面啓動一個容器,來看看對內存的限制
$ sudo singularity shell --security uid:1000 --apply-cgroups mem.toml centos.simg
然後在宿主節點上查看一下內存限制
$ cat /sys/fs/cgroup/memory/singularity/*/memory.limit_in_bytes
524288000
- 這裏說一下,本來想在容器裏啓動一個程序來演示的,後來測試了發現,容器裏運行的應用程序並不能限制住內存,不知道這是不是一個Bug。
其它
上面只是演示了怎樣顯示cpu和mem,其實 singularity 也可以限制其它資源,具體可以參考 /etc/singularity/cgroups/cgroups.toml 文件來配置。
參考
- https://sylabs.io/guides/3.2/user-guide/cgroups.html