13

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

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

    ==23072== HEAP SUMMARY:
    ==23072== in use at exit: 65,650,760 bytes in 463,153 blocks
    ==23072== total heap usage: 124,269,475 allocs, 123,806,322 frees, 32,660,215,602 bytes allocated

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

Какие еще инструменты или решения у меня есть? Скомпилировал бы интерпретатор Python в режиме отладки, используя sys.getobjects?

+0

Еще один инструмент, который стоит посмотреть на heapy. Ответ на http://stackoverflow.com/questions/1331561/using-heapys-memory-profile-browser-with-twisted-web дает пример того, как вы, возможно, захотите его использовать. –

+0

Я пробовал это, к сожалению, Heapy разбивает процесс, когда я пытаюсь его использовать. – Tommy

+0

Это происходит только при использовании PyPy или с CPython? –

ответ

2

Если код протекает только под нагрузкой (вы это подтвердили?), Я бы посмотрел на все точки, где буферизуются сообщения. Увеличивается ли использование памяти самого процесса? Или увеличивается использование памяти в системе? Если это последний случай, ваш сервер может быть слишком медленным, чтобы идти в ногу с входящими сообщениями и буфером ОС заполнить.

+0

Нет, проблема заключается в использовании памяти самого процесса. И да, это похоже на проблемы с загрузкой, поскольку процесс может продолжаться в течение нескольких дней без увеличения памяти. – Tommy