You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slurm作业OOM失败时,如何完整保存所有系统输出至output.log?

解决Slurm作业OOM时日志不完整的问题

这是因为进程默认采用缓冲式输出,当OOM导致进程被内核强制终止时,缓冲区中未刷新的内容会丢失,无法写入日志文件。以下是几种可行的解决方法:

方法1:禁用任务的输出缓冲

根据任务类型调整启动命令,强制输出实时写入:

  • Python脚本:添加-u参数禁用缓冲
    python -u your_script.py
    
  • 其他程序:用stdbuf工具设置行缓冲
    stdbuf -oL -eL your_command
    
    -oL和-eL分别让标准输出、标准错误按行实时写入,避免内容积压在缓冲区。

方法2:手动接管日志输出并实时同步

移除Slurm的--output和--error参数,在脚本开头通过tee工具实时同步输出:

#!/bin/bash -l
# 实时同步输出到日志文件
exec > >(tee -a output.log) 2> >(tee -a error.log >&1)

#SBATCH --account=qmech
#SBATCH --job-name=job
#SBATCH --exclusive
#SBATCH -C mem768
#SBATCH --mem=750gb
#SBATCH -c 32 # CPU per task
#SBATCH --time=01:00:00

# 后续执行你的任务命令
your_command

tee会将输出同时写入日志文件和Slurm捕获的终端流,确保内容实时落地,不会因进程意外终止丢失。

方法3:利用Slurm信号提前触发缓冲刷新(进阶)

如果你的任务支持信号处理,可配置Slurm在OOM前发送信号,让进程主动刷新缓冲:

  1. 在SBATCH参数中添加信号配置:
    #SBATCH --signal=SIGUSR1@30
    
    表示在作业因内存不足被终止前30秒,向主进程发送SIGUSR1信号。
  2. 在脚本中添加信号捕获逻辑:
    trap 'echo "[WARN] Pre-OOM signal received, flushing buffers..." && sync' SIGUSR1
    
    此方法需要任务能响应信号,适合自定义程度较高的作业。

额外提示:定位OOM节点

即使日志不全,也可以通过sacct命令查看作业的节点和内存使用信息:

sacct -j <你的作业ID> --format=JobID,NodeList,State,ExitCode,MaxRSS

NodeList字段会显示作业运行的节点,MaxRSS可查看各节点的内存使用峰值,快速定位OOM发生的节点。

内容的提问来源于stack exchange,提问作者ferris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:25:30