831. HPC集群调度系统对比:SLURM vs PBS¶
一句话概述:SLURM是当前HPC界的"王者"(开源、社区大、学术界标配),PBS Pro是"老牌贵族"(商业版、政府/企业用)。生信面试必考SLURM。
核心知识点速查表¶
| 维度 | SLURM | PBS Pro |
|---|---|---|
| 全称 | Simple Linux Utility for Resource Management | Portable Batch System |
| 许可证 | 开源(GPL) | 商业(Altair) |
| 市场地位 | 研究/学术界主导 | 企业/政府领域 |
| 指令前缀 | #SBATCH | #PBS |
| 提交命令 | sbatch | qsub |
| 查看队列 | squeue | qstat |
| 取消作业 | scancel | qdel |
| 资源请求 | 按核心数分配 | 按节点+核心数分配 |
| 工作目录 | 自动在提交目录 | 需cd $PBS_O_WORKDIR |
| 环境变量 | 自动导出 | 需-V参数导出 |
| 扩展性 | 小集群到百万核心 | 企业级稳定 |
一、为什么要学集群调度?(白话版)¶
你的笔记本电脑跑一个30X全基因组比对要3天。但实验室有一台超算,有100个节点、每个节点64核CPU。
作业调度系统 = 超算的"排队系统"。你把任务提交进去,系统自动分配空闲的CPU/内存给你,跑完通知你。就像医院挂号排队,护士(调度系统)按照优先级叫号。
二、SLURM完整使用指南¶
2.1 基础提交脚本¶
#!/bin/bash
#SBATCH --job-name=bwa_align # 作业名称(显示在队列中)
#SBATCH --partition=normal # 分区/队列名称
#SBATCH --nodes=1 # 申请1个计算节点
#SBATCH --ntasks=1 # 1个任务
#SBATCH --cpus-per-task=16 # 每个任务16个CPU核心
#SBATCH --mem=64G # 申请64GB内存
#SBATCH --time=08:00:00 # 最大运行时间8小时
#SBATCH --output=logs/%x_%j.out # 标准输出文件(%x=作业名,%j=作业ID)
#SBATCH --error=logs/%x_%j.err # 标准错误文件
#SBATCH --mail-type=END,FAIL # 作业结束或失败时发邮件
#SBATCH --mail-user=your@email.com # 邮箱地址
# 加载软件模块
module load bwa/0.7.17 # 加载BWA
module load samtools/1.17 # 加载samtools
# 打印作业信息(方便调试)
echo "作业ID: $SLURM_JOB_ID" # 打印作业ID
echo "节点: $SLURM_NODELIST" # 打印分配的节点
echo "CPU数: $SLURM_CPUS_PER_TASK" # 打印CPU数
echo "开始时间: $(date)" # 打印开始时间
# 运行分析
bwa mem -t $SLURM_CPUS_PER_TASK \ # 使用分配的CPU数
ref/genome.fa \ # 参考基因组
data/sample_R1.fq.gz \ # 正向reads
data/sample_R2.fq.gz | # 反向reads
samtools sort -@ 4 \ # 排序(4线程)
-o results/sample.sorted.bam # 输出排序BAM
echo "结束时间: $(date)" # 打印结束时间
2.2 SLURM常用命令¶
# 提交作业
sbatch run_analysis.sh # 提交批处理作业
sbatch --array=1-10 array_job.sh # 提交数组作业(10个子任务)
# 查看作业状态
squeue -u $USER # 查看自己的作业
squeue -p normal # 查看normal分区的作业
squeue --format="%.8i %.20j %.8T %.10M %.6D %R" # 自定义格式
# 取消作业
scancel 12345 # 取消指定作业
scancel -u $USER # 取消自己所有作业
scancel --name=bwa_align # 按名称取消
# 查看集群资源
sinfo # 查看分区和节点状态
sinfo -p normal -o "%n %C %m %G" # 查看normal分区详情
# 查看作业详情
scontrol show job 12345 # 查看作业详细信息
sacct -j 12345 --format=JobID,Elapsed,MaxRSS # 查看已完成作业的资源使用
# 交互式作业
srun --pty --cpus-per-task=4 \ # 申请4核
--mem=16G --time=02:00:00 bash # 16GB内存,2小时
2.3 SLURM数组作业(批量样本)¶
#!/bin/bash
#SBATCH --job-name=batch_qc # 批量质控
#SBATCH --array=1-20 # 20个样本
#SBATCH --cpus-per-task=4 # 每个4核
#SBATCH --mem=8G # 每个8GB内存
# 从样本列表获取当前样本名
SAMPLE=$(sed -n "${SLURM_ARRAY_TASK_ID}p" samples.txt) # 按行号取样本名
echo "处理样本: ${SAMPLE}" # 打印当前样本
# 运行FastQC
fastqc -t $SLURM_CPUS_PER_TASK \ # 使用分配的线程
data/${SAMPLE}_R1.fq.gz \ # 正向reads
data/${SAMPLE}_R2.fq.gz \ # 反向reads
-o results/qc/ # 输出目录
三、PBS基础用法¶
#!/bin/bash
#PBS -N bwa_align # 作业名称
#PBS -q normal # 队列名称
#PBS -l nodes=1:ppn=16 # 1节点16核(PBS格式)
#PBS -l mem=64gb # 64GB内存
#PBS -l walltime=08:00:00 # 最大运行时间
#PBS -o logs/bwa_align.out # 标准输出
#PBS -e logs/bwa_align.err # 标准错误
#PBS -V # 导出环境变量(SLURM自动做)
#PBS -M your@email.com # 邮箱
#PBS -m ae # 结束和出错时发邮件
# PBS需要手动切换到提交目录!
cd $PBS_O_WORKDIR # 切回提交作业时的目录
# 运行分析
bwa mem -t 16 ref/genome.fa \
data/sample_R1.fq.gz \
data/sample_R2.fq.gz | \
samtools sort -@ 4 \
-o results/sample.sorted.bam
四、SLURM vs PBS命令对照表¶
| 功能 | SLURM | PBS |
|---|---|---|
| 提交作业 | sbatch script.sh | qsub script.sh |
| 交互式 | srun --pty bash | qsub -I |
| 查看队列 | squeue | qstat |
| 取消作业 | scancel jobid | qdel jobid |
| 查看节点 | sinfo | pbsnodes |
| 作业详情 | scontrol show job | qstat -f jobid |
| 资源请求 | --cpus-per-task=N | -l nodes=1:ppn=N |
| 内存请求 | --mem=64G | -l mem=64gb |
| 时间限制 | --time=HH:MM:SS | -l walltime=HH:MM:SS |
| 作业名 | --job-name=name | -N name |
| 输出文件 | --output=file | -o file |
| 邮件通知 | --mail-type=END | -m e |
五、面试高频问题¶
Q: 你在超算上跑过什么分析?怎么提交的? A: 用SLURM提交宏基因组分析作业。写sbatch脚本申请资源(CPU、内存、时间),数组作业批量处理多个样本。
Q: 如果作业运行失败了怎么排查? A: 先看SLURM输出的.err文件,再用
sacct -j jobid查看资源使用(是否OOM内存溢出),最后scontrol show job看退出状态。Q: 怎么估算申请多少资源? A: 先用小数据测试,用
sacct记录实际CPU和内存用量,再按比例放大并留20%余量。
常见报错与解决¶
| 报错 | 原因 | 解决 |
|---|---|---|
slurmstepd: error: Exceeded job memory limit | 内存不足 | 增加--mem参数 |
TIMEOUT | 超过时间限制 | 增加--time |
Invalid partition | 分区名错误 | sinfo查看可用分区 |
Batch job submission failed: Node count specification invalid | 资源请求格式错误 | 检查#SBATCH参数格式 |
| 输出文件为空 | 程序在作业开始前就失败 | 检查模块是否加载、路径是否正确 |
速查表¶
# SLURM 速查
sbatch script.sh # 提交作业
squeue -u $USER # 查看我的作业
scancel JOBID # 取消作业
sinfo # 查看集群状态
sacct -j JOBID # 查看作业资源使用
srun --pty bash # 交互式作业
# SLURM 变量
$SLURM_JOB_ID # 作业ID
$SLURM_CPUS_PER_TASK # 分配的CPU数
$SLURM_NODELIST # 分配的节点
$SLURM_ARRAY_TASK_ID # 数组作业当前索引
$SLURM_SUBMIT_DIR # 提交目录
# 资源估算公式
CPU: 比对工具一般 8-16 核够用
内存: 人类WGS约需 32-64GB
时间: 30X WGS比对约 4-8 小时(16核)