memory from transport buffer not freed after connection_lost
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Muss geklärt werden
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- python
- Bereich
- networking
Rechercherichtung
Beginne damit, die bereitgestellte Python-Reproduktion mit uvloop.new_event_loop auszuführen, beobachte zuerst den Speicher, nachdem die Telnet-Sitzung geschlossen wurde, und vergleiche ihn anschließend mit dem Standard-asyncio-Runner. Verfolge den Transportpuffer und den Pfad von connection_lost; abgeschlossen ist die Aufgabe, wenn der Speicher nach der Trennung ebenso freigegeben wird wie unter asyncio.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
- uvloop version: 0.17.0
- Python version: 3.11.4
- Platform: fedora 38
- Can you reproduce the bug with
PYTHONASYNCIODEBUGin env?: yes, with PYTHONASYNCIODEBUG=1 - Does uvloop behave differently from vanilla asyncio? How?: yes, keeps resident memory
If I flood transport.write() and then close the connection (e.g. having the client telnet session stop) the memory stays resident.
Under stock asyncio, the memory immediately is released.
To reproduce,
- start this program,
- watch it in top
- , telnet to port 8888,
- watch memory usage spike.
- close the telnet session,
- see that memory usage stays high.
- repeat this experiment with stock asyncio runner,
- the memory is freed immediately. after telnet session is closed
This test script is a malloc bomb, so make sure you watch memory closely or you will consume all the memory on your machine
#!/usr/bin/env python3
import asyncio
import uvloop
class EchoServerProtocol(asyncio.Protocol):
def __init__(self, on_connect, on_disconnect):
self.on_connect = on_connect
self.on_disconnect = on_disconnect
def connection_lost(self, transport):
print('Connection lost')
self.on_disconnect()
self.transport = None
def connection_made(self, transport):
self.on_connect(transport)
peername = transport.get_extra_info('peername')
print('Connection from {}'.format(peername))
self.transport = transport
def data_received(self, data):
message = data.decode()
print('Data received: {!r}'.format(message))
print('Send: {!r}'.format(message))
self.transport.write(data)
print('Close the client socket')
async def send_data(transport):
message = b'Hello World!' * 1000
while True:
transport.write(message)
await asyncio.sleep(0)
task = None
def on_connect(transport):
global task
task = asyncio.create_task(send_data(transport))
def on_disconnect():
global task
task.cancel()
async def start():
# Get a reference to the event loop as we plan to use
# low-level APIs.
loop = asyncio.get_running_loop()
server = await loop.create_server(
lambda: EchoServerProtocol(on_connect, on_disconnect),
'127.0.0.1',
8888,
)
async with server:
await server.serve_forever()
if __name__ == '__main__':
# with asyncio.Runner() as runner:
with asyncio.Runner(loop_factory=uvloop.new_event_loop) as runner:
runner.run(start())
- Vorherrschende Sprache
- Cython
- Sterne
- 11.9k
- Forks
- 615
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus MagicStack/uvloop
-
License not clear Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
MagicStack/uvloop#759 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
MagicStack/uvloop#741 · 2 Reaktionen ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
MagicStack/uvloop#702 · 8 Kommentare · 9 Reaktionen ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 25/100
MagicStack/uvloop#766 ·
-
Directly constructed subprocess pipe protocols segfault when callbacks use a non-process owner Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
MagicStack/uvloop#765 ·
Alle Issues in MagicStack/uvloop
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
home-assistant/supervisor#7248 ·
-
bug cert blocker needs triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
project-chip/connectedhomeip#74373 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
sonic-net/sonic-mgmt#28113 ·
-
kind/bug kind/community-report needs/triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100