From: Inada Naoki Date: Tue, 3 Sep 2024 03:32:38 +0000 (+0900) Subject: gh-121313: multiprocessing: simplify by increasing the connection buffer size to... X-Git-Tag: v3.14.0a1~606 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=13f61bf7f1fb9b9b109b089610e845d98e6dc937;p=thirdparty%2FPython%2Fcpython.git gh-121313: multiprocessing: simplify by increasing the connection buffer size to 64KiB (GH-123559) Increases the multiprocessing connection buffer size from 8k to 64k for efficiency, without overallocating. Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Victor Stinner --- diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index d84b52fe6d4f..7e901cf2fb98 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -13,7 +13,6 @@ import errno import io import itertools import os -import stat import sys import socket import struct @@ -40,7 +39,9 @@ except ImportError: # # -BUFSIZE = 8192 +# 64 KiB is the default PIPE buffer size of most POSIX platforms. +BUFSIZE = 64 * 1024 + # A very generous timeout when it comes to local connections... CONNECTION_TIMEOUT = 20. @@ -361,11 +362,6 @@ if _winapi: f.write(ov.getbuffer()) return f -""" -The default size of a pipe on Linux systems is 16 times the base page size: -https://man7.org/linux/man-pages/man7/pipe.7.html -""" -PAGES_PER_PIPE = 16 class Connection(_ConnectionBase): """ @@ -378,14 +374,11 @@ class Connection(_ConnectionBase): _close(self._handle) _write = _multiprocessing.send _read = _multiprocessing.recv - _default_pipe_size = 0 else: def _close(self, _close=os.close): _close(self._handle) _write = os.write _read = os.read - _base_page_size = os.sysconf(os.sysconf_names['SC_PAGESIZE']) - _default_pipe_size = _base_page_size * PAGES_PER_PIPE def _send(self, buf, write=_write): remaining = len(buf) @@ -400,13 +393,8 @@ class Connection(_ConnectionBase): buf = io.BytesIO() handle = self._handle remaining = size - is_pipe = False - if size > self._default_pipe_size > 0: - mode = os.fstat(handle).st_mode - is_pipe = stat.S_ISFIFO(mode) - limit = self._default_pipe_size if is_pipe else remaining while remaining > 0: - to_read = min(limit, remaining) + to_read = min(BUFSIZE, remaining) chunk = read(handle, to_read) n = len(chunk) if n == 0: diff --git a/Misc/NEWS.d/next/C API/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst b/Misc/NEWS.d/next/C API/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst deleted file mode 100644 index 06abce9e67da..000000000000 --- a/Misc/NEWS.d/next/C API/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst +++ /dev/null @@ -1 +0,0 @@ -Limit reading size in multiprocessing connection._recv for pipes to default pipe size of 16 times base page size, in order to avoid memory overallocation and unnecessary memory management system calls. diff --git a/Misc/NEWS.d/next/Library/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst b/Misc/NEWS.d/next/Library/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst new file mode 100644 index 000000000000..bb41063e684d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-07-03-10-11-53.gh-issue-121313.D7gARW.rst @@ -0,0 +1 @@ +Limit the reading size in the :class:`multiprocessing.connection.Connection` class to 64 KiB to prevent memory overallocation and unnecessary memory management system calls.