Подтвердить что ты не робот

Отслеживание утечек памяти в Python (многопроцессорная обработка)

У меня есть приложение multiprocessing, которое утечки памяти. Однако утечка не входит в основной процесс (согласно Dowser и top), но в подпроцессах. Можно ли использовать Dowser (или аналогичный инструмент) для подпроцессов для отслеживания утечки? Если нет, как его отслеживать?

UPDATE: я потратил много времени на использование heapy и код gnibbler, но я не смог найти утечку. Затем я остановил черри в основном процессе и начал еще один (с Dowser) в подпроцессе. Но через несколько минут CherryPy перестанет слушать порт...:( Так что я все еще ищу лучшую идею.

4b9b3361

Ответ 1

Я искал утечку памяти (которая находилась во внешней библиотеке C), используя muppy - отличный инструмент, я бы хотел, чтобы я нашел это скорее! Спасибо всем за ответы.

Ответ 2

Я нашел memory_profiler очень прост в использовании, но я не уверен, как он взаимодействует с многопроцессорностью, поскольку я никогда не использовал этот модуль. См. Этот ответ для краткого объяснения и других ответов в этой теме, чтобы упомянуть другие профилировщики Python.

Ответ 3

Я нашел пару сообщений, которые должны оказаться весьма полезными. Не успел переварить всю информацию в них, но подумал, что я разместил ссылки и позволяю вам также взглянуть на них.

У Marius Gedminas есть два сообщения об охоте memleaks в наборе тестов Python. Он использует встроенные модули gc и inspect и просто сбрасывает графы объектов на диск как файлы csv, поэтому подход должен работать достаточно хорошо даже для приложений mp.

Я рассмотрю, что я сам позже, когда я получаю время.

UPDATE

Marius выпустил свою тестовую установку как проект с открытым исходным кодом под названием objgraph (ссылка). Он отслеживает ссылки на объекты gc, но позволяет распечатывать полезную информацию, например количество экземпляров того типа, которые были добавлены после вызова функции, и позволяет видеть полные цепочки ссылок для объектов.

Документы довольно понятны, и я не вижу причин, по которым он не будет работать с приложениями mp.

Однако, если утечка памяти происходит из некоторой базовой библиотеки c, это может вам не помочь. По крайней мере, это должно дать вам представление о утечке. Если окажется, что вы не находитесь в вашем коде на python, вам может понадобиться реорганизовать ваш код, чтобы вы могли запускать соответствующие c-библиотеки в основном процессе и использовать что-то вроде Valgrind, чтобы обнаружить утечку.


Оригинальное сообщение http://mg.pov.lt/blog/hunting-python-memleaks.html

Тот, где он больше использует инструменты, которые он использует http://mg.pov.lt/blog/python-object-graphs.html

Сообщение, которое меня запустило http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks