先看现象。用 ThreadPoolExecutor() 默认参数跑两百个模型调用,八核机器上同时工作的线程一直不超过三十二个,总耗时 240 秒,压测报告里吞吐上不去。
原因不止一个,得分开看。默认 max_workers 按 CPU 核数推算 不按任务数。也可能是任务里有长阻塞 IO 线程一直占位。
少数情况下是任务队列无上限 提交后全堆在内存。
不容易想到的是,没有监控线程池的活跃度。
第一件事是确认默认值是多少
python -c "import os;print(min(32,(os.cpu_count() or 1)+4))"
显式设置线程数并压测对比
python bench_pool.py --workers 64 --tasks 200
IO 密集与 CPU 密集分开建池
python pool_split.py --io 64 --cpu 8
末了把活跃线程数打成指标
python metric.py --name pool_active --interval 10
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
白天有业务在跑,能验证的部分都压到了晚上做。
恢复的判定其实很直接。两百个任务总耗时降到 70 秒以内,活跃线程数与设置一致,队列积压可见。
容易忽略的是,默认值是按 CPU 核数推出来的,IO 密集场景必须自己显式设。这类问题最好一次改到位,反复小改反而容易把原因搅混。
