Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-38061: subprocess uses closefrom() on FreeBSD #19697

Merged
merged 1 commit into from
Apr 24, 2020
Merged

bpo-38061: subprocess uses closefrom() on FreeBSD #19697

merged 1 commit into from
Apr 24, 2020

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Apr 23, 2020

Optimize the subprocess module on FreeBSD using closefrom().
A single close(fd) syscall is cheap, but when sysconf(_SC_OPEN_MAX)
is high, the loop calling close(fd) on each file descriptor can take
several milliseconds.

The workaround on FreeBSD to improve performance was to load and
mount the fdescfs kernel module, but this is not enabled by default.

Initial patch by Kyle Evans with the help of Kubilay Kocak:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274

https://bugs.python.org/issue38061

@vstinner
Copy link
Member Author

cc @koobs

@vstinner
Copy link
Member Author

Optimize the subprocess module on FreeBSD using closefrom().
A single close(fd) syscall is cheap, but when sysconf(_SC_OPEN_MAX)
is high, the loop calling close(fd) on each file descriptor can take
several milliseconds.

The workaround on FreeBSD to improve performance was to load and
mount the fdescfs kernel module, but this is not enabled by default.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274
@vstinner
Copy link
Member Author

I will check with FreeBSD developers if the authors are correct and check that the fix works as expected.

fdescfs kernel module, but this is not enabled by default.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans (kevans) and
Kubilay Kocak (koobs):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove this, full credit to Ed, Conrad & Kyle

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even if you didn't write the patch directly, you helped to get it packaged. Thanks @koobs, you deserved to be credited ;-)

@jlevon
Copy link

jlevon commented Apr 24, 2020

This change could also add sun to get this supported under Solaris and illumos

@vstinner
Copy link
Member Author

I tested this change functionaly using truss:

vstinner@freebsd$ truss -o log -f ./python -c 'import subprocess, sys, os; os.dup2(0, 8); args=[sys.executable, "-c", "pass"]; subprocess.run(args, pass_fds=[8])' 

vstinner@freebsd$ grep closefrom log
  947: closefrom(0x9)				 = 0 (0x0)

vstinner@freebsd$ wc -l log   # total number of syscalls (parent+child)
    1586 log

It works as expected: closefrom() is called

Without this change, there are way more syscalls (+229 274) :-)

vstinner@freebsd$ wc -l log
  230860 log

... which is very close to the maximum number of file descriptor:

>>> os.sysconf("SC_OPEN_MAX")
229284

@vstinner vstinner merged commit e6f8abd into python:master Apr 24, 2020
@vstinner vstinner deleted the subprocess_closefrom branch April 24, 2020 10:07
@vstinner
Copy link
Member Author

This change could also add sun to get this supported under Solaris and illumos

Sure. But please propose a separated PR.

CuriousLearner added a commit to CuriousLearner/cpython that referenced this pull request Apr 27, 2020
* 'master' of github.com:python/cpython: (2949 commits)
  Add files in tests/test_peg_generator to the install target lists (pythonGH-19723)
  bpo-40398: Fix typing.get_args() for special generic aliases. (pythonGH-19720)
  bpo-40348: Fix typos in the programming FAQ (pythonGH-19729)
  bpo-38387: Formally document PyDoc_STRVAR and PyDoc_STR macros (pythonGH-16607)
  bpo-40401: Remove duplicate pyhash.h include from pythoncore.vcxproj (pythonGH-19725)
  bpo-40387: Improve queue join() example. (pythonGH-19724)
  bpo-40396: Support GenericAlias in the typing functions. (pythonGH-19718)
  Fix typo in Lib/typing.py (pythonGH-19717)
  Fix typo in object.__format__ docs (pythonGH-19504)
  bpo-40275: Avoid importing logging in test.support (pythonGH-19601)
  bpo-40275: Avoid importing socket in test.support (pythonGH-19603)
  bpo-40275: Avoid importing asyncio in test.support (pythonGH-19600)
  bpo-40279: Add some error-handling to the module initialisation docs example (pythonGH-19705)
  closes bpo-40385: Remove Tools/scripts/checkpyc.py (pythonGH-19709)
  bpo-40334: Add What's New sections for PEP 617 and PEP 585 (pythonGH-19704)
  bpo-40340: Separate examples more clearly in the programming FAQ (pythonGH-19688)
  bpo-40360: Deprecate lib2to3 module in light of PEP 617 (pythonGH-19663)
  bpo-40334: Rewrite test_c_parser to avoid memory leaks (pythonGH-19694)
  bpo-38061: subprocess uses closefrom() on FreeBSD (pythonGH-19697)
  bpo-38061: os.closerange() uses closefrom() on FreeBSD (pythonGH-19696)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants