我想得到以下的总统计数据:
- 发生了多少
softirq
? - 发生了多少
interrupts
? - 发生了多少
context switches
?
我知道你可以使用pidstat
,cat /proc/interrupts
和/cat/proc/softirqs
。但是使用它们的开销太大了。
-
如何在不使用
/proc
的情况下以最快的方式获得{1-3}
的底线值? -
我可以使用 ftrace 来帮助我跟踪事件吗?
我将使用高分辨率计时器来监视系统:
- LWN 文章
- IBM 开发人员
- 小时计时器
使用 perf,例如:
# perf stat -B dd if=/dev/zero of=/dev/null count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 0.956217 s, 535 MB/s
Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':
5,099 cache-misses # 0.005 M/sec (scaled from 66.58%)
235,384 cache-references # 0.246 M/sec (scaled from 66.56%)
9,281,660 branch-misses # 3.858 % (scaled from 33.50%)
240,609,766 branches # 251.559 M/sec (scaled from 33.66%)
1,403,561,257 instructions # 0.679 IPC (scaled from 50.23%)
2,066,201,729 cycles # 2160.227 M/sec (scaled from 66.67%)
217 page-faults # 0.000 M/sec
3 CPU-migrations # 0.000 M/sec
83 context-switches # 0.000 M/sec
956.474238 task-clock-msecs # 0.999 CPUs
0.957617512 seconds time elapsed
的性能子系统,这是您需要从 Linux 系统获得软或硬性能计数器的方式。
你可以用某种程度的分辨率从/proc
中获取所有这些信息,如果你需要更多的rez,你可以调整嵌入式系统的内核。
您可以使用$ vmstat 1
监控所需的信息,并且可以检查 vmstat 的源,以准确查看他们如何从/proc
读取这些信息http://procps.sourceforge.net.
也许你应该考虑编写一个Linux内核模块(LKM)。
这里有一个教程:http://www.tldp.org/LDP/lkmpg/2.6/html/
如果你需要一个准确的性能分析系统,你可以将你的内核模块连接到一些中断,或任何其他有效的入口点*,并保存(没有太多指令!)你需要考虑的内容。然后,在中断后,定期收集和分析该数据。
您可以像其他模块一样通过文件系统中的特殊文件(通过 mknode 在用户空间中创建或在 MKDEV/register_chrdev 初始化中创建)导出信息。
上面的链接中有一些信息。
*
例如,您可以将模块附加到读取系统调用(将实际读取与您的系统调用一起包装),或者导出文件并捕获打开/关闭尝试。
后者的用法示例如下:
void f() {
int fd_prof;
fd_prof = open("/dev/profiler", O_RDONLY);
/* Do whichever thing you want to profile */
close(fd_prof);
/* Read profiled data from /dev/profiled_data or wherever you want
* to export it to */
请注意,在编译 LKM 时,您无法访问标准 C 库,因为内核空间中不存在 libc。
别担心,你仍然会在内核空间中实现像sprintf这样的函数,当然,你可以直接访问(没有上下文切换)任何系统调用(读、写......