为什么单个进程可以在Windows Subsystem for Linux(WSL)上实现100%的多个CPU使用率,而在服务器上的Ubuntu上却无法实现?

时间:2019-03-13 08:56:45

标签: python-multiprocessing windows-subsystem-for-linux

我想通过Python多处理模块实现并行计算,因此我实现了模拟计算以测试是否可以使用多个CPU内核。我发现一个非常奇怪的事情,一个进程可以在台式机上的Linux Linux子系统(WSL)上达到8个CPU使用率100%,而在Lab的服务器上只有一个100%的CPU使用率。 像这样:

enter image description here

这是对比:

enter image description here

此外,我发现使用多个进程并不能减少台式机上WSL的时间成本,但确实可以大大降低Lab服务器上Ubuntu的时间成本。 像这样:

enter image description here

(这里我运行6个进程,而在Lab的服务器上运行单个进程大约需要440s。)

这是对比:

enter image description here

(这里我运行3个进程,在我的桌面上运行单个进程大约需要29秒。)

这是我的Python源代码:

import numpy as np
import time
import os
import multiprocessing as mp

PROCESS_MAX = 1
LOOPS = 1
process_list = []

def simulated_calculation():
    x = np.random.rand(100, 100)
    y = np.random.rand(100, 100)
    z = np.outer(x, y)
    determinant = np.linalg.det(z)

def child_process(name):
    for i in range(LOOPS):
        print("The child process[%s] starts at %s and its PID is %s" % (str(name), time.ctime(), os.getpid()))
        simulated_calculation()
        print("The child process[%s] stops at %s and its PID is %s" %(str(name), time.ctime(), os.getpid()))

def main():
    print("All start at %s" % time.ctime())
    print("The parent process stars at %s and its PID is %s" % (time.ctime(), os.getpid()))
    start_wall_time = time.time()
    for i in range(PROCESS_MAX):
        p = mp.Process(target = child_process, args = (i + 1, ))
        process_list.append(p)
        p.daemon = True
        p.start()
    for i in process_list:
        i.join()
    stop_wall_time = time.time()
    print("All stop at %s" % time.ctime())
    print("The whole runtime is %ss" % str(stop_wall_time - start_wall_time))

if __name__ == "__main__":
    main()

我希望有人能帮助我。谢谢!

1 个答案:

答案 0 :(得分:0)

WSL仍然缺少表面,尤其是在性能方面。没有物理硬件连接,它是从Windows通过虚拟层传递的。这种特定情况听起来好像是已经提交了一个错误,但我建议您提交一个此处介绍的问题。同时,所有与性能相关的问题都位于https://github.com/Microsoft/WSL/issues/873上。我建议您订阅该主题,但不要再添加另一个“我也是”!对于已经拥有足够数量的MS开发人员来说,这绝对是没有用的。