Как объяснить результат Muppy перед лицом большой утечки памяти в процессе python3 - PullRequest
0 голосов
/ 08 июля 2019

Наблюдение за утечкой памяти

У нас есть долго работающая программа на 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 не обнаруживает большую часть памяти процесса?

И что более важно, как выяснить, что занимает остальную часть памяти (и, в конце концов, найти утечку)?

...