還有就是-I N
perf stat
選項 「間隔印刷」,其中N是毫秒間隔做間隔計數器打印每隔N毫秒(N> = 10):http://man7.org/linux/man-pages/man1/perf-stat.1.html
-I msecs, --interval-print msecs
Print count deltas every N milliseconds (minimum: 10ms) The
overhead percentage could be high in some cases, for instance
with small, sub 100ms intervals. Use with caution. example: perf
stat -I 1000 -e cycles -a sleep 5
For best results it is usually a good idea to use it with interval
mode like -I 1000, as the bottleneck of workloads can change often.
還有以機器可讀形式導入結果,並使用-I
第一個字段爲日期時間:
使用-x,perf stat能夠輸出not-q uite,CSV格式輸出......在第二分數可選微秒時間戳(以-I XXX)
vmstat
,SYSTAT家庭工具iostat
,mpstat
等定期打印PERF的統計(每秒)的-I 1000
,例如系統範圍內(添加-A以分開cpu計數器):
perf stat -a -I 1000
該選項在builtin-stat中實現。Çhttp://lxr.free-electrons.com/source/tools/perf/builtin-stat.c?v=4.8__run_perf_stat
功能
531 static int __run_perf_stat(int argc, const char **argv)
532 {
533 int interval = stat_config.interval;
對於perf stat -I 1000
一些程序參數(forks=1
),例如perf stat -I 1000 sleep 10
有間隔環(ts
是毫秒間隔轉換爲struct timespec
):
639 enable_counters();
641 if (interval) {
642 while (!waitpid(child_pid, &status, WNOHANG)) {
643 nanosleep(&ts, NULL);
644 process_interval();
645 }
646 }
666 disable_counters();
對於系統的變型 - 寬硬件性能監視器計數和forks=0
有其他間隔環
658 enable_counters();
659 while (!done) {
660 nanosleep(&ts, NULL);
661 if (interval)
662 process_interval();
663 }
666 disable_counters();
process_interval()
http://lxr.free-electrons.com/source/tools/perf/builtin-stat.c?v=4.8#L347從同一個文件使用read_counters();
它遍歷事件列表中,並read_counter()
這loops over所有已知線程,所有的CPU,並開始實際的閱讀功能:
306 for (thread = 0; thread < nthreads; thread++) {
307 for (cpu = 0; cpu < ncpus; cpu++) {
...
310 count = perf_counts(counter->counts, cpu, thread);
311 if (perf_evsel__read(counter, cpu, thread, count))
312 return -1;
perf_evsel__read
是真正的計數器讀出程序在仍在運行:
1207 int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,
1208 struct perf_counts_values *count)
1209 {
1210 memset(count, 0, sizeof(*count));
1211
1212 if (FD(evsel, cpu, thread) < 0)
1213 return -EINVAL;
1214
1215 if (readn(FD(evsel, cpu, thread), count, sizeof(*count)) < 0)
1216 return -errno;
1217
1218 return 0;
1219 }