跳转至

831. HPC集群调度系统对比:SLURM vs PBS

一句话概述:SLURM是当前HPC界的"王者"(开源、社区大、学术界标配),PBS Pro是"老牌贵族"(商业版、政府/企业用)。生信面试必考SLURM。

核心知识点速查表

维度SLURMPBS Pro
全称Simple Linux Utility for Resource ManagementPortable Batch System
许可证开源(GPL)商业(Altair)
市场地位研究/学术界主导企业/政府领域
指令前缀#SBATCH#PBS
提交命令sbatchqsub
查看队列squeueqstat
取消作业scancelqdel
资源请求按核心数分配按节点+核心数分配
工作目录自动在提交目录需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命令对照表

功能SLURMPBS
提交作业sbatch script.shqsub script.sh
交互式srun --pty bashqsub -I
查看队列squeueqstat
取消作业scancel jobidqdel jobid
查看节点sinfopbsnodes
作业详情scontrol show jobqstat -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

五、面试高频问题

  1. Q: 你在超算上跑过什么分析?怎么提交的? A: 用SLURM提交宏基因组分析作业。写sbatch脚本申请资源(CPU、内存、时间),数组作业批量处理多个样本。

  2. Q: 如果作业运行失败了怎么排查? A: 先看SLURM输出的.err文件,再用sacct -j jobid查看资源使用(是否OOM内存溢出),最后scontrol show job看退出状态。

  3. 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核)