国家超算中心 srun CPU 提示错误 should be kept no more than DefMemPerCPU
srun -p kshctest -q htc --cpus-per-task=4 --mem=16G --pty /bin/bash
srun: error: Unable to allocate resources: Job submission failed because too much memory was requested relative to the number of CPUs requested. The requested memory:CPU should be kept no more than DefMemPerCPU
srun: ======= Tips: reduce job’s request memory (–mem or --memory-per-cpu) =======
这个错误是因为你请求的内存与 CPU 比例超过了该分区/QoS 的DefMemPerCPU限制。
答案 salloc -p kshctest -q user_acz6ty4okx --cpus-per-task=4 --mem=16G 用户名替换下 user_acz6ty4okx 队列名 也替换下 kshctest
队列名 可以再这里看 https://www.scnet.cn/ui/console/index.html#/my-product/basic-resources/computing-cesource
查看命令 sacctmgr show assoc user=$USER format=cluster,partition,qos
Cluster Partition QOS 查看
问题分析
你的请求:
- CPU: 4 核
- 内存: 16G
- 内存/CPU 比: 4G/核
而kshctest分区或htcQoS 配置的DefMemPerCPU大概率低于 4G/核(常见值可能是 2G 或 3G)。
解决方案
方案 1:减少内存(推荐)
将内存降到符合比例限制,例如尝试8G(假设限制是 2G/核):
srun-pkshctest-qhtc --cpus-per-task=4--mem=8G--pty/bin/bash如果不确定具体限制,可以逐步尝试--mem=4G、--mem=8G、--mem=12G。
方案 2:增加 CPU 数量
保持 16G 内存,但增加 CPU 数量使比例合规:
srun-pkshctest-qhtc --cpus-per-task=8--mem=16G--pty/bin/bash方案 3:使用--mem-per-cpu替代--mem
显式控制每核内存,更不容易触发此错误:
srun-pkshctest-qhtc --cpus-per-task=4--mem-per-cpu=2G--pty/bin/bash方案 4:查看集群具体限制(确认 DefMemPerCPU)
你可以查看该分区的配置:
scontrol show partition kshctest或查看 QoS 限制:
sacctmgr show qos htcformat=name,maxmempercpu建议
如果你实际只需要 4 核但确实需要大内存,建议:
- 先尝试
--mem=8G看是否能成功 - 如果不够,联系集群管理员确认
DefMemPerCPU具体数值,或申请使用大内存分区/队列
srun -p kshctest -q htc --cpus-per-task=4 --mem=8G --pty /bin/bash srun: error: Unable to allocate resources: Invalid qos specification
这个错误说明htc这个 QoS 在kshctest分区上不存在,或者你没有权限使用它。
解决方案
方案 1:去掉 QoS 参数直接提交(最可能解决)
srun-pkshctest --cpus-per-task=4--mem=8G--pty/bin/bash方案 2:查看你有哪些 QoS 可用
sacctmgr show assocuser=$USERformat=cluster,partition,qos或查看所有可用 QoS:
sacctmgr show qosformat=name方案 3:查看 kshctest 分区支持的 QoS
scontrol show partition kshctest|grep-iqos方案 4:查看该分区默认/允许的 QoS
scontrol show partition kshctest关注QoS或AllowQos字段。
常见情况
- 如果
kshctest是默认分区,可能不需要指定-q - 某些分区只允许特定的 QoS(如
normal、debug、batch等),htc可能不在这个列表里
sacctmgr show assoc user=$USER format=cluster,partition,qos
sacctmgr show assoc user=$USER format=cluster,partition,qos
Cluster Partition QOS
QoS全称是Quality of Service,在 Slurm 集群调度系统中翻译为服务质量或服务质量等级。
简单理解
QoS 是集群管理员给用户分配的一套资源使用规则套餐,规定了你能用什么、用多少、怎么用。
类比
就像手机套餐:
- 你的 QoS 是
user_acz6ty4okx→ 相当于你的专属套餐 - 别人的 QoS 可能是
htc、debug、gpu等 → 别人的不同套餐
每个套餐(QoS)包含不同的资源限额和优先级规则:
- 最多能申请多少 CPU/内存/GPU
- 最长能运行多久
- 能提交多少个作业
- 作业排队优先级高低
- 能访问哪些分区
在 Slurm 中的作用
| 参数 | 含义 |
|---|---|
-q/--qos | 指定使用哪个 QoS 套餐 |
sacctmgr show assoc user=$USER | 查看你有哪些可用套餐 |
为什么之前报错?
你之前用了-q htc,但你的账号只关联了user_acz6ty4okx这个 QoS,所以系统说“Invalid qos specification”(无效的 QoS 规格)—— 就像你拿着别人的套餐卡去消费,系统不认。
总结
QoS = 你的资源使用权限套餐。提交作业时必须用你自己账号关联的那个 QoS,否则会被拒绝。
cancon user
_acz6ty4okx
你的可用 QoS 是user_acz6ty4okx,不是htc。同时你的关联集群是cancon。
正确的提交方式
基础命令(使用正确 QoS)
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=8G--pty/bin/bash如果集群需要显式指定
srun-Mcancon-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=8G--pty/bin/bash或
srun--cluster=cancon-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=8G--pty/bin/bash关于内存问题
你之前遇到的内存/CPU 比例超限问题可能仍然存在。如果上面的命令报同样的DefMemPerCPU错误,继续降低内存:
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=4G--pty/bin/bash或增加 CPU:
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=8--mem=16G--pty/bin/bash快速验证
先试试最简单的:
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=4G--pty/bin/bashsrun -p kshctest -q user_acz6ty4okx --cpus-per-task=4 --mem=8G --pty /bin/bash
srun: job 114729946 queued and waiting for resources
srun: job 114729946 has been allocated resources
srun: ROUTE: split_hostlist: hl=a13r3n02 tree_width 0
如果成功,再根据需要逐步增加内存。
现象说明
ROUTE: split_hostlist: hl=a13r3n02 tree_width 0
资源已经分配成功(allocate resources),卡在slurm跨节点pty通道建连:调度拿到a13r3n02节点资源,但登录机 ↔ 计算节点slurmd端口不通/拓扑路由异常,终端shell起不来,死等链路。
方案1:改用salloc分步交互(绕开srun跨节点pty网络阻塞,曙光最稳用法)
# 1.先预占资源,留在login节点salloc-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=16G# 输出会显示分配节点如 a13r3n02,直接ssh进节点ssha13r3n02进去就是原生交互式bash,无slurm路由转发,彻底避开ROUTE阻塞。
用完exit两次依次退出节点、释放资源。
内存规则:单CPU固定4G,4核=16G、8核=32G、32核=128G,不再超限报错。
方案2:srun加参数绕过拓扑路由,强制单机直连
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=16G --disable-topo--pty/bin/bash--disable-topo关闭slurm tree拓扑路由计算,不再打印ROUTE日志、不走交换机分层调度。
方案3:临时最小资源测试(1核4G)
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=1--mem=4G --disable-topo--pty/bin/bash补充原因
曙光智算kshctest开启topology/tree树形网络调度,srun–pty需要双向6817/6818端口互通;部分机房安全策略拦截跨节点slurm通信端口,就卡在split_hostlist路由解析。优先用salloc+ssh是该集群标准交互手段。
需要我直接给拉满32C/128G的salloc命令吗?
–pty 这个参数一定要的吗
一句话结论
想要交互式敲bash,–pty必须加;只跑单次命令不用加。
1、加 --pty(你现在需求:交互式进节点shell)
srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=16G--pty/bin/bash- 作用:分配伪终端,把当前登录终端的输入/输出直通计算节点bash,能持续敲ls/cd/python,就是你要的交互式环境。
- 不加pty直接写/bin/bash:资源分到后bash瞬间退出,作业直接结束,秒掉线。
2、不加 --pty(只执行一条指令,跑完立刻释放资源)
# 只在节点跑一次hostname,输出后任务结束srun-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=16Ghostname# 只跑一次python脚本,跑完退出srun... python test.py无交互式终端,命令执行完作业直接销毁,没法持续操作节点。
3、规避你之前ROUTE卡死方案(不用srun --pty,首选salloc)
# 1.预占资源(留在login,不会卡死路由)salloc-pkshctest-quser_acz6ty4okx --cpus-per-task=4--mem=16G# 输出节点名 a13r3n02,手动ssh进去原生交互ssha13r3n02这套完全避开srun的pty路由转发问题,曙光集群最优交互方式。
内存固定规则再记:4核=16G、8核=32G、32核=128G(单核4G上限)
^C
[acz6ty4okx@a13r3n02 home]$ # 1.预占资源(留在login,不会卡死路由)
[acz6ty4okx@a13r3n02 home]$ salloc -p kshctest -q user_acz6ty4okx --cpus-per-task=4 --mem=16G
salloc: error: Job submit/allocate failed: Job submission failed because too much memory was requested relative to the number of CPUs requested. The requested memory:CPU should be kept no more than DefMemPerCPU
salloc: ======= Tips: reduce job’s request memory (–mem or --memory-per-cpu) =======
[acz6ty4okx@a13r3n02 home]$ # 输出节点名 a13r3n02,手动ssh进去原生交互
[acz6ty4okx@a13r3n02 home]$ ssh a13r3n02
Warning: Permanently added ‘a13r3n02,10.1.13.43’ (ECDSA) to the list of known hosts.
[acz6ty4okx@a13r3n02 ~]$ cd /public/
[acz6ty4okx@a13r3n02 public]$ cd /home
[acz6ty4okx@a13r3n02 home]$ ls
install.sh lizhen mount.sh sy umount.sh uninstall.sh
退出
1.预占资源(留在login,不会卡死路由)
salloc -p kshctest -q user_acz6ty4okx --cpus-per-task=4 --mem=16G
输出节点名 a13r3n02,手动ssh进去原生交互
ssh a13r3n02