【Coding】LSF作业系统bhist命令实战:从基础查询到高级日志分析

张开发
2026/5/25 10:54:56 15 分钟阅读
【Coding】LSF作业系统bhist命令实战:从基础查询到高级日志分析
1. LSF作业系统与bhist命令基础如果你在HPC高性能计算环境中工作过大概率会接触到LSFLoad Sharing Facility作业调度系统。作为IBM旗下的分布式资源管理工具LSF负责将计算任务合理分配到集群节点上执行。而bhist命令就像是个作业记录仪能帮你追踪所有提交过的作业状态。我第一次接触bhist是在排查一个异常终止的仿真任务时。当时用bjobs查不到已结束的作业信息前辈提醒我用bhist -l 作业ID才看到作业被系统强制终止的记录。这个经历让我意识到掌握历史查询工具的重要性。1.1 bhist核心功能解析bhist的默认输出包含几个关键字段JOBID作业的唯一标识符USER提交作业的用户名JOB_NAME作业名称通过bsub -J指定状态时间统计包括PEND排队、RUN运行、PSUSP挂起等状态持续时间TOTAL作业总耗时举个例子当我们执行bhist 12345可能看到如下输出Summary of time in seconds spent in various states: JOBID USER JOB_NAME PEND PSUSP RUN USUSP SSUSP UNKWN TOTAL 12345 user1 CFD_sim 120 0 3600 0 0 0 3720这表示作业12345排队等待了120秒实际运行了3600秒1小时总耗时3720秒。1.2 与bjobs的差异对比很多新手会混淆bhist和bjobs这两个命令的主要区别在于命令数据来源时间范围典型用途bjobs实时内存数据当前活动作业监控运行中/排队中的作业bhist磁盘日志文件历史记录可配置分析已完成/终止的作业特别要注意作业完成后约5分钟bjobs -l就无法查询详情了此时必须使用bhist。我在实际运维中就遇到过用户抱怨刚才还能看到的作业信息突然消失其实就是这个机制导致的。2. 基础查询操作实战2.1 单作业详细查询当需要查看某个作业的完整生命周期记录时-llong format参数是必备选项。例如bhist -l 67890典型输出包含Job 67890, User user2, Project default, Command mpirun ./cfd_solver Tue Jul 5 09:15:22: Submitted from host node01, to Queue normal Tue Jul 5 09:15:25: Dispatched to node05 Tue Jul 5 09:15:30: Starting (Pid 12345) Tue Jul 5 10:15:30: Done successfully. CPU time used is 3500 seconds. MEMORY USAGE: MAX MEM: 8.2 GB; AVG MEM: 7.5 GB这个输出比默认格式丰富得多包含提交时间戳和来源主机实际执行的节点信息进程IDPid内存使用峰值和平均值精确的CPU时间消耗2.2 多作业批量查询当需要分析一组作业时可以直接列出多个作业IDbhist 101 102 103 104或者使用通配符注意需要引号包裹bhist 10[1-4]对于数组作业Array Job可以这样查询特定索引bhist 123[4] # 查询数组作业123的第4个子任务 bhist 123[1-5] # 查询第1到第5个子任务3. 高级日志分析技巧3.1 跨日志文件检索LSF会定期轮转事件日志默认情况下bhist只查询当前的lsb.events文件。通过-n参数可以指定搜索的日志文件数量bhist -n 3 56789这个命令会依次搜索当前活跃日志$LSB_SHAREDIR/cluster_name/logdir/lsb.events第一次轮转备份lsb.events.1第二次轮转备份lsb.events.2我曾经用这个功能找回了一周前被系统自动清理的作业记录。当时用户坚持说作业已经完成但输出文件缺失。通过bhist -n 10最终在第七个日志文件中发现作业实际是被管理员手动终止的。3.2 时间范围筛选-T参数配合时间区间可以精准定位问题时段。时间格式为起始时间,结束时间bhist -T 2024/03/15/14:00,2024/03/15/15:30也可以使用相对时间表示法bhist -T .-2h,.-1h # 查询2小时前到1小时前的记录3.3 时间线模式分析当需要分析集群整体活动时-t参数会按时间顺序显示所有事件bhist -t -T 09:00,10:00输出示例Wed Mar 20 09:15:22: Job 101 submitted to Queue urgent Wed Mar 20 09:15:25: Job 102 dispatched to node03 Wed Mar 20 09:15:30: Job 101 starting on node01这种视图特别适合排查集群资源争用问题。有次我发现每天上午10点总有作业延迟通过时间线分析发现是某个定期任务占用了过多资源。4. 实战故障排查案例4.1 内存泄漏诊断结合-l输出的内存统计和作业命令可以识别潜在的内存问题bhist -l | grep -B5 MAX MEM: [0-9]\{4,\} MB这个命令会筛选出内存消耗超过1GB的作业。曾经有个Python科学计算作业显示MAX MEM达到128GB检查发现是用户忘记关闭matplotlib的图形对象导致内存累积。4.2 资源利用率分析通过解析RUN时间和TOTAL时间的比值可以计算资源利用率bhist -l | awk /TOTAL/ {util$7/$9; print $1, util}输出示例12345 0.95 12346 0.82比值越接近1说明作业获得资源后立即执行集群负载较轻比值偏低则可能存在资源碎片化问题。4.3 异常终止调查对于异常结束的作业-l会显示终止原因Job 78901, User user3, Command ./simulation ... Wed Jul 10 16:30:15: Exited with exit code 137. Killed by the system: Memory limit exceeded.常见退出码137内存超限OOM Killer触发139段错误Segmentation Fault255LSF内部错误5. 性能优化与最佳实践5.1 环境变量调优通过设置LSB_BHIST_HOURS可以调整默认查询时间范围单位小时export LSB_BHIST_HOURS168 # 查询范围扩大到1周5.2 脚本自动化示例这个bash脚本可以自动分析用户过去24小时的作业#!/bin/bash user$(whoami) end$(date %Y/%m/%d/%H:%M) start$(date -d 24 hours ago %Y/%m/%d/%H:%M) bhist -u $user -T $start,$end -l | \ awk BEGIN { print JOBID\tRUNTIME\tMEM(MB)\tSTATE } /RUN|PEND|DONE/ { runtime$7; state$10 } /MAX MEM/ { split($0,a,:); mema[2]; print $1\truntime\tmem\tstate } 5.3 日志维护建议在大型集群中lsb.events可能增长过快。建议通过LSF_LOGDIR参数将日志存放到高性能存储并设置合理的日志轮转策略。例如在lsb.params中添加EVENT_LOG_MAX_SIZE 100M # 单个日志最大100MB NUM_EVENT_LOGS 10 # 保留10个历史日志掌握bhist的高级用法后你会发现它不仅是简单的查询工具更是性能分析和故障排查的瑞士军刀。记得定期清理历史日志避免磁盘空间被占满导致新作业无法提交——这是我在生产环境用惨痛教训换来的经验。

更多文章