MagicStack / MagicStack/uvloop

TLS/SSL asyncio/uvloop leaks memory

Abierto
#565 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Cython
Estrellas
11.9k
Forks
616
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el reproductor mínimo de asyncio.Protocol usando uvloop.new_event_loop, loop.create_server y el contexto TLS, y luego ejecuta en Linux el comando proporcionado ab -n15000 -c15000 -r con las versiones de Python indicadas. Compara el comportamiento de la memoria con y sin TLS y con y sin uvloop; se considera terminado cuando la fuga esté aislada y la memoria deje de crecer excesivamente bajo la carga reproducida.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
networking
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.