Singularity入門之資源限制

  • 2019 年 10 月 7 日
  • 筆記

在 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 文件來配置。

參考