CentOS 9 Stream下SLURM集群搭建避坑实录:从端口冲突到用户权限,我的踩坑与填坑指南
CentOS 9 Stream下SLURM集群搭建避坑实录从端口冲突到用户权限我的踩坑与填坑指南高性能计算HPC集群的搭建从来不是一件简单的事情尤其是当你第一次接触SLURM这样的资源管理系统时。作为一个曾经在多个科研项目中部署过SLURM集群的工程师我深知新手在这个过程中会遇到多少坑。本文将分享我在CentOS 9 Stream环境下搭建SLURM集群时遇到的实际问题及其解决方案希望能帮助后来者少走弯路。1. 环境准备那些容易被忽视的细节在开始安装SLURM之前环境准备阶段就有许多需要注意的地方。很多教程会告诉你安装这些包、配置那个文件但很少解释为什么要这么做以及如果跳过某些步骤会有什么后果。1.1 系统一致性检查首先确保所有节点使用完全相同的操作系统版本。我曾经遇到过因为一个节点使用了CentOS 9 Stream的早期版本而其他节点使用了更新版本导致各种奇怪的依赖问题。检查方法很简单cat /etc/redhat-release所有节点应该显示完全相同的版本信息。如果不一致建议先进行系统升级dnf update -y reboot1.2 用户和组ID的统一SLURM集群中munge和slurm用户的UID和GID必须在所有节点上保持一致。这是一个容易被忽视但会导致严重问题的细节。以下是检查和设置的命令# 检查当前用户ID id munge id slurm # 在所有节点上统一设置示例值可根据需要修改 sudo usermod -u 1899 munge sudo groupmod -g 1899 munge sudo usermod -g 1899 munge sudo usermod -u 1898 slurm sudo groupmod -g 1898 slurm sudo usermod -g 1898 slurm注意修改用户ID后必须同时修改相关文件和目录的所有权否则服务将无法启动。1.3 时间同步的重要性集群节点间的时间差超过一定阈值会导致各种通信问题。我强烈推荐使用chrony进行时间同步配置主节点为时间服务器# 在主节点上 sudo dnf install chrony -y sudo systemctl enable --now chronyd # 在其他节点上配置同步主节点时间 sudo dnf install chrony -y echo server 主节点IP iburst | sudo tee -a /etc/chrony.conf sudo systemctl restart chronyd验证时间同步状态chronyc sources -v2. 服务安装与配置避开那些坑安装SLURM服务看似简单但实际上有很多细节需要注意否则可能会遇到各种莫名其妙的问题。2.1 软件源与版本一致性CentOS 9 Stream默认仓库中不包含SLURM软件包需要添加EPEL源sudo dnf install epel-release -y安装SLURM组件时必须确保所有节点安装完全相同的版本sudo dnf install slurm slurm-slurmctld slurm-slurmd slurm-slurmdbd munge -y安装后验证版本一致性rpm -q slurm2.2 munge.key的同步问题munge是SLURM用于节点间认证的服务其关键在于所有节点必须使用相同的munge.key。常见错误包括未在所有节点间同步munge.key文件权限设置不正确服务启动顺序错误正确的做法是在主节点生成munge.key然后复制到其他节点# 在主节点生成key sudo /usr/sbin/create-munge-key -r # 复制到其他节点 sudo scp /etc/munge/munge.key root其他节点IP:/etc/munge/在所有节点上设置正确的权限sudo chown -R munge:munge /etc/munge /var/lib/munge /var/log/munge /var/run/munge sudo chmod 0700 /etc/munge sudo chmod 0711 /var/lib/munge sudo chmod 0700 /var/log/munge sudo chmod 0755 /var/run/munge启动顺序很重要先启动munge服务再启动SLURM服务sudo systemctl enable --now munge sudo systemctl status munge # 验证状态2.3 端口冲突排查SLURM默认使用6817-6819端口这些端口可能与其他服务如Ceph冲突。检查端口占用情况ss -tulnp | grep -E 6817|6818|6819如果发现冲突有两种解决方案修改冲突服务的端口修改SLURM的默认端口在slurm.conf中配置我建议修改SLURM端口因为通常比修改其他服务更容易。在slurm.conf中添加SlurmctldPort26817 SlurmdPort26818 AccountingStoragePort268193. 配置文件详解那些容易出错的关键参数SLURM的配置文件是集群正常运行的核心但其中的参数众多新手很容易配置错误。3.1 slurm.conf关键配置以下是一些容易出错但至关重要的配置项# 集群名称所有节点必须相同 ClusterNamemy_cluster # 控制节点设置主备模式 SlurmctldHost主控节点主机名(IP) SlurmctldHost备控节点主机名(IP) # 认证设置 AuthTypeauth/munge AuthInfo/var/run/munge/munge.socket.2 # 节点定义根据实际硬件配置 NodeNamenode[1-4] NodeAddr192.168.1.[101-104] CPUs32 RealMemory128000 StateUNKNOWN # 分区设置 PartitionNamedebug Nodesnode[1-4] DefaultYES MaxTime24:00:00 StateUP提示RealMemory的值应该略小于实际物理内存保留部分内存给系统使用。3.2 slurmdbd.conf配置要点如果使用数据库存储作业信息slurmdbd.conf的配置尤为关键# 数据库连接配置 StorageTypeaccounting_storage/mysql StorageHost数据库服务器IP StoragePort3306 StorageUserslurm StoragePass密码 StorageLocslurm_acct_db # 服务标识 DbdHost主dbd节点主机名 DbdPort26819 DbdBackupHost备dbd节点主机名常见错误包括数据库用户权限不足防火墙阻止了数据库连接密码包含特殊字符导致解析问题3.3 配置文件同步所有节点的配置文件必须完全一致。我推荐使用rsync进行同步rsync -avz /etc/slurm/ 其他节点IP:/etc/slurm/同步后可以使用以下命令检查配置文件的差异# 在主节点上 for node in node1 node2 node3 node4; do echo Checking $node... ssh $node diff -u /etc/slurm/slurm.conf /tmp/slurm.conf done4. 服务启动与验证最后的检查清单配置完成后服务的启动顺序和验证步骤同样重要错误的启动顺序可能导致集群状态异常。4.1 服务启动顺序正确的启动顺序应该是所有节点的munge服务slurmdbd服务如果使用控制节点的slurmctld服务计算节点的slurmd服务具体命令# 在所有节点启动munge sudo systemctl enable --now munge # 在dbd节点启动slurmdbd sudo systemctl enable --now slurmdbd # 在控制节点启动slurmctld sudo systemctl enable --now slurmctld # 在计算节点启动slurmd sudo systemctl enable --now slurmd4.2 集群状态验证使用以下命令验证集群状态# 查看节点状态 sinfo -N -l # 查看分区状态 sinfo -s # 查看控制节点状态 scontrol show slurmctld # 测试作业提交 srun -N1 hostname4.3 常见问题排查如果遇到问题可以查看日志获取详细信息# 控制节点日志 journalctl -u slurmctld -f # 计算节点日志 journalctl -u slurmd -f # 数据库节点日志 journalctl -u slurmdbd -f对于复杂问题可以启用调试模式# 停止服务后以调试模式运行 sudo systemctl stop slurmd slurmd -vvvvDDDD5. 实用技巧与高级配置在基本集群运行起来后以下技巧可以帮助你更好地管理和优化SLURM集群。5.1 资源预留有时需要为特定任务预留资源可以使用scontrol命令# 创建预留 scontrol create reservation starttime2024-01-01T00:00:00 duration120 userusername nodesnode1 # 查看预留 scontrol show reservations # 删除预留 scontrol delete reservation res_name5.2 作业数组对于需要运行大量相似任务的情况作业数组非常有用#!/bin/bash #SBATCH --array1-100 #SBATCH -J array_job #SBATCH -o output_%a.log echo This is task $SLURM_ARRAY_TASK_ID5.3 GPU资源管理如果集群中有GPU节点需要在slurm.conf中配置Gres# 节点定义中添加 NodeNamegpu-node Gresgpu:2 # 提交GPU作业 sbatch --gresgpu:1 my_script.sh5.4 动态节点配置对于云环境或经常变化的集群可以考虑动态节点配置SlurmctldParametersenable_configless这样计算节点无需完整的slurm.conf文件可以从控制节点获取配置。6. 性能优化与监控一个健康的SLURM集群需要持续的监控和适时的优化。6.1 资源使用监控可以使用sacct命令查看历史作业的资源使用情况sacct --formatJobID,JobName,Partition,AllocCPUS,AllocNodes,ReqMem,MaxRSS,Elapsed,State -S 2024-01-016.2 数据库维护定期清理旧的作业记录可以防止数据库膨胀# 设置自动清理在slurmdbd.conf中 PurgeJobAfter30days PurgeStepAfter15days6.3 负载均衡通过设置节点权重可以实现简单的负载均衡# 在slurm.conf中 NodeNamenode1 Weight10 NodeNamenode2 Weight5权重值越高该节点被选中的概率越低。6.4 故障转移测试定期测试控制节点的故障转移功能# 在主控制节点上 sudo systemctl stop slurmctld # 观察备份控制节点是否自动接管 sinfo7. 安全加固建议SLURM集群作为关键基础设施安全性不容忽视。7.1 认证加固除了munge外可以考虑启用SSL加密# 在slurm.conf中 AuthAltTypesauth/jwt AuthAltParametersjwt_key/etc/slurm/jwt.key7.2 网络隔离将管理网络与计算网络分离限制访问# 使用firewalld限制访问 sudo firewall-cmd --permanent --zonetrusted --add-source集群IP段 sudo firewall-cmd --reload7.3 定期备份定期备份关键数据和配置# 备份数据库 mysqldump -u slurm -p slurm_acct_db slurm_backup_$(date %F).sql # 备份配置 tar czf /backup/slurm_conf_$(date %F).tar.gz /etc/slurm/7.4 审计日志启用详细的审计日志# 在slurm.conf中 AccountingStorageEnforceall8. 常见问题快速参考在实际运维中以下问题最为常见问题现象可能原因解决方案slurmd启动失败munge.key不同步或权限错误检查munge.key一致性及权限节点状态为down网络问题或时间不同步检查网络连接和时间同步作业排队不运行资源不足或配置错误检查资源请求和分区配置数据库连接失败防火墙或权限问题检查数据库连接和用户权限作业意外终止内存不足或超时检查内存请求和作业时限对于更复杂的问题SLURM提供了详细的调试选项# 控制节点调试 slurmctld -vvvvDDD # 计算节点调试 slurmd -vvvvDDD # 数据库调试 slurmdbd -vvvvDDD记住大多数问题都能从日志中找到线索。养成检查日志的习惯可以节省大量故障排除时间。