Singularity入門之資源限制

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