使用GetBaseCountsMultiSample时反复触发OOM Kill问题求助
GetBaseCountsMultiSample加载第二个BAM触发OOM Kill的问题排查与解决建议
问题描述
运行GetBaseCountsMultiSample工具计算肿瘤和正常BAM文件中VCF所有位点的碱基计数时,加载第二个BAM文件后进程被系统终止,终端显示Killed,内核日志确认是OOM(内存不足)Kill。加载第二个BAM后内存从20GB飙升至73GB,3分钟后被终止,CPU占用约25%。相同文件在朋友的Linux系统可正常运行。
环境与运行信息
环境配置
- Windows10 WSL2 Ubuntu22.04(分配80GB内存),同时测试过原生Ubuntu22.04、WSL1 Ubuntu18.04、另一台64GB内存的WSL2机器
- 工具版本:GetBaseCountsMultiSample-1.2.3,也试过最新版本
运行命令
cd ~/Output_Strelka ~/packages/GetBaseCountsMultiSample-1.2.3/GetBaseCountsMultiSample \ --fasta ~/Output_Strelka/MoCaSeq_ref/GRCh38.p12.reduced.fa --maq 1 \ --bam Tumor:M15/results/bam/M15RNA.Tumor.bam \ --bam Normal:M15/results/bam/M15.Normal.bam \ --vcf M15/results/rescued/M15.StrelkaRNA.vcf \ --output M15/results/rescued/M15.StrelkaRNA.M15.StrelkaRNA.vcf \ --thread 1
终端输出
[INFO] Loading reference sequence: /home/chiv/Output_Strelka/MoCaSeq_ref/GRCh38.p12.reduced.fa [INFO] Finished loading reference sequence [INFO] Loading variants file: M15/results/rescued/M15.StrelkaRNA.vcf [INFO] 347217 variants has been loaded from file: M15/results/rescued/M15.StrelkaRNA.vcf [INFO] Sorting variants [INFO] Indexing variants [INFO] Processing bam file: M15/results/bam/M15.Normal.bam [INFO] Processing bam file: M15/results/bam/M15RNA.Tumor.bam Killed
已尝试的无效方案
- 使用朋友提供的Docker容器运行工具
- 更换Ubuntu版本(18.04)、WSL版本(WSL1)及不同g++编译器重新编译工具
- 调整工具参数:
--max_block_size和--max_block_dist - 禁用OOM Kill并设置
sudo sysctl vm.overcommit_memory=2,触发std::bad_alloc错误 - 调整WSL/系统的内存分配配置
- 使用工具最新版本
临时可行方案
- 将BAM文件截取前1000行后可正常运行
- 拆分BAM到小染色体(如230MB的Chr1)可正常运行,但408MB的Chr2及拆分后的部分小文件仍触发OOM
解决建议
- 验证BAM文件完整性与索引:用
samtools quickcheck M15/results/bam/M15RNA.Tumor.bam M15/results/bam/M15.Normal.bam检查文件是否损坏,确保每个BAM都有对应的.bai索引文件,若索引缺失用samtools index重新生成 - 拆分VCF与BAM分段处理:将VCF按染色体拆分(如
bcftools view -r chr1 M15/results/rescued/M15.StrelkaRNA.vcf -o M15/results/rescued/M15.StrelkaRNA.chr1.vcf),同时用samtools view -b -r chr1拆分对应BAM,逐个染色体运行工具,最后合并结果 - 精细化调整工具内存参数:尝试设置更小的
--max_block_size(比如默认值的1/4),同时配合--region参数指定单条染色体运行,排查是否是特定区域的高深度/复杂变异导致内存暴涨 - 排查内存泄漏:用
valgrind --leak-check=full ~/packages/GetBaseCountsMultiSample-1.2.3/GetBaseCountsMultiSample [参数]运行工具,检测是否存在内存泄漏,若有可向工具开发者提交issue - 替代工具方案:换用
bcftools mpileup结合脚本统计碱基计数(示例:bcftools mpileup -f ~/Output_Strelka/MoCaSeq_ref/GRCh38.p12.reduced.fa -R M15/results/rescued/M15.StrelkaRNA.vcf M15/results/bam/M15RNA.Tumor.bam M15/results/bam/M15.Normal.bam | bcftools query -f '%CHROM\t%POS\t%REF\t%ALT[%TGT]\n'),或用GATK的DepthOfCoverage工具满足碱基计数需求 - 系统内存优化:在原生Linux系统中关闭所有后台内存密集型程序;WSL2中修改
C:\Users\<你的用户名>\.wslconfig文件,设置memory=64GB限制WSL内存分配,同时关闭Windows侧的浏览器、虚拟机等占用大量内存的程序
内容的提问来源于stack exchange,提问作者Chiv
相关产品推荐
相关产品推荐

