在 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” 选项来运行容器。
在 Singularity 中可以通过三种方式来限制CPU资源
这里只说说比较好演示的第三种方法,先看看我限制测试机器的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
这里
下面启动一个容器,来看看对内存的限制
$ sudo singularity shell --security uid:1000 --apply-cgroups mem.toml centos.simg
然后在宿主节点上查看一下内存限制
$ cat /sys/fs/cgroup/memory/singularity/*/memory.limit_in_bytes
524288000
上面只是演示了怎样显示cpu和mem,其实 singularity 也可以限制其它资源,具体可以参考 /etc/singularity/cgroups/cgroups.toml 文件来配置。