MagicStack / MagicStack/uvloop

TLS/SSL asyncio/uvloop leaks memory

Offen
#565 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Cython
Sterne
11.9k
Forks
616
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem minimalen asyncio.Protocol-Reproducer unter Verwendung von uvloop.new_event_loop, loop.create_server und dem TLS-Kontext. Führe dann den bereitgestellten Befehl ab -n15000 -c15000 -r unter Linux mit den gemeldeten Python-Versionen aus. Vergleiche das Speicherverhalten mit und ohne TLS sowie mit und ohne uvloop; abgeschlossen ist die Aufgabe, wenn das Leck isoliert ist und der Speicher unter der reproduzierten Last nicht mehr übermäßig wächst.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
networking
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.