Python多线程执行-不可扩展

时间:2019-07-18 12:23:58

标签: python multithreading performance

我需要运行非常大的CPU和内存-大量的python计算(类似Monte-Carlo)。我在开发计算机上对执行进行了基准测试,由于有内存(每个线程最多9 Gb),它可以运行一个内核。 我试图使用multiprocessing.Pool通过服务器(32核,256 GB RAM)运行相同的程序。令人惊讶的是,线程数量的增加极大地增加了每个内核的运行时间。 8个线程而不是4个线程每个内核运行3倍的时间。性能监视器显示最大9 x 8 Gb,远远低于最大可用容量。

Win Server 2008 R2、256 GB RAM,英特尔®至强®处理器E5-2665 x2 我知道 1.时间花费在函数本身上,分三个CPU昂贵的步骤 2.其中第一个(随机绘图和转换为事件)和最后一个(用于聚合的c ++模块)对问题的敏感度较低(运行时间增加到2倍)。当我运行更多内核时,包含python矩阵代数公司scipy.linalg.blas.dgemm函数的第二步可能要贵6倍。它不会消耗最多的内存(步骤1会占用最多内存,步骤1之后不会超过5 GB) 3.如果我从不同的dos框中手动运行相同的零件,则我的行为相同。

我需要可扩展的计算时间,以提高性能,但是无法使用。我想念什么吗? Python内存限制? WinServer 2008特定于?布拉斯超载问题?

1 个答案:

答案 0 :(得分:0)

您错过了有关GIL的信息。在cPython中,线程处理不会给您额外的性能。它允许在其他线程中等待一些耗时的IO操作时运行计算。

要提高性能,您的功能需要释放GIL。这意味着它不能是纯python,而是在Cython / C / C ++中具有正确的配置。