Как отследить планирование pthread в Linux? - PullRequest
2 голосов
/ 24 февраля 2012

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

Мы создали тестовую среду, в которой две одинаковые машины выполняют идентичные процессы. Существует третья машина, генерирующая «тактовые» события, которые слушают две машины (отправленные через многоадресную рассылку). Процессы машин делают некоторые вещи на каждом такте, а затем отправляют результат на третью машину. Идея состоит в том, что третья машина устраняет проблему синхронизации часов (между двумя одинаковыми машинами). Мы ожидаем, что возвращающиеся результаты должны быть точно (или почти точно) в одно и то же время. И вообще они есть. Проблема в том, что мы видим случайные всплески, когда один результат резко задерживается (в 10 раз больше стандартного отклонения всех результатов).

Мы смотрим на оптимизацию микросекундного уровня. В этой области проблемы с кэшем и временем пробуждения потоков становятся проблемой. Известно, что общее количество потоков во всех процессах превышает количество ядер ЦП.

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

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

strace - простой инструмент для отслеживания поведения процесса, но, похоже, не может проверить идентификатор ядра.

lttng - нужно исправить ядро, но, что еще более впечатляюще, вы можете точно знать, что каждое ядро ​​делает, как переключение контекста/ обработка прерываний.

Обновление: как уже упоминал Матье Деснойер, lttng может использоваться в качестве модулей ядра Linux начиная с версии 2.6.36, теперь не требуется исправление ядра.

0 голосов
/ 24 февраля 2012

В Linux вы можете получить информацию о процессоре для потока, используя эту команду

pidstat -t -p <processid> 
    => will print the cpu info in which the process is running

В нашем приложении мы используем следующую команду, чтобы назначить процессор процессу / потоку

taskset -c 1,3,11,12,13 <Binary> 

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

...