使用 linux perf 实用程序每秒报告一次计数器,例如 vmstat
Use linux perf utility to report counters every second like vmstat
Linux 中有 perf
命令-linux 实用程序可以访问硬件性能监控计数器,它使用 perf_events
内核子系统工作。
perf
本身基本上有两种模式:perf record
/perf top
来记录采样配置文件(示例是每第 100000 个 cpu 时钟周期或执行的命令)和 perf stat
模式报告应用程序(或整个系统)的 cycles/executed 命令总数。
是否有 perf
模式可以每秒(每 3、5、10 秒)打印系统范围或每个 CPU 总计数摘要,就像在 [= 中打印的那样18=] 和 systat 系列工具(iostat
、mpstat
、sar -n DEV
...如 http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html 中所列)?例如,使用周期和指令计数器,我将获得系统每秒(或每个 CPU)的平均 IPC。
是否有任何非 perf
工具(在 https://perf.wiki.kernel.org/index.php/Tutorial or http://www.brendangregg.com/perf.html 中)可以使用 perf_events
内核子系统获得此类统计信息?以秒为单位的系统级每进程 IPC 计算怎么样?
-I N
有 perf stat
选项 "interval-print",其中 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
第一个字段是日期时间:
With -x, perf stat is able to output a not-quite-CSV format output ... optional usec time stamp in fractions of second (with -I xxx)
vmstat
、systat-family 工具 iostat
、mpstat
等周期性打印是 -I 1000
perf stat(每秒),例如系统范围(添加 -A 以分隔 cpu 个计数器):
perf stat -a -I 1000
该选项在内置-stat.c 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 from the same file uses read_counters();
which loops over event list and invokes read_counter()
which 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 }
Linux 中有 perf
命令-linux 实用程序可以访问硬件性能监控计数器,它使用 perf_events
内核子系统工作。
perf
本身基本上有两种模式:perf record
/perf top
来记录采样配置文件(示例是每第 100000 个 cpu 时钟周期或执行的命令)和 perf stat
模式报告应用程序(或整个系统)的 cycles/executed 命令总数。
是否有 perf
模式可以每秒(每 3、5、10 秒)打印系统范围或每个 CPU 总计数摘要,就像在 [= 中打印的那样18=] 和 systat 系列工具(iostat
、mpstat
、sar -n DEV
...如 http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html 中所列)?例如,使用周期和指令计数器,我将获得系统每秒(或每个 CPU)的平均 IPC。
是否有任何非 perf
工具(在 https://perf.wiki.kernel.org/index.php/Tutorial or http://www.brendangregg.com/perf.html 中)可以使用 perf_events
内核子系统获得此类统计信息?以秒为单位的系统级每进程 IPC 计算怎么样?
-I N
有 perf stat
选项 "interval-print",其中 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
第一个字段是日期时间:
With -x, perf stat is able to output a not-quite-CSV format output ... optional usec time stamp in fractions of second (with -I xxx)
vmstat
、systat-family 工具 iostat
、mpstat
等周期性打印是 -I 1000
perf stat(每秒),例如系统范围(添加 -A 以分隔 cpu 个计数器):
perf stat -a -I 1000
该选项在内置-stat.c 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 from the same file uses read_counters();
which loops over event list and invokes read_counter()
which 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 }