CentOS环境下如何限制非Slurm提交进程的资源
限制非Slurm提交进程资源的可行方案
针对单节点集群(登录/计算节点合一)的场景,要区分限制非Slurm交互式进程与Slurm作业进程,以下是几种实用方案:
方案1:Systemd Slice + PAM(精准控制,推荐)
利用systemd的cgroup切片机制,给用户交互式会话绑定资源限制,Slurm作业会自动使用独立的cgroup,不受此限制。
- 创建限制用的systemd切片单元
编辑/etc/systemd/system/limit-interactive.slice文件:
[Unit] Description=限制非Slurm交互式进程的资源切片 [Slice] CPUQuota=200% # 对应2个CPU核心(100%=1核心) MemoryMax=4G # 最大内存限制4GB MemoryHigh=4G # 内存超过阈值时触发回收
- 激活并加载切片
sudo systemctl daemon-reload sudo systemctl enable --now limit-interactive.slice
- 配置PAM让登录会话加入切片
编辑/etc/pam.d/login和/etc/pam.d/sshd,添加一行:
session required pam_systemd.so set_slice=limit-interactive.slice
此后用户通过SSH/本地登录的所有进程都会纳入该切片的资源限制,Slurm提交的作业会由Slurm创建专属cgroup,不受影响。
方案2:Slurm官方PAM模块(更贴合Slurm生态)
Slurm自带pam_slurm模块,可直接识别Slurm作业环境并区分限制。
安装pam_slurm模块
多数发行版中该模块随Slurm包附带,比如CentOS/RHEL安装slurm-pam,Debian/Ubuntu安装slurm-pam-dev。配置PAM规则
编辑/etc/pam.d/common-session(或对应登录/SSH配置文件),添加:
session required pam_slurm.so max_cpus=2 max_mem=4096
参数说明:max_cpus为CPU核心数,max_mem为内存限制(单位MB)。该模块会自动跳过Slurm作业进程,仅限制交互式会话。
方案3:自定义PAM执行脚本(轻量但精度有限)
通过PAM执行脚本,根据环境变量判断是否为Slurm作业,动态设置ulimit限制(仅能限制进程数、内存大小,无法精准绑定CPU核心)。
- 创建限制脚本
/usr/local/bin/limit_non_slurm.sh:
#!/bin/bash # 非Slurm会话则设置资源限制 if [ -z "$SLURM_JOB_ID" ]; then ulimit -u 4 # 限制最大进程/线程数(对应2核心场景) ulimit -v 4194304 # 限制虚拟内存4GB(单位KB) fi exit 0
- 赋予脚本执行权限:
sudo chmod +x /usr/local/bin/limit_non_slurm.sh
- 配置PAM调用脚本
编辑/etc/pam.d/login和/etc/pam.d/sshd,添加:
session required pam_exec.so /usr/local/bin/limit_non_slurm.sh
验证方式
- 交互式会话测试:直接登录后运行
stress --cpu 4 --vm-bytes 5G,观察CPU使用率不超过2核心,内存占用被限制在4GB以内。 - Slurm作业测试:提交示例中的sbatch脚本,运行相同stress命令,确认能使用申请的资源。
内容的提问来源于stack exchange,提问作者GooT
相关产品推荐
相关产品推荐

