Я пытаюсь профилировать многопоточную программу, которую написал на довольно большой машине (32 ядра, 256 ГБ ОЗУ). Я заметил, что между запусками производительность программы может сильно различаться (70-80%). Кажется, я не могу найти причину такой огромной разницы в производительности программы, но, проанализировав результат использования утилиты time на большом количестве запусков, я заметил, что количество непроизвольных переключений контекста сильно коррелирует с производительность программы (очевидно, что меньшее количество переключений контекста приводит к повышению производительности и наоборот).
Есть ли хороший способ определить, что вызывает это переключение контекста? Если я смогу обнаружить виновника, то, возможно, я смогу попытаться решить проблему. Однако у меня есть несколько особых ограничений на инструменты, которые я могу использовать. Во-первых, у меня нет привилегий root на машине, поэтому инструменты, требующие таких привилегий, отсутствуют. Во-вторых, это довольно старое ядро (RHEL5, ядро 2.6.18), поэтому некоторые стандартные элементы обработки событий могут отсутствовать. В любом случае, мы будем очень благодарны за любые предложения о том, как глубже изучить причину этого переключения контекста.
обновление: я решил протестировать свою программу на другом (и меньшем) компьютере. Другая машина представляет собой 4-ядерный (с гипертекстовым заголовком) Linux-бокс с 8 ГБ ОЗУ и гораздо более новым ядром - 3.2.0 против 2.6.18 на другой машине. На новой машине я не могу воспроизвести двухмодальный профиль производительности. Это заставляет меня думать, что проблема связана либо с проблемой оборудования (как было предложено в комментариях), либо с особенно патологическим случаем на уровне ядра, который с тех пор был исправлен. Моя текущая лучшая гипотеза состоит в том, что это может быть результатом того факта, что новая машина имеет ядро с полностью справедливым планировщиком (CFS), а старая машина - нет. Есть ли способ проверить эту гипотезу (указать новой машине использовать другой / более старый планировщик) без необходимости перекомпилировать старую версию ядра для новой машины?
top
во время работы вашей программы? Что бы вы ни вытесняли, вероятно, вы используете много ЦП .... - person Tony Delroy   schedule 24.06.2013time
фактически разбивает переключение контекста на добровольный / непроизвольный. Под непроизвольным переключением контекста понимается случай, когда операционная система опережает ваш процесс по какой-либо причине, кроме добровольного отказа от управления (например, уступка / ожидание). Это может произойти, когда истечет его временной интервал и есть процесс с более высоким приоритетом, который должен быть запущен, и, предположительно, также при ряде других условий. - person nomad   schedule 24.06.2013