У меня есть витой сервер под нагрузкой. Когда сервер находится под нагрузкой, использование памяти увеличивается, и оно никогда не восстанавливается (даже если клиентов больше нет). В следующий раз, когда он переходит в большую нагрузку, использование памяти снова увеличивается. Вот моментальный снимок ситуации на тот момент:Утечка памяти в 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?
Еще один инструмент, который стоит посмотреть на heapy. Ответ на http://stackoverflow.com/questions/1331561/using-heapys-memory-profile-browser-with-twisted-web дает пример того, как вы, возможно, захотите его использовать. –
Я пробовал это, к сожалению, Heapy разбивает процесс, когда я пытаюсь его использовать. – Tommy
Это происходит только при использовании PyPy или с CPython? –