Наблюдение за утечкой памяти
У нас есть долго работающая программа на python (v. 3.6), которая пропускает 10 кБ в час.
Мы используем Muppy для расследования утечек и печатаем сводку (каждые 5 минут) следующим образом:
from pympler import summary
sum1 = summary.summarize(all_objects)
summary.print_(sum1)
Мы сравниваем выходные данные, когда процесс использует резидентное состояние памяти 100 КБ и 800 КБ (70 часов спустя):
Примерно через час работы RSS составляет ~ 100000 КБ:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
centos 18037 22.6 0.7 860960 116128 ? Rl 12:02 1:38 python3.6 /home/centos/...
и краткое описание:
types | # objects | total size | types | # objects | total size
================================= | =========== | ============ |================================== | =========== | ============
<class 'str | 35907 | 5.14 MB | <class 'dict | 34920 | 20.67 MB
<class 'dict | 6570 | 3.18 MB | <class 'str | 83645 | 8.23 MB
<class 'type | 1754 | 1.77 MB | <class 'list | 30894 | 2.44 MB
<class 'code | 12179 | 1.68 MB | <class 'int | 66825 | 2.04 MB
<class 'collections.OrderedDict | 3742 | 1.48 MB | <class 'type | 1754 | 1.77 MB
<class 'set | 1127 | 418.78 KB | <class 'code | 12181 | 1.68 MB
<class 'tuple | 5781 | 380.12 KB | <class 'float | 69698 | 1.60 MB
<class 'list | 2522 | 271.88 KB | <class 'Orchestrator.order.Order | 28300 | 1.51 MB
<class 'uvloop.Loop | 1 | 250.53 KB | <class 'collections.OrderedDict | 3742 | 1.48 MB
<class 'weakref | 3204 | 250.31 KB | <class 'set | 1132 | 434.38 KB
<class 'wrapper_descriptor | 2273 | 177.58 KB | <class 'tuple | 5787 | 380.52 KB
<class 'int | 4849 | 136.67 KB | <class 'weakref | 3282 | 256.41 KB
<class 'getset_descriptor | 1915 | 134.65 KB | <class 'uvloop.Loop | 1 | 250.53 KB
<class 'abc.ABCMeta | 123 | 123.23 KB | <class 'wrapper_descriptor | 2273 | 177.58 KB
function (__init__) | 918 | 121.92 KB
Примерно через 70 часов работы RSS составляет ~ 800000 КБ:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
centos 18037 24.0 4.8 1540076 795708 ? Sl jul05 995:46 python3.6 /home/centos/...
и сводная таблица выглядит так:
types | # objects | total size
================================== | =========== | ============
<class 'dict | 34920 | 20.67 MB
<class 'str | 83645 | 8.23 MB
<class 'list | 30894 | 2.44 MB
<class 'int | 66825 | 2.04 MB
<class 'type | 1754 | 1.77 MB
<class 'code | 12181 | 1.68 MB
<class 'float | 69698 | 1.60 MB
<class 'Orchestrator.order.Order | 28300 | 1.51 MB
<class 'collections.OrderedDict | 3742 | 1.48 MB
<class 'set | 1132 | 434.38 KB
<class 'tuple | 5787 | 380.52 KB
<class 'weakref | 3282 | 256.41 KB
<class 'uvloop.Loop | 1 | 250.53 KB
<class 'wrapper_descriptor | 2273 | 177.58 KB
Таким образом, Muppy обнаруживает только около 50 МБ использования памяти, в то время как процесс RSS составляет 800 ...?
Вопрос
Как объяснить, что muppy не обнаруживает большую часть памяти процесса?
И что более важно, как выяснить, что занимает остальную часть памяти (и, в конце концов, найти утечку)?