Ошибка отладки памяти в сложной программе со многими потоками и процессами в Python - PullRequest
0 голосов
/ 10 мая 2019

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

A.Я попытался запустить memory_profiler в надежде получить построчный вывод, но кажется, что он не выдаст этот вывод, пока программа не будет завершена.Я сталкиваюсь с двумя проблемами:

(i) Моя программа рассчитана на бесконечное выполнение.Я попробовал несколько простых модификаций, чтобы завершить мою программу после определенного момента (по крайней мере, в основном процессе / потоке), но дочерние потоки и процессы продолжают выполняться, и поэтому я не получаю вывод memory_profiler.

(ii) Поскольку дочерние потоки и процессы продолжают выполняться, как упомянуто в (i), мне кажется, что мне нужно было бы сделать довольно значительную переработку, чтобы заставить дочерние потоки и процессы останавливаться, когда основной поток/ процесс останавливается.(Я размышлял о создании глобальной переменной для использования в качестве флага остановки в потоках и использовании возможностей совместного использования состояний многопроцессорных систем для совместного использования этого флага остановки с дочерними процессами, но я подозреваю, что мой подход здесь неправильный/ излишне сложный).

B.Я попытался objgraph (ссылка здесь: https://benbernardblog.com/tracking-down-a-freaky-python-memory-leak/),, которая позволяет мне печатать таблицы использования памяти и прироста при запуске программы (например, используя objgraph.show_most_common_types () и objgraph.show_growth () Но я обнаружил, что вывод бесполезен. По сути, он говорит мне, что у меня есть 60 ГБ данных в списках, но я не вижу способа разбить эту информацию на переменную за переменной, поток за строкой.Поток и / или процесс за процессом.

У меня есть следующие вопросы:

  1. Относительно memory_profiler:

    (i) Есть лиспособ получить построчный вывод memory_profiler без запуска программы до конца?

    (ii) Есть ли способ убить дочерние потоки и процессы, не переходя по сложному пути, который я предложил выше в(A) (ii)?

  2. Есть ли способ получить более подробную информацию об использовании памяти из objgraph?

  3. Я использую PyCharm какмой IDE и знаком с его профилированиемспособности для анализа скорости, но я не вижу анализа памяти в его возможностях профилирования.Я скучаю по этому?

  4. Есть ли лучше / проще использовать инструменты анализа памяти для отладки скриптов Python, чем те, на которые я ссылался выше?Я открыт для бесплатных и платных опций.

  5. Существует ли относительно простой способ подсчитать, сколько потоков и процессов я запустил в разных потоках и процессах (то есть глобально)?Я использовал многопроцессорные функции is_alive () и многопоточность isAlive () в определенных потоках / процессах.Но я не вижу относительно простого способа подсчета количества потоков и процессов в глобальном масштабе без реализации всей платформы с использованием очередей, глобальных переменных и общего состояния для подсчета этой информации (которая будет использоваться только для отладки).

  6. Возможно, это слишком широкий вопрос, но я неправильно отлаживаю использование памяти?Если да, есть ли у вас рекомендации по различным методикам (или источникам, иллюстрирующим различные методики)?

...