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

Python并行读取大量文件性能不佳问题排查求助

问题分析与优化方向

1. 线程锁等待的根源

你用Joblib多进程(默认loky后端是独立进程)但出现_thread.lock等待,核心原因是MDAnalysis库内部依赖线程实现部分功能:

  • .trr格式的解压缩、分块读取逻辑,可能用了线程池来并行处理I/O或计算;
  • 库内部的全局资源(比如文件缓存、共享配置)通过线程锁做同步,哪怕你的脚本是多进程模式,每个进程内部的线程仍会因锁竞争产生等待。
    这些锁是库内部的线程级锁,并非进程间锁,所以会出现在cProfile的耗时统计中。

2. D状态进程与I/O瓶颈的实锤

进程处于D状态(不可中断睡眠),几乎可以确定是磁盘I/O能力不足导致:

  • 你的存储系统无法支撑64个进程同时读取1GB文件的并发请求,大部分进程卡在磁盘读写队列中,CPU自然处于空闲状态;
  • 验证方法:
    • 用iostat -x 1查看磁盘利用率(%util)、读写队列长度(aqu-sz):若%util接近100%,aqu-sz持续高于磁盘队列深度,说明磁盘是瓶颈;
    • 对比单进程读取速度:如果单进程读速为X MB/s,64进程需要64*X的总带宽,若存储系统达不到这个量级,必然出现阻塞。

3. 可行的优化方案

  • 降低并行度:将Joblib的n_jobs从64下调至磁盘能承载的并发数(比如10-15,对应你当前实际跑起来的数量),避免磁盘过载导致的进程阻塞,反而能提升整体处理效率;
  • 调整MDAnalysis读取参数:检查.trr reader的配置,尝试关闭库内部的线程池(若有相关选项),强制用单线程读取,减少内部锁竞争;
  • 存储层面优化:如果条件允许,将数据迁移至更快的存储介质(比如NVMe SSD阵列、并行文件系统),提升并发I/O能力;
  • 缓存策略优化:利用节点250GB内存,尝试批量预读部分文件至内存缓存(比如用mmap方式读取),减少重复磁盘访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:52:14