Отслеживание утечки памяти в приложении django -rest-framework - PullRequest
0 голосов
/ 23 января 2020

У меня есть подозрение на утечку памяти в приложении, которое использует django + django -rest-framework. Я пробовал несколько вещей, но до сих пор не удалось отследить его до точного root. Представление генерирует интерактивное изображение подгоночных файлов (используемых в астрономических приложениях) с использованием Bokeh, но также имеет возможность использования matplotlib.pyplot для создания файла png. Было несколько событий, которые закончились сбоем сервера с использованием памяти порядка 35%. Сервер разработки представляет собой 12-ядерный процессор Intel i7 с 32 ГБ оперативной памяти, работающей под управлением Centos 7. Возможно, для django нормально использовать много памяти, но в какой-то момент он должен ее освободить.

Memory evolution x-axis is seconds, y-axis memory percent screenshot

Вещи, которые я пробовал.

  • Переключение бэкэнда кэша. В настоящее время у меня есть FileBasedCache бэкэнд, но переход с LocMemCache на MemcachedCache только немного улучшил его. Это означает, что после пары запросов он поднимается выше порогового значения в ГБ, а затем уменьшается только на пару сотен МБ. И затем остается там навсегда.
  • Реализован Gunicorn в качестве рабочего сервера, с nginx в качестве прокси (как рекомендовано в документации).
  • Добавлено tracemallo c в представлении для получить разницу в использовании памяти. Но я, кажется, не нахожу это, возможно я не понимаю его вывод. Хотя существуют модули с высоким использованием памяти, их размер соответствует только одному запросу.

    1 /usr/local/lib/python3.7/json/decoder.py:0: size=6305 KiB (+6293 KiB), count=626 (+529), average=10.1 KiB
    2 /usr/local/lib/python3.7/site-packages/rest_framework/renderers.py:0: size=6253 KiB (+6252 KiB), count=3 (+1), average=2084 KiB
    3 /usr/local/lib/python3.7/site-packages/bokeh/core/_templates/js_resources.html:0: size=6251 KiB (+6250 KiB), count=2 (+1), average=3125 KiB
    4 /usr/local/lib/python3.7/site-packages/astropy/io/fits/hdu/image.py:0: size=4686 KiB (+4680 KiB), count=14 (+1), average=335 KiB
    5 /usr/local/lib/python3.7/tracemalloc.py:0: size=499 KiB (+151 KiB), count=7989 (+2379), average=64 B
    6 /usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py:0: size=94.5 KiB (+39.1 KiB), count=606 (+238), average=160 B
    7 /usr/local/lib/python3.7/site-packages/rest_framework/fields.py:0: size=77.6 KiB (+34.8 KiB), count=466 (+224), average=171 B
    8 /usr/local/lib/python3.7/site-packages/bokeh/core/property/wrappers.py:0: size=35.6 KiB (+30.2 KiB), count=246 (+224), average=148 B
    9 /usr/local/lib/python3.7/site-packages/bokeh/core/has_props.py:0: size=64.3 KiB (+21.1 KiB), count=421 (+219), average=156 B
    10 /usr/local/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py:0: size=78.3 KiB (+14.7 KiB), count=500 (+108), average=160 B
    
  • Создан сценарий python, который загружает несколько изображений с использованием библиотеки, используемой в представлении. (для файла соответствует). Память освобождается, как и ожидалось.

  • Пробовал с использованием pmap PID, но он полон огромных кусков данных, которые, на мой взгляд, являются недостающей памятью, но там написано [anon]. Команда pmap 14 | sort -n -k 2, ниже я вставил последние строки.

    00007f4e005a4000   2856K r-x-- libpython3.7m.so.1.0
    00007f4df5b87000   3344K r-x-- _openssl.abi3.so
    00007f4dc760a000   3364K r-x-- _sparsetools.cpython-37m-x86_64-linux-gnu.so
    00007f4df4370000   3732K r-x-- _multiarray_umath.cpython-37m-x86_64-linux-gnu.so
    0000556aef42a000   3776K rw---   [ anon ]
    00007f4df6de1000   3840K rw---   [ anon ]
    00007f4df495b000   4352K rw---   [ anon ]
    00007f4dd2111000   4356K rw---   [ anon ]
    0000556af3da6000   4680K rw---   [ anon ]
    0000556b087ad000   4680K rw---   [ anon ]
    0000556af38ee000   4832K rw---   [ anon ]
    00007f4df5687000   5120K rw---   [ anon ]
    00007f4db7452000   5888K rw---   [ anon ]
    00007f4dce8f0000   5888K rw---   [ anon ]
    00007f4df67a0000   6400K rw---   [ anon ]
    00007f4db7f58000   6660K rw---   [ anon ]
    0000556af3171000   7668K rw---   [ anon ]
    0000556afeaa5000   7668K rw---   [ anon ]
    0000556af4238000   7824K rw---   [ anon ]
    00007f4de2adb000   8192K rw---   [ anon ]
    00007f4de32dc000   8192K rw---   [ anon ]
    00007f4de3add000   8192K rw---   [ anon ]
    00007f4de92e0000   8192K rw---   [ anon ]
    00007f4df0ae3000   8192K rw---   [ anon ]
    00007f4df12e4000   8192K rw---   [ anon ]
    00007f4df1ae5000   8192K rw---   [ anon ]
    0000556afb00d000   9360K rw---   [ anon ]
    00007f4db59ee000  14592K rw---   [ anon ]
    0000556af1ef4000  18724K rw---   [ anon ]
    0000556afb96a000  18724K rw---   [ anon ]
    00007f4df25df000  27608K r-x-- libopenblasp-r0-34a18dc3.3.7.so
    0000556af49dc000  30040K rw---   [ anon ]
    0000556aff2e2000  30676K rw---   [ anon ]
    0000556afcbb3000  31688K rw---   [ anon ]
    00007f4dc9a0a000  33792K rw---   [ anon ]
    0000556aef7da000  40040K rw---   [ anon ]
    00007f4de42de000  40960K rw---   [ anon ]
    00007f4de6adf000  40960K rw---   [ anon ]
    00007f4de9ae1000  40960K rw---   [ anon ]
    00007f4db0021000  65404K -----   [ anon ]
    00007f4dec2e2000  73728K rw---   [ anon ]
    0000556af6732000  74604K rw---   [ anon ]
    0000556b010d7000 121688K rw---   [ anon ]
    0000556b08c3f000 146916K rw---   [ anon ]
    00007f4dd69da000 197632K rw---   [ anon ]
     total          1879032K
    

    Еще одна интересная особенность: если я использую опцию -X, это показывает повторяющиеся записи (последний столбец).

    Address Perm   Offset Device    Inode    Size    Rss    Pss Referenced Anonymous ShmemPmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss Locked Mapping
    
    7f4dfeb3d000 rw-p 00000000  00:00        0     768    768    722        756       768              0              0               0    0       0      0 
    7f4dfebfd000 r-xp 00000000 103:02  1841647      36     36      8         36         0              0              0               0    0       0      0 _struct.cpython-37m-x86_64-linux-gnu.so
    7f4dfec06000 ---p 00009000 103:02  1841647    2044      0      0          0         0              0              0               0    0       0      0 _struct.cpython-37m-x86_64-linux-gnu.so
    7f4dfee05000 r--p 00008000 103:02  1841647       4      4      2          4         4              0              0               0    0       0      0 _struct.cpython-37m-x86_64-linux-gnu.so
    7f4dfee06000 rw-p 00009000 103:02  1841647       8      8      6          8         8              0              0               0    0       0      0 _struct.cpython-37m-x86_64-linux-gnu.so
    7f4dfee08000 rw-p 00000000  00:00        0       4      4      2          0         4              0              0               0    0       0      0 
    7f4dfee09000 r-xp 00000000 103:02   796483      28     28      9         28         0              0              0               0    0       0      0 libffi.so.6.0.4
    7f4dfee10000 ---p 00007000 103:02   796483    2048      0      0          0         0              0              0               0    0       0      0 libffi.so.6.0.4
    7f4dff010000 r--p 00007000 103:02   796483       4      4      2          4         4              0              0               0    0       0      0 libffi.so.6.0.4
    7f4dff011000 rw-p 00008000 103:02   796483       4      4      2          4         4              0              0               0    0       0      0 libffi.so.6.0.4
    7f4dff01c000 r-xp 00000000 103:02  1841618     108    108     35        108         0              0              0               0    0       0      0 _ctypes.cpython-37m-x86_64-linux-gnu.so
    7f4dff037000 ---p 0001b000 103:02  1841618    2048      0      0          0         0              0              0               0    0       0      0 _ctypes.cpython-37m-x86_64-linux-gnu.so
    7f4dff237000 r--p 0001b000 103:02  1841618       4      4      2          4         4              0              0               0    0       0      0 _ctypes.cpython-37m-x86_64-linux-gnu.so
    7f4dff238000 rw-p 0001c000 103:02  1841618      16     16     16         16        16              0              0               0    0       0      0 _ctypes.cpython-37m-x86_64-linux-gnu.so
    7f4dff23c000 rw-p 00000000  00:00        0     768    768    716        764       768              0              0               0    0       0      0 
    7f4dff2fc000 r-xp 00000000 103:02  1841628       8      8      1          8         0              0              0               0    0       0      0 _heapq.cpython-37m-x86_64-linux-gnu.so
    7f4dff2fe000 ---p 00002000 103:02  1841628    2044      0      0          0         0              0              0               0    0       0      0 _heapq.cpython-37m-x86_64-linux-gnu.so
    7f4dff4fd000 r--p 00001000 103:02  1841628       4      4      2          0         4              0              0               0    0       0      0 _heapq.cpython-37m-x86_64-linux-gnu.so
    7f4dff4fe000 rw-p 00002000 103:02  1841628       8      8      4          4         8              0              0               0    0       0      0 _heapq.cpython-37m-x86_64-linux-gnu.so
    7f4dff500000 rw-p 00000000  00:00        0     512    512    474        512       512              0              0               0    0       0      0 
    7f4dff5a5000 rw-p 00000000  00:00        0    1024   1024    948       1020      1024              0              0               0    0       0      0 
    7f4dff6a5000 r-xp 00000000 103:02   662711    1620   1372    252       1372         0              0              0               0    0       0      0 libc-2.24.so
    7f4dff83a000 ---p 00195000 103:02   662711    2048      0      0          0         0              0              0               0    0       0      0 libc-2.24.so
    7f4dffa3a000 r--p 00195000 103:02   662711      16     16      8         16        16              0              0               0    0       0      0 libc-2.24.so
    7f4dffa3e000 rw-p 00199000 103:02   662711       8      8      8          8         8              0              0               0    0       0      0 libc-2.24.so
    7f4dffa40000 rw-p 00000000  00:00        0      16     16     16         16        16              0              0               0    0       0      0 
    7f4dffa44000 r-xp 00000000 103:02   662740    1036    704    234        676         0              0              0               0    0       0      0 libm-2.24.so
    7f4dffb47000 ---p 00103000 103:02   662740    2044      0      0          0         0              0              0               0    0       0      0 libm-2.24.so
    7f4dffd46000 r--p 00102000 103:02   662740       4      4      2          4         4              0              0               0    0       0      0 libm-2.24.so
    7f4dffd47000 rw-p 00103000 103:02   662740       4      4      2          4         4              0              0               0    0       0      0 libm-2.24.so
    7f4dffd48000 r-xp 00000000 103:02   662794       8      8      2          8         0              0              0               0    0       0      0 libutil-2.24.so
    7f4dffd4a000 ---p 00002000 103:02   662794    2044      0      0          0         0              0              0               0    0       0      0 libutil-2.24.so
    7f4dfff49000 r--p 00001000 103:02   662794       4      4      2          4         4              0              0               0    0       0      0 libutil-2.24.so
    7f4dfff4a000 rw-p 00002000 103:02   662794       4      4      2          0         4              0              0               0    0       0      0 libutil-2.24.so
    7f4dfff4b000 r-xp 00000000 103:02   662723      12     12      1         12         0              0              0               0    0       0      0 libdl-2.24.so
    7f4dfff4e000 ---p 00003000 103:02   662723    2044      0      0          0         0              0              0               0    0       0      0 libdl-2.24.so
    7f4e0014d000 r--p 00002000 103:02   662723       4      4      2          4         4              0              0               0    0       0      0 libdl-2.24.so
    7f4e0014e000 rw-p 00003000 103:02   662723       4      4      4          4         4              0              0               0    0       0      0 libdl-2.24.so
    7f4e0014f000 r-xp 00000000 103:02   662774      96     96     16         96         0              0              0               0    0       0      0 libpthread-2.24.so
    7f4e00167000 ---p 00018000 103:02   662774    2044      0      0          0         0              0              0               0    0       0      0 libpthread-2.24.so
    7f4e00366000 r--p 00017000 103:02   662774       4      4      2          4         4              0              0               0    0       0      0 libpthread-2.24.so
    7f4e00367000 rw-p 00018000 103:02   662774       4      4      4          4         4              0              0               0    0       0      0 libpthread-2.24.so
    7f4e00368000 rw-p 00000000  00:00        0  
    

Пожалуйста, дайте мне знать, если какая-то часть неясна.

Спасибо !!

...