分布式算力集群故障节点自动剔除机制
分布式算力集群里,节点掉线、GPU 卡死或网络抖动都会拖慢整体任务。故障节点自动剔除机制的核心,就是让集群定期探测每个节点状态,一旦确认异常就自动把它从调度列表里摘掉,避免任务继续派发。
下面按零基础可执行的方式,讲清准备、配置、避坑和验证。
先确认你的集群用什么调度和探测方式
不同集群的剔除入口不一样,动手前先确认三点:
- 调度器是 Slurm、Kubernetes 还是自研调度,决定节点状态写在哪。
- 健康检查走 SSH、HTTP 接口还是心跳上报,决定脚本怎么写。
- 节点异常后是临时摘除还是彻底下线,决定要不要保留恢复逻辑。
本文以最常见的 Linux + Slurm 环境举例,思路同样适用于其他调度器。
环境与前置准备
准备一台管理节点,能免密登录所有算力节点。
检查 SSH 连通性:
for ip in 10.0.0.11 10.0.0.12 10.0.0.13; do
ssh -o ConnectTimeout=3 root@$ip "nvidia-smi -L" && echo "$ip OK" || echo "$ip FAIL"
done
确认 sinfo 和 scontrol 命令可用,这是后续摘除节点的关键工具:
sinfo -N -o "%N %T %C"
如果管理节点没装 Slurm 客户端,先安装 slurm-client 或对应软件包,否则无法执行剔除命令。
写一个可落地的健康检查脚本
在管理节点创建 /opt/health_check/check_nodes.sh,思路是:探测失败连续达到阈值才剔除,避免网络抖动误伤。
#!/bin/bash
NODES="node01 node02 node03"
THRESHOLD=3
LOG=/var/log/node_health.log
for node in $NODES; do
fail=0
for i in 1 2 3; do
timeout 5 ssh -o ConnectTimeout=3 $node "nvidia-smi" >/dev/null 2>&1 || fail=$((fail+1))
sleep 2
done
if [ $fail -ge $THRESHOLD ]; then
scontrol update NodeName=$node State=DRAIN Reason="health_check_fail"
echo "$(date) $node DRAIN" >> $LOG
else
scontrol update NodeName=$node State=RESUME 2>/dev/null
echo "$(date) $node OK" >> $LOG
fi
done
赋予执行权限:
chmod +x /opt/health_check/check_nodes.sh
关键点: DRAIN 表示不再向该节点派发新任务,但保留正在运行的任务;RESUME 用于节点恢复后重新纳入调度。
用定时任务驱动自动剔除
编辑 crontab,让脚本每分钟执行一次:
crontab -e
加入:
* * * * * /opt/health_check/check_nodes.sh
保存后确认任务已生效:
crontab -l | grep check_nodes
这样故障节点被发现后,会在一个检查周期内自动进入 DRAIN 状态,达到自动剔除的效果。
避坑与注意事项
- 阈值不要设太低。 单次探测失败就剔除,容易因瞬时网络抖动误伤正常节点,建议连续 3 次失败再处理。
- 区分 DRAIN 和 DOWN。
DOWN会直接导致节点上任务失败,除非节点彻底离线,否则优先用DRAIN。 - 脚本要防止并发。 如果检查耗时超过一分钟,可能出现多个脚本同时运行,可在脚本开头加锁:
[ -f /tmp/check_nodes.lock ] && exit 0
touch /tmp/check_nodes.lock
trap "rm -f /tmp/check_nodes.lock" EXIT
- 恢复逻辑要谨慎。 节点恢复后自动
RESUME前,最好再确认一次 GPU 和网络正常,避免反复上下线。 - 日志要保留。 出问题时靠
/var/log/node_health.log回溯哪次检查误判或漏判。
验证剔除是否真的生效
手动模拟一个节点故障,比如在 node01 上停掉相关服务或断网,然后等待一个检查周期,执行:
sinfo -N -o "%N %T %E"
预期看到 node01 状态变为 drain,Reason 显示 health_check_fail。
恢复节点后再次查看,状态应回到 idle 或 mixed。
再提交一个测试任务,确认它不会被派发到已 DRAIN 的节点:
srun -N1 hostname
如果任务只落在健康节点上,说明自动剔除链路已经跑通。
几个常见疑问
每个检查周期多久合适? 算力集群任务通常较长,一分钟一次比较平衡;
节点多时可适当放宽到两分钟,减少管理节点压力。
脚本探测方式只能用 SSH 吗? 不一定。
如果你的节点暴露了 HTTP 健康接口,用 curl 探测更轻量,替换脚本里的 SSH 命令即可。
节点恢复后能自动重新加入吗? 可以,但建议先人工确认硬件正常,再让脚本执行 RESUME,避免故障节点反复被纳入调度。
把健康检查、连续失败阈值和 DRAIN 摘除这三步组合起来,分布式算力集群的故障节点自动剔除机制就能稳定运行。
建议先在测试节点上验证一轮,再推广到整个集群。