4つのGPU / 128コアを持つサーバーがあり、ワークロードマネージャ(slurm)を使用して計算用のユーザー間のリソース割り当てを管理します。
問題は、スケジューラサーバー(ジョブの送信に使用される)が同じシステム(1)で実行されており、ユーザーがジョブを送信するためにSSHを介して接続していることです。
すべてのユーザーのリソース割り当て(cpu / mem)を制限したいです。SSHセッション内でのみ、スケジュールシステムの外部で多くの計算を実行しないようにします(ただし、タスクの内部では実行できます)。
私はcgroupを使用してそのような制限を達成できることを知っています。たとえば、次のようになります。
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
このcgroup内でSSHセッションを実行するにはどうすればよいですか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