subprocess.Popen taking too long on WSL Linux

前端 未结 2 1762
广开言路
广开言路 2020-12-11 10:10

I have this subprocess.Popen() context manager:

with Popen(
    args=command, shell=False, stdout=PIPE, bufsize=1, universal_newlines=True
) as process:

            


        
相关标签:
2条回答
  • 2020-12-11 11:14

    You will need to reevaluate that performance issue in Q3 2019, with WSL2.

    See "Announcing WSL 2" from Craig Loewen

    Changes in this new architecture will allow for: dramatic file system performance increases, and full system call compatibility, meaning you can run more Linux apps in WSL 2 such as Docker.

    File intensive operations like git clone, npm install, apt update, apt upgrade, and more will all be noticeably faster.
    The actual speed increase will depend on which app you’re running and how it is interacting with the file system.
    Initial tests that we’ve run have WSL 2 running up to 20x faster compared to WSL 1 when unpacking a zipped tarball, and around 2-5x faster when using git clone, npm install and cmake on various projects.

    Linux binaries use system calls to perform many functions such as accessing files, requesting memory, creating processes, and more.
    In WSL 1 we created a translation layer that interprets many of these system calls and allows them to work on the Windows NT kernel. However, it’s challenging to implement all of these system calls, resulting in some apps being unable to run in WSL 1.
    Now that WSL 2 includes its own Linux kernel it has full system call compatibility.

    0 讨论(0)
  • 2020-12-11 11:16

    Windows Subsystem for Linux is a bit rubbish. It's got many, many bugs and it's significantly slower than it needs to be. This is just another bug manifesting itself. Here are some possible bottlenecks:

    • Slow context switching in WSL.
    • WSL not noticing that an entire process waiting for a pipe means that the other end of the pipe should be run now.
    • The child process being executed lazily.
    • Windows taking a while to figure out that it needs to use wsl.exe to launch the program (thanks RoadRunner!)
    • The usual overhead of Windows, plus the usual (comparatively small) overhead of Linux.
    • A poor choice of Ubuntu distro causing many unnecessary services to be running in systemd(?)
    • Windows deciding to run other stuff before the child process for some unknown reason.
    • Deliberate malice on the part of the Windows Subsystem for Linux developers, conspiring to "prove" that Windows is the superior operating system by setting up a strawman. Too silly.

    There's nothing wrong with your Python code that would make this slow.

    0 讨论(0)
提交回复
热议问题