LINUX.ORG.RU

Как найти узкое место в многопроцессном приложении?

 , ,


0

5

Привет всем!

Пишу высоко нагруженное приложение на python, состоящее из множества процессов. Тяжёлые работы (вычисления) производятся с помощью numpy и dlib. Разделение на процессы сделано с через модуль multiprocessing. Отдельный процесс на источник данных, несколько процессов рабочих, один процесс сбора статистики и вывода результатов. Обмен большими данными производится через общую память (несколько объектов multiprocessing.Array(ctypes.c_uint8, buffer_size, lock=False)). Обновление состояния, сообщения о событиях - multiprocessing.Pipe(). Изначально была очередь, но работало совсем медленно, с переписыванием на Pipe стало более-менее.

Проблема в том, что рабочие процессы грузят ядра процессора процентов на 60 - 70. Т.е. по неизвестной причине они простаивают 30% времени. Я никак не могу найти это узкое место.

Мне нужно некое средство профилирования, для работы с множеством процессов. В моём понимании примерно следующее:
В нужных местах кода добавляются вызовы для вывода (в файл или stdout) точных отметок времени с комментариями (что за функция, какие-то параметры, т.п.). По этим отметкам потом строится график, где по оси X отмечается время, по Y - процессы, а на плоскости графика - сами отметки с комментариями.
Так я бы смог понять, какой процесс кого и когда ждёт и где искать это узкое место.
Вывод временных отметок можно и самому навелосепедировать, не сложно. Но, может быть, есть что-то готовое? А вот с графиком сложнее, в идеале он должен быть векторным и масштабируемым, с поиском и инструментами измерения (сколько времени прошло от события А до события Б), т.к. временных отметок предполагается ну очень много.

Как-то так...
P.S.: Переписать с Python'а на что-то другое не вариант.

★★★

Ответ на: комментарий от anonymous

Плюсую за предположение по синкам. Хотя: «lock=False», но я не в питонотеме. Так что сомнения.

ТС — ну и что? Собери для начала статистику по времени работы процессов. Как и чем отображать — вообще второстепенная задача. Любая хрень подойдет.

deep-purple ★★★★★ ()