2015-01-26 2 views
1

Я работаю над проектом, и я хотел бы получить значения системных вызовов (кеш, TLB и т. Д.) Системного вызова (например: read()) до и после выполнения файл.системные счетчики производительности аппаратного обеспечения ubuntu

Я пробовал делать это с помощью perf на Ubuntu, но не смог получить никаких результатов. Есть ли способ сделать это, используя perf или, возможно, какой-нибудь другой инструмент?

Спасибо за помощь.

3.329057 task-clock (msec)   # 0.714 CPUs utilized   
16 context-switches    # 0.005 M/sec     
0 cpu-migrations     # 0.000 K/sec     
257 page-faults     # 0.077 M/sec     
1,983,212 cycles     # 0.596 GHz      
1,352,902 stalled-cycles-frontend # 68.22% frontend cycles idle 
1,080,180 stalled-cycles-backend # 54.47% backend cycles idle 
1,336,919 instructions    # 0.67 insns per cycle   
            # 1.01 stalled cycles per insn 
     267,730 branches   # 80.422 M/sec     
     <not counted> branch-misses   

    0.004663489 seconds time elapsed 
+0

, пожалуйста, напишите код, который вы пытались нам помочь узнать, где проблема может быть –

+0

1. вы должны работать как 'sudo' 2. вы должны установить perf с информацией об отладке ядра. вы можете увидеть '[не поддерживается]' с незавершенной установкой. 3. попробуйте 'sudo perf stat -p [pid]' и добавьте свой результат здесь. – qqibrow

+0

Я редактировал вопрос выше с кодом. Это статистика счетчиков производительности для 'ls' – user782400

ответ

2

Существует небольшая библиотека обертка https://github.com/castl/easyperf для perf_event_open в режиме счета, так же как используемые perf stat (его выход был цитируемый вами).

Вы можете подсчет Настройка аппаратных событий (с в ядре подсчета включено - PERFMON_EVENTSEL_OS флага в easyperf), а затем прочитать текущие значения счетчиков perf_read_all в обертке, а затем запустить функцию (системные вызовы) вы хотите профиль, а затем прочитать новые значения счетчика. Разница между старыми и новыми значениями - это оценка стоимости целевой функции. Проверьте этот тест, целевая функция foo:

https://github.com/castl/easyperf/blob/master/test.c

Вы не можете измерить слишком маленькие звонки, потому что чтение счетчиков из оборудования автомобиля perf_event_open осуществляются через несколько read системных вызовов. Итак, сделайте несколько похожих системных вызовов (цикл 100 или 1000) или сделайте системные вызовы, которые больше работают, или попытайтесь измерить накладные расходы на чтение, чтобы получить hw счетчики (измерить пустую функцию «foo», чтобы получить накладные расходы, а затем измерить вашу целевую короткую функцию , затем сравните различия.)