我有一台具有 4 个 GPU/128 个核心的服务器,我使用工作负载管理器 (slurm) 来管理用户之间的资源分配以进行计算。
问题是调度程序服务器(用于作业提交)在同一台计算机上运行(1),用户通过 ssh 连接来提交作业。
我想限制所有用户的资源分配(cpu/mem)仅在他们的 ssh 会话内,这样它们就不会在调度系统之外运行大量计算(但可以在作业内部运行)。
我知道我可以使用 cgroups 来实现这样的限制,例如:
cgcreate -g memory,cpu:cpulimited
cgset -r cpu.shares=100 cpulimited # limit to ~10% of cpu use
cgset -r memory.limit_in_bytes=$((10*1024*1024*1024)) # limit to 10 GB
如何确保任何 ssh 会话都将在此 cgroup 中运行cpulimited
?但与此同时,当 slurm 启动作业时,我不想绕过调度程序设置的限制(对于任何用户)。
(1) 我需要一个工作负载管理器,因为我有多个用户,没有它可能会很混乱,但是我没有任何其他机器可以作为调度服务器(就像在任何标准集群上一样)。
答案1
我找到了解决我的问题的方法,所以我分享它。
customssh/limit
我使用cgconfig
libcgroup 中的服务定义了一个 cgroup 。这是我的文件的摘录cgconfig.conf
:
group customssh/limit {
perm {
admin {
uid=root;
gid=root;
}
task {
uid=myuser;
gid=mygroup;
fperm=775;
}
}
cpu {
cpu.shares=50;
}
memory {
memory.limit_in_bytes="10G";
memory.memsw.limit_in_bytes="10G";
memory.soft_limit_in_bytes="2G";
}
devices {
devices.deny="c 195:* rwm";
}
}
fperm = 775
允许该组的用户mygroup
使用该cgroup- 我对 CPU 和内存使用实施限制,并拒绝对 GPU 的访问
devices.deny="c 195:* rwm";
我创建了在每次登录时运行的文件/etc/profile.d/ssh.sh
,内容如下:
# check if the user is in a ssh session
if [[ -n $SSH_CONNECTION ]]; then
# shell PID
SESSIONPID=$$
# attach the shell to the `customssh/limit` cgroup
cgclassify -g memory,cpu,devices:customssh/limit $SESSIONPID
# all processes run by this shell will be affected
fi