定位偶尔占用 CPU 内核的位置

定位偶尔占用 CPU 内核的位置

我有一个在中速 ARMv7 处理器上运行的 2.6.35 PREEMPT 内核。大约每 100 - 125 秒就会有一次,某些原因会导致内核无法足够快地处理某些与音频相关的驱动程序以避免欠载运行。保持时间通常在 15-30 毫秒范围内,但也可以更长。目前尚不清楚该延迟是否完全发生在内核中,或者可能与以实时优先级运行的用户进程的调度有关(SCHED_RR,2)。

我的猜测是,有一个(至少一个)驱动程序在抢占方面表现不佳。

用户进程的一些 strace 输出说明了正常和异常行为的某些方面,尽管我不确定如何解释各种时间报告?

正常情况:

     0.000518 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3415) = 1
     0.010202 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3404) = 1
     0.000585 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3404) = 1
     0.000302 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3404) = 1
     0.010706 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3393) = 1
     0.000480 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3392) = 1

对 fd6 的输出进行轮询时不会发生阻塞,而当仅对 fd10 进行输入轮询时,会发生约 10ms 的阻塞。这既体现在系统调用持续时间的报告中,也体现在系统调用之间的间隔时间上(它们是一致的)。

失败案例(极端例子):

     0.000305 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3543) = 1
     0.010730 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3533) = 1
     0.000475 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3532) = 1
     0.000329 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3532) = 1
     0.953349 轮询([{fd=10, 事件=POLLIN|POLLERR|POLLNVAL}, {fd=6, 事件=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT|POLLERR}], 2, 2578) = 1

请注意,在本例中,即使倒数第二个调用被记录为耗时 10 毫秒(正常),但它距离最后一个调用还有 953 毫秒。

我可以使用什么工具来追踪罪魁祸首?

答案1

perf可能对你有帮助。它是 Linux 内核实用程序的一部分。

例如:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

它将显示所有系统调用进入/退出时间和参数(如 strace),提供调用系统调用的二进制文件的名称,并以某种频率(包括内核符号)对每个 CPU 的调用堆栈进行采样。因此您实际上可以看到系统调用期间执行了哪些代码。在多处理器系统中,您需要注意 cpu id(例如 [001])。

答案2

或许atop可以阐明你的问题。

它可以显示已经退出的进程,并且可以显示中央处理器,记忆,磁盘网络利用率。

您可以以交互方式运行它,让它写入文本文件或像sar在预定义的时间间隔内运行它一样,创建一个二进制历史文件,您可以在以后单步执行。

我用它来寻找各种很难找到的猪:-)

相关内容