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