找到偶发的CPU内核


11

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

我的猜测是,有(至少一个)驱动程序在抢先状态下表现不佳。

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

正常情况:

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

对于fd6的输出,轮询不会发生阻塞,并且仅对fd10的输入进行轮询时,才会发生大约10ms的阻塞。这既反映在系统调用的持续时间报告中,又反映在系统调用之间的间隔中(它们是一致的)。

失败案例(极端示例):

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

请注意,在这种情况下,即使倒数第二次通话被记录为花费10毫秒(正常),也要比最后一次通话早953毫秒。

我可以使用哪些工具来追查罪魁祸首?


2
有趣的问题加分。我不确定该如何回答,但确实有一个问题,该如何追溯到CPU使用率(例如,与iowait的峰值相反)?
Bratchley

1
首先要猜测的是,如果您正在大型NAND闪存上运行JFFS2或YAFFS,尤其是在录制时。禁用任何写入闪存的内容,看看是否有帮助。您的过程表是什么样的?如果您具有构建内核的工具链,则可以将ftrace作为最后的选择。
乔纳森·本·阿夫拉罕

sar -bu可以做到。.linux.die.net
man/1/

使用了一些闪光灯;带有已安装的ext4文件系统的SD卡。并且写信确实是这些问题的可能根源(但是为什么呢?),但可能不是唯一的。
2013年

Answers:


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的调用堆栈进行采样。因此,您实际上可以看到在syscall期间执行了什么代码。在多处理器系统中,您需要注意CPU ID(例如[001])。


我将研究如何为平台构建性能-感谢您的提示。
2013年

0

也许atop可以阐明您的问题。

它可以显示已经退出的进程,并且可以显示CPU内存磁盘网络利用率。

您可以以交互方式运行它,让它写入文本文件,或者sar以预定的时间间隔运行它,从而创建一个二进制历史文件,此后可以逐步执行。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.