仅在 ssh 会话中限制资源(cpu/mem)

仅在 ssh 会话中限制资源(cpu/mem)

我有一台具有 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我使用cgconfiglibcgroup 中的服务定义了一个 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

相关内容