Wachsende Speichernutzung (Leck?) Im Dask Distributed Profiler

Sep 01 2020

Ich habe eine länger laufende Aufgabe, die ich an einen Dask-Cluster sende (Worker führt 1 Prozess und 1 Thread aus) und verwende sie tracemalloc, um die Speichernutzung zu verfolgen. Die Aufgabe kann so lange ausgeführt werden, dass sich die Speichernutzung aufbaut und alle möglichen Probleme verursacht hat. Hier ist die Struktur, wie ich verwendet habe tracemalloc.

def task():
    tracemalloc.start()
    ...
    snapshot1 = tracemalloc.take_snapshot()
    for i in range(10):
        ...
        snapshot2 = tracemalloc.take_snapshot()
        top_stats = snapshot2.compare_to(snapshot1, "lineno")
        print("[ Top 6 differences ]")
        for stat in top_stats[:6]:
            print(str(stat))

Ich erhalte Folgendes (ein bisschen aufgeräumt), das zeigt, dass der Profiler in Dask Distributed Speicherplatz aufbaut. Dies war nach der zweiten Iteration und diese Speichernummern wachsen linear.

[ Top 6 differences ]
/usr/local/lib/python3.8/site-packages/distributed/profile.py:112:
    size=137 MiB (+113 MiB), count=1344168 (+1108779), average=107 B
/usr/local/lib/python3.8/site-packages/distributed/profile.py:68:
    size=135 MiB (+110 MiB), count=1329005 (+1095393), average=106 B
/usr/local/lib/python3.8/site-packages/distributed/profile.py:48:
    size=93.7 MiB (+78.6 MiB), count=787568 (+655590), average=125 B
/usr/local/lib/python3.8/site-packages/distributed/profile.py:118:
    size=82.3 MiB (+66.5 MiB), count=513462 (+414447), average=168 B
/usr/local/lib/python3.8/site-packages/distributed/profile.py:67:
    size=64.4 MiB (+53.1 MiB), count=778747 (+647905), average=87 B
/usr/local/lib/python3.8/site-packages/distributed/profile.py:115:
    size=48.1 MiB (+40.0 MiB), count=787415 (+655449), average=64 B

Weiß jemand, wie man den Profiler bereinigt oder nicht verwendet (wir verwenden das Dashboard nicht, also brauchen wir es nicht)?

Antworten

2 AlexP Sep 01 2020 at 09:37

Ich habe die folgenden Umgebungsvariablen für die Worker-Pods festgelegt, damit die Profilerstellung drastisch reduziert wird. Es scheint zu funktionieren.

DASK_DISTRIBUTED__WORKER__PROFILE__INTERVAL=10000ms 
DASK_DISTRIBUTED__WORKER__PROFILE__CYCLE=1000000ms

Die Standardeinstellungen finden Sie hier: https://github.com/dask/distributed/blob/master/distributed/distributed.yaml#L74-L76

ETA: @rpanai Dies ist das, was wir im K8-Manifest für die Bereitstellung haben

spec:
  template:
    spec:
      containers:
      - env:
        - name: DASK_DISTRIBUTED__WORKER__PROFILE__INTERVAL
          value: 10000ms
        - name: DASK_DISTRIBUTED__WORKER__PROFILE__CYCLE
          value: 1000000ms