Почему один процесс может достичь многократного использования ЦП на 100% в Windows Subsystem for Linux (WSL), но не может в Ubuntu на сервере? - PullRequest
1 голос
/ 13 марта 2019

Я хочу добиться параллельных вычислений с помощью многопроцессорного модуля Python, поэтому я реализую смоделированные вычисления, чтобы проверить, могу ли я использовать несколько ядер ЦП. Я обнаружил очень странную вещь: один процесс может достичь 8-процентного использования ЦП на подсистеме Windows для Linux (WSL) на моем рабочем столе в 100%, а не только одного использования ЦПУ на 100% в Ubuntu на сервере Lab. Как это:

enter image description here

И это контраст:

enter image description here

Кроме того, я обнаружил, что использование нескольких процессов не снижает затраты времени на WSL на моем настольном компьютере, но в действительности значительно снижает затраты времени на Ubuntu на сервере Lab. Как это:

enter image description here

(Здесь я запускаю 6 процессов, а для запуска одного процесса на сервере Lab требуется около 440 с.)

И это контраст:

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 голосов
/ 19 марта 2019

WSL по-прежнему не хватает поверхности, особенно в мире производительности. Нет физических подключений к оборудованию, они передаются из Windows через виртуальный уровень. Этот конкретный сценарий звучит так, как будто это ошибка, возможно, уже подана, но я бы посоветовал подать проблему, как представлено здесь. В то же время место для всех проблем, связанных с производительностью, составляет https://github.com/Microsoft/WSL/issues/873.. Я рекомендую вам подписаться на тему, но не ставьте еще одно "я тоже!" что абсолютно бесполезно для разработчиков MS, которым этого уже более чем достаточно.

...