Утечка памяти в Python Twisted: где она?

У меня сервер Twisted под нагрузкой. Когда сервер находится под нагрузкой, использование памяти увеличивается и никогда не восстанавливается (даже если клиентов больше нет). В следующий раз, когда он перейдет в режим высокой нагрузки, использование памяти снова возрастет. Вот снимок ситуации на тот момент:

  • Память RSS составляет 400 МБ (должно быть 200 МБ при обычном максимальном количестве клиентов).
  • gc.garbage пуст, поэтому нет объектов, которые невозможно собрать.
  • Использование objgraph.py не показывает очевидных кандидатов на утечку (нет заметной разницы между нормальным, работоспособным процессом и процессом утечки).
  • Использование pympler показывает несколько десятков МБ (только), используемых объектами Python (в основном dict, list, str и другие собственные контейнеры).
  • Valgrind с включенной проверкой утечки = full не показывает каких-либо серьезных утечек (только пара мегабайт «окончательно потеряна») - поэтому расширения C не являются виновником . Общий объем памяти также не превышает 400 МБ +, показанных вверху :

    == 23072 == СВОДКА КУЧИ:
    так что нет никаких несобранных объектов.

  • Использование objgraph.py не показывает очевидных кандидатов на утечку (нет заметной разницы между нормальным, работоспособным процессом и протекающим процессом).
  • Использование pympler показывает несколько десятков МБ (только), используемых объектами Python (в основном dict, list, str и другими собственными контейнерами).
  • Valgrind с включенной проверкой утечки = full не показывает никаких серьезных утечек (только пара мегабайт «окончательно потеряна») - так что расширения C не виноваты. Общий объем памяти также не превышает 400 МБ +, показанных вверху :

    == 23072 == СВОДКА КУЧИ:
    так что нет никаких несобранных объектов.

  • Использование objgraph.py не показывает очевидных кандидатов на утечку (нет заметной разницы между нормальным, работоспособным процессом и протекающим процессом).
  • Использование pympler показывает несколько десятков МБ (только), используемых объектами Python (в основном dict, list, str и другими собственными контейнерами).
  • Valgrind с включенной проверкой утечки = full не показывает никаких серьезных утечек (только пара мегабайт «окончательно потеряна») - так что расширения C не виноваты. Общий объем памяти также не превышает 400 МБ +, показанных вверху :

    == 23072 == СВОДКА КУЧИ:

  • Использование pympler показывает несколько десятков мегабайт (только), используемых объектами Python (в основном dict, list, str и другими собственными контейнерами).
  • Valgrind с проверкой утечки = full enabled не показывает никаких серьезных утечек (только пара мегабайт «окончательно потеряна»), поэтому расширения C не являются виновником. Общий объем памяти также не превышает 400 МБ +, показанных вверху :

    == 23072 == СВОДКА КУЧИ:

  • Использование pympler показывает несколько десятков мегабайт (только), используемых объектами Python (в основном dict, list, str и другими собственными контейнерами).
  • Valgrind с проверкой утечки = full enabled не показывает никаких серьезных утечек (только пара мегабайт «окончательно потеряна»), поэтому расширения C не являются виновником. Общий объем памяти также не превышает 400 МБ +, показанных вверху :

    == 23072 == СВОДКА КУЧИ:
    == 23072 == используется на выходе: 65 650 760 байт в 463 153 блоках
    == 23072 == общее использование кучи: 124 269 475 выделенных блоков, 123 806 322 освобождения, выделено 32 660 215 602 байта

Единственное объяснение, которое я могу найти, это то, что некоторые объекты не отслеживаются сборщиком мусора, поэтому они не отображаются objgraph и pympler, но использую огромное количество оперативной памяти.

Какие еще инструменты или решения у меня есть? Поможет ли компиляция интерпретатора Python в режиме отладки с помощью sys.getobjects?

13
задан Tommy 2 November 2010 в 13:25
поделиться