-
Notifications
You must be signed in to change notification settings - Fork 248
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
creating new greenlets appears to leak memory rapidly in python 3.11 / linux #328
Comments
Previously reported here: gevent/gevent#1924 |
This leak was present in the original implementation of Python 3.11 support (#306) Fixes #328 and fixes gevent/gevent#1924 ; I have run gevent's test suite locally on 3.11 with this fix without seeing any regressions.
This leak was present in the original implementation of Python 3.11 support (#306) Fixes #328 and fixes gevent/gevent#1924 ; I have run gevent's test suite locally on 3.11 with this fix without seeing any regressions.
This issue should be solved by using the just-released greenlet 2.0.1. |
thanks!!! |
The test program above works now however in our integration case we are still seeing rapid memory increases, unfortunately. I will attempt to devise a new test case. |
Bumps [greenlet](https://github.com/python-greenlet/greenlet) from 1.1.3.post0 to 2.0.1. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>2.0.1 (2022-11-07)</h1> <ul> <li>Python 3.11: Fix a memory leak. See <code>issue 328 <https://github.com/python-greenlet/greenlet/issues/328></code>_ and <code>gevent issue 1924 <https://github.com/gevent/gevent/issues/1924></code>_.</li> </ul> <h1>2.0.0.post0 (2022-11-03)</h1> <ul> <li>Add <code>Programming Language :: Python :: 3.11</code> to the PyPI classifier metadata.</li> </ul> <h1>2.0.0 (2022-10-31)</h1> <ul> <li>Nothing changed yet.</li> </ul> <h1>2.0.0rc5 (2022-10-31)</h1> <ul> <li>Linux: Fix another group of rare crashes that could occur when shutting down an interpeter running multiple threads. See <code>issue 325 <https://github.com/python-greenlet/greenlet/issues/325></code>_.</li> </ul> <h1>2.0.0rc4 (2022-10-30)</h1> <ul> <li>Linux: Fix a rare crash that could occur when shutting down an interpreter running multiple threads, when some of those threads are in greenlets making calls to functions that release the GIL.</li> </ul> <h1>2.0.0rc3 (2022-10-29)</h1> <ul> <li>Python 2: Fix a crash that could occur when raising an old-style instance object.</li> </ul> <h1>2.0.0rc2 (2022-10-28)</h1> <ul> <li>Workaround <code>a CPython 3.8 bug <https://github.com/python/cpython/issues/81308></code>_ that could cause the interpreter to crash during an early phase of shutdown with the message "Fatal Python error: Python memory allocator called without</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/69f6483c41776fb9095c3fd7b02d3e4ede289c78"><code>69f6483</code></a> Preparing release 2.0.1</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/df2154d45b8cfa751de1fc9e6a95e0b09a53becf"><code>df2154d</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/python-greenlet/greenlet/issues/329">#329</a> from python-greenlet/issue328</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/aa6f2515b2fefced69be933952bd1f3319d0de58"><code>aa6f251</code></a> Python 3.11: Fix a memory leak switching to greenlets.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/7389976dc748677dd4fce535b91ef07e4387c1d6"><code>7389976</code></a> Back to development: 2.0.1</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/0216c2ae008cb185292b136e34ba92ae3f40da6b"><code>0216c2a</code></a> Preparing release 2.0.0.post0</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/7e1704ccbf2ade357416b63d95d645120df1f4dc"><code>7e1704c</code></a> .github/workflows/tests.yml: Move to final release of 3.11</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f18bff43df80c5190760dc2aedfa436a1fae7bed"><code>f18bff4</code></a> setup.py: Add Python 3.11 to the PyPI classifier metadata.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/fc50ac173d0011492c19c87eb619017fdab47fd9"><code>fc50ac1</code></a> Back to development: 2.0.1</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f9c29d90b1fd33e3ade1272f46e17dfe17d651e6"><code>f9c29d9</code></a> Preparing release 2.0.0</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/4ba1df63dcd40c8056f21117a91bf56d0be8a6eb"><code>4ba1df6</code></a> Back to development: 2.0.0rc6</li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/1.1.3.post0...2.0.1">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=greenlet&package-manager=pip&previous-version=1.1.3.post0&new-version=2.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details>
hMmmmmm OK I think you are good actually, there now seems to be an entirely different memory leak, again python 3.11 only , either in the sqlite3 module or the aiosqlite module. how strange huh? I'll keep you posted but in our original original case with asyncpg (which is the important driver), memory seems to be stable. |
OK we're good here, aiosqlite has some problem, strange, but i can reproduce without greenlet involved. thanks for the quick fix! |
@jamadden I'm still in the disbelief stage, but it appears python 3.11 itself has a similar problem as the one here, with threading.Thread(). That is, the program below which is the threading equivalent also leaks memory at a similar rate: from threading import Thread
while True:
t1 = Thread()
t1.start() I'm going to quadruple check this before reporting to them but do you think the issue you found here might be similarly involved for Python's own Thread object? |
I don't think so, for a couple reasons. First, the thread never executes much in the way of Python bytecode, so it shouldn't be needing to allocate many of the "chunks" that were the problem. Second, the reason they were an issue in greenlet is that we're switching chunks within the same thread, something that CPython should never be doing (the chunks should be thread local). Lastly, comparing the greenlet allocations that showed the chunks as the source of the memory with the thread-based allocations gives a very different pattern:
|
OK! I hope they find this useful when they come in to look at this issue (also surprised noone has triaged it yet, they are usually pretty quick) |
2.0.1 (2022-11-07) ================== - Python 3.11: Fix a memory leak. See `issue 328 <https://github.com/python-greenlet/greenlet/issues/328>`_ and `gevent issue 1924 <https://github.com/gevent/gevent/issues/1924>`_. 2.0.0.post0 (2022-11-03) ======================== - Add ``Programming Language :: Python :: 3.11`` to the PyPI classifier metadata. 2.0.0 (2022-10-31) ================== - Nothing changed yet. 2.0.0rc5 (2022-10-31) ===================== - Linux: Fix another group of rare crashes that could occur when shutting down an interpeter running multiple threads. See `issue 325 <https://github.com/python-greenlet/greenlet/issues/325>`_. 2.0.0rc4 (2022-10-30) ===================== - Linux: Fix a rare crash that could occur when shutting down an interpreter running multiple threads, when some of those threads are in greenlets making calls to functions that release the GIL. 2.0.0rc3 (2022-10-29) ===================== - Python 2: Fix a crash that could occur when raising an old-style instance object. 2.0.0rc2 (2022-10-28) ===================== - Workaround `a CPython 3.8 bug <https://github.com/python/cpython/issues/81308>`_ that could cause the interpreter to crash during an early phase of shutdown with the message "Fatal Python error: Python memory allocator called without holding the GI." This only impacted CPython 3.8a3 through CPython 3.9a5; the fix is only applied to CPython 3.8 releases (please don't use an early alpha release of CPython 3.9). 2.0.0rc1 (2022-10-27) ===================== - Deal gracefully with greenlet switches that occur while deferred deallocation of objects is happening using CPython's "trash can" mechanism. Previously, if a large nested container held items that switched greenlets during delayed deallocation, and that second greenlet also invoked the trash can, CPython's internal state could become corrupt. This was visible as an assertion error in debug builds. Now, the relevant internal state is saved and restored during greenlet switches. See also `gevent issue 1909 <https://github.com/gevent/gevent/issues/1909>`_. - Rename the C API function ``PyGreenlet_GET_PARENT`` to ``PyGreenlet_GetParent`` for consistency. The old name remains available as a deprecated alias. 2.0.0a2 (2022-03-24) ==================== - Fix a crash on older versions of the Windows C runtime when an unhandled C++ exception was thrown inside a greenlet by another native extension. This is a bug in that extension, and the interpreter will still abort, but at least it does so deliberately. Thanks to Kirill Smelkov. See `PR 286 <https://github.com/python-greenlet/greenlet/pull/286>`_. - Musllinux wheels for aarch64 are now built, tested, and uploaded to PyPI. Thanks to Alexander Piskun. - This version of greenlet is known to compile and pass tests on CPython 3.11.0a6. Earlier 3.11 releases will not work; later releases may or may not work. See `PR 294 <https://github.com/python-greenlet/greenlet/pull/294>`_. Special thanks to Victor Stinner, Brandt Bucher and the CPython developers.
Bumps [greenlet](https://github.com/python-greenlet/greenlet) from 1.0.0 to 2.0.2. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>2.0.2 (2023-01-28)</h1> <ul> <li>Fix calling <code>greenlet.settrace()</code> with the same tracer object that was currently active. See <code>issue 332 <https://github.com/python-greenlet/greenlet/issues/332></code>_.</li> <li>Various compilation and standards conformance fixes. See <a href="https://redirect.github.com/python-greenlet/greenlet/issues/335">#335</a>, <a href="https://redirect.github.com/python-greenlet/greenlet/issues/336">#336</a>, <a href="https://redirect.github.com/python-greenlet/greenlet/issues/300">#300</a>, <a href="https://redirect.github.com/python-greenlet/greenlet/issues/302">#302</a>, <a href="https://redirect.github.com/python-greenlet/greenlet/issues/334">#334</a>.</li> </ul> <h1>2.0.1 (2022-11-07)</h1> <ul> <li>Python 3.11: Fix a memory leak. See <code>issue 328 <https://github.com/python-greenlet/greenlet/issues/328></code>_ and <code>gevent issue 1924 <https://github.com/gevent/gevent/issues/1924></code>_.</li> </ul> <h1>2.0.0.post0 (2022-11-03)</h1> <ul> <li>Add <code>Programming Language :: Python :: 3.11</code> to the PyPI classifier metadata.</li> </ul> <h1>2.0.0 (2022-10-31)</h1> <ul> <li>Nothing changed yet.</li> </ul> <h1>2.0.0rc5 (2022-10-31)</h1> <ul> <li>Linux: Fix another group of rare crashes that could occur when shutting down an interpeter running multiple threads. See <code>issue 325 <https://github.com/python-greenlet/greenlet/issues/325></code>_.</li> </ul> <h1>2.0.0rc4 (2022-10-30)</h1> <ul> <li>Linux: Fix a rare crash that could occur when shutting down an interpreter running multiple threads, when some of those threads are in greenlets making calls to functions that release the GIL.</li> </ul> <h1>2.0.0rc3 (2022-10-29)</h1> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/45e78ee5dbefe91c201b8d2b492b2701248e4c4c"><code>45e78ee</code></a> Preparing release 2.0.2</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/b55ea9e05172e5cfd91ca00dda38895024104ce1"><code>b55ea9e</code></a> Improve type error messages. Refs <a href="https://redirect.github.com/python-greenlet/greenlet/issues/330">#330</a></li> <li><a href="https://github.com/python-greenlet/greenlet/commit/1784361e97545c520384cfe50796136c337d1763"><code>1784361</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/342">#342</a> from python-greenlet/issue334</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f891cc2d340e2f7983719d6f625ade517785933f"><code>f891cc2</code></a> Attempt a fix for <a href="https://redirect.github.com/python-greenlet/greenlet/issues/334">#334</a></li> <li><a href="https://github.com/python-greenlet/greenlet/commit/ae570c56dbee9070b02eb2124f0b991cce52f4db"><code>ae570c5</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/341">#341</a> from python-greenlet/issue302</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/616df6049cca1d94f783447ad164e331b3044ead"><code>616df60</code></a> Stop using 'const PyObject*, per <a href="https://github.com/vstinner"><code>@vstinner</code></a></li> <li><a href="https://github.com/python-greenlet/greenlet/commit/880825b7f02c4e22d64eef2e16a015c6a629fdcd"><code>880825b</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/340">#340</a> from python-greenlet/new-actions</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/da25c7f3b07e55c2239f3e618cf29dea3c0864e0"><code>da25c7f</code></a> Moving to currently supported action versions.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/424733f52b9d2ad1c0bf8abd58119bc27aec30c8"><code>424733f</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/339">#339</a> from python-greenlet/issue300</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/99cad0de1ee0af3c62d16415d1632d781fa3af60"><code>99cad0d</code></a> Fix setup.py encoding; bump github codeql from v2 to v2</li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/1.0.0...2.0.2">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=greenlet&package-manager=pip&previous-version=1.0.0&new-version=2.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
I'm using greenlet version 3.0.3 and still facing this issue |
Have you tested with the script at the top? It runs fine for me (no memory leaks) with greenlet 3.0.3 on Python 3.12.3. |
Yes, |
Python 3.11.6 is also working fine for me. |
Not working for me, memory utilization keeps on increasing with every request. (Replicated in local env) |
python = "^3.11" |
can't reproduce here with Python 3.11.6 and greenlet 3.0.3, memory stays fixed
|
I also have the same problem as pratik0907 。 I haved tried python3.10 3.11,the mem leak still exists。 How about you now @pratik0907 |
hi there -
This is indirect from SQLAlchemy where we use greenlet for our asyncio implementation, reported in sqlalchemy/sqlalchemy#8763.
The below script creates a greenlet and calls one switch. Running on linux under any Python 3.11 version with greenlet installed from pypi (
greenlet-2.0.0.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
), the script below grows by about 10M per second. Under Python 3.10, memory is flat at about 10 megs resident.The text was updated successfully, but these errors were encountered: