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

为何benchmark_program无法并行运行?技术排查与疑问

问题描述

我正在编写一个Python程序,用于启动带不同参数的同一程序(示例中为benchmark_program)并分析结果。为提升效率,我通过multiprocessing.Pool调用多个子进程并行执行任务,但出现异常:即使增加并行子进程数(仍低于物理核心数且所有核心空闲),总测试时长始终不变,通过htop观察发现仅1个核心被占用(IO也未繁忙)。

起初我以为是Python的问题,于是编写了单核心密集计算程序compute_primes进行测试,并行化后性能确实提升。因此我推测benchmark_program本身或其依赖库存在仅能单CPU调用的限制,现疑问:哪些因素会导致程序无法并行运行?是否与共享库或依赖有关?

测试脚本如下:

from multiprocessing import Pool
import subprocess
import time


def invoke_subprocess(arg):
    #command = "benchmark_program {}".format(arg)
    #command = "compute_primes {}".format(arg)

    command = "sleep 0.5"

    return subprocess.run(command,
                          shell=True,
                          check=True,
                          stdout=subprocess.DEVNULL,
                          stderr=subprocess.STDOUT).returncode


if __name__ == '__main__':
    for num_core in [2, 4, 8, 16]:
        start = time.time()
        with Pool(num_core) as p:
            collected_result = p.map(invoke_subprocess, range(16))
        print("core-{} took {:.2f} second".format(num_core,
                                                  time.time() - start))

要运行原程序,需注释command = "sleep 0.5"并取消注释#command = "benchmark_program {}".format(arg)。


导致程序无法并行的常见因素

  • 全局互斥锁限制:如果benchmark_program或其依赖的共享库使用了全局锁(类似Python的GIL),所有进程会竞争同一把锁,同一时间仅一个进程能执行核心逻辑,直接阻塞多核心并行。这种情况常见于未做并行优化的C/C++共享库或单线程框架。
  • 独占式资源依赖:程序依赖的底层资源(如特定硬件设备、独占文件锁、单实例服务)要求串行访问,所有子进程必须排队等待资源释放,无法并行推进。比如部分硬件驱动仅允许单个进程操作,或程序内部用文件锁确保单实例执行核心逻辑。
  • 自身单线程设计+隐含阻塞:即使启动多进程,若benchmark_program本身是纯单线程实现,且进程间存在意外的同步阻塞(比如共享状态的串行更新要求),也会导致多进程无法同时利用核心。
  • 共享库线程安全缺陷:老旧共享库未做线程安全处理,多进程调用会触发未定义行为,程序为避免崩溃自动启用串行化机制,强制同一时间仅一个进程能调用库的核心函数。
  • CPU亲和性绑定:程序被设置了CPU亲和性,强制所有进程绑定到同一个核心运行,即使多进程启动,也无法利用其他空闲核心。可通过taskset命令检查或修改该设置。

共享库对并行的影响

共享库确实可能导致程序无法并行:

  • 若共享库使用未做线程安全保护的全局静态变量,多进程访问会引发竞争,程序可能通过加全局锁避免错误,从而串行化执行。
  • 部分共享库依赖的底层系统API是单实例设计,所有调用该库的进程必须排队等待。
  • 共享库的初始化逻辑含全局状态,可能导致多进程启动时互相阻塞,只能串行完成初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:53:24