В Linux, для программы на C / C ++, использующей pthreads, есть ли способ увидеть, как были запланированы потоки на время жизни процесса? Я хотел бы видеть, на каких процессорах работает каждый поток. Я хотел бы видеть, когда потоки были прерваны (и почему).
Мы создали тестовую среду, в которой две одинаковые машины выполняют идентичные процессы. Существует третья машина, генерирующая «тактовые» события, которые слушают две машины (отправленные через многоадресную рассылку). Процессы машин делают некоторые вещи на каждом такте, а затем отправляют результат на третью машину. Идея состоит в том, что третья машина устраняет проблему синхронизации часов (между двумя одинаковыми машинами). Мы ожидаем, что возвращающиеся результаты должны быть точно (или почти точно) в одно и то же время. И вообще они есть. Проблема в том, что мы видим случайные всплески, когда один результат резко задерживается (в 10 раз больше стандартного отклонения всех результатов).
Мы смотрим на оптимизацию микросекундного уровня. В этой области проблемы с кэшем и временем пробуждения потоков становятся проблемой. Известно, что общее количество потоков во всех процессах превышает количество ядер ЦП.
Я подозреваю, что эти всплески вызваны случайным "идеальным штормом" вытеснения потоков, миграцией потокового процессора (и, следовательно, отсутствием кэша). Внутри различных процессов на самом деле есть только два или три «важных» потока, выполняющих чувствительную ко времени работу. Остальные являются вспомогательными / вспомогательными потоками с более низким приоритетом. В целом количество важных / чувствительных ко времени потоков фактически равно (или меньше) количеству ядер.
Я подозреваю, что решение этой проблемы заключается в тщательном назначении важных потоков их собственным ядрам и сбросе всех потоков поддержки в их собственное ядро. Но это потребует значительных усилий по разработке, и я хотел бы подтвердить свои подозрения, прежде чем идти по этому пути.