MagicStack / MagicStack/uvloop

TLS/SSL asyncio/uvloop leaks memory

Open
#565 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Cython
Stars
11.9k
Forks
616
PR merge metrics
No merged PRs in 30d

Description

python3.9 or uvloop seems to leak smaller, but python3.11 (and others?) leaks A LOT OF memory under load
test command: ab -n15000 -c15000 -r https://127.0.0.1/
(apt install apache2-utils)

```
import asyncio, ssl, uvloop

class HTTP(asyncio.Protocol):

def __init__(self):
self.transport = None

def connection_made(self, transport) -> None:
self.transport = transport

def data_received(self, data) -> None:
self.transport.write(
b'HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: keep-alive\r\n\r\n'
)
self.transport.close()

def connection_lost(self, _=0) -> bool | None:
self.transport.close()

def make_tls_context():
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('cert.crt', 'cert.key')
return ctx

tls_context = make_tls_context()
loop = uvloop.new_event_loop()
loop.set_debug(True)

async def start_server(loop):
return await loop.create_server(
HTTP, '127.0.0.1', 443, backlog=65535,
ssl=tls_context)

loop.run_until_complete(start_server(loop))
loop.run_forever()
loop.close()
```

CPython versions tested on:
3.9, 3.11

Operating systems tested on:
Linux

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the minimal asyncio.Protocol reproducer using uvloop.new_event_loop, loop.create_server, and the TLS context, then run the provided ab -n15000 -c15000 -r command on Linux across the reported Python versions. Compare memory behavior with and without TLS and uvloop; done means the leak is isolated and memory no longer grows excessively under the reproduced load.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
networking
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.