Утечка памяти в Python Twisted: где она?
У меня есть загруженный сервер Twisted. Когда сервер находится под нагрузкой, использование памяти увеличивается, и оно никогда не восстанавливается (даже если клиентов больше нет). В следующий раз, когда он переходит в большую нагрузку, использование памяти снова увеличивается. Здесь снимок ситуации в этот момент:
- RSS-память составляет 400 МБ (должно быть 200 МБ с обычным максимальным количеством клиентов).
- gc.garbage пуст, поэтому нет невостребованных объектов.
- Использование objgraph.py не показывает очевидных кандидатов на утечки (нет заметной разницы между нормальным, здоровым процессом и протекающим процессом).
- Использование pympler показывает несколько десятков MB (только), используемых объектами Python (в основном, dict, list, str и другие собственные контейнеры).
-
Valgrind с проверкой утечки = полностью включен, не показывает никаких крупных утечек (только пара MBs окончательно потеряна) - поэтому C-расширения не являются виновниками. Общая память также не содержит 400MB +, показанного top:
==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
Единственное объяснение, которое я могу найти, состоит в том, что некоторые объекты не отслеживаются сборщиком мусора, так что они не отображаются с помощью объекта objgraph и pympler, но используют огромное количество оперативной памяти.
Какие еще инструменты или решения у меня есть? Скомпилировал бы интерпретатор Python в справке режима отладки, используя sys.getobjects?
Ответы
Ответ 1
Если код протекает только под нагрузкой (вы это подтвердили?), я бы посмотрел на все точки, где буферизуются сообщения. Увеличивается ли использование памяти самого процесса? Или увеличивается использование памяти в системе? Если это последний случай, ваш сервер может быть слишком медленным, чтобы не отставать от входящих сообщений, а буфер ОС заполняется.