2014-10-27 44 views
0

我有一个嵌入式系统,当我做用户I/O操作时,系统只是停止。它在很长一段时间后才开始行动。这个系统非常复杂,并且有很多进程正在运行。我的问题是,如何识别造成系统失速的原因 - 它在5分钟内没有任何字面意思。 5分钟后,我看到了结果。我真的不知道什么是拖延系统。有关如何调试此问题的任何输入。我已经在系统上运行了顶层。但是,它不会导致任何问题。看到这里,jup_render只占CPU的30%,这不足以拖延系统。所以,我不确定top是否有用。如何识别,什么是在Linux系统停滞?

〜#顶部

顶部 - 12时01分05秒21向上分钟,1个用户,平均负载:1.49,1.26,0.87 任务:116总,2运行,114睡眠,0停止,0僵尸 Cpu:44.4%us,13.9%sy,0.0%ni,40.3%id,0.0%wa,0.0%hi,1.4%si,0.0%st Mem:总共822572k,使用389640k,432932k free,1980k缓冲区 交换:0K总,使用0K,0K免费,227324k缓存

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND   
850 root  20 0 309m 32m 16m S 30 4.0 3:10.88 jup_render                    
    870 root  20 0 221m 13m 10m S 27 1.7 2:28.78 jup_render                    
    688 root  20 0 1156m 4092 3688 S 11 0.5 1:25.49 rxserver                    
    9 root  20 0  0 0 0 S 2 0.0 0:06.81 ksoftirqd/1                    
    16 root  20 0  0 0 0 S 1 0.0 0:06.87 ksoftirqd/3                    
9294 root  20 0 1904 616 508 R 1 0.1 0:00.10 top                      
    812 root  20 0 865m 85m 46m S 1 10.7 1:21.17 lippo_main                    
    13 root  20 0  0 0 0 S 1 0.0 0:06.59 ksoftirqd/2                    
    800 root  20 0 223m 8316 6268 S 1 1.0 0:08.30 rat-cadaemon                   
    3 root  20 0  0 0 0 S 1 0.0 0:05.94 ksoftirqd/0                    
1456 root  20 0 80060 10m 8208 S 1 1.2 0:04.82 jup_render                    
1330 root  20 0 202m 10m 8456 S 0 1.3 0:06.08 jup_render                    
8905 root  20 0 1868 556 424 S 0 0.1 0:02.91 dropbear                    
1561 root  20 0 80084 10m 8204 S 0 1.2 0:04.92 jup_render                    
    753 root  20 0 61500 7376 6184 S 0 0.9 0:04.06 ale_app                     
1329 root  20 0 79908 9m 8208 S 0 1.2 0:04.77 jup_render                    
    631 dbus  20 0 3248 1636 676 S 0 0.2 0:13.10 dbus-daemon                    
1654 root  20 0 80068 10m 8204 S 0 1.2 0:04.82 jup_render                    
    760 root  20 0 116m 15m 12m S 0 1.9 0:10.19 jup_server                    
    8 root  20 0  0 0 0 S 0 0.0 0:00.00 kworker/1:0                    
    2 root  20 0  0 0 0 S 0 0.0 0:00.00 kthreadd                    
    7 root  RT 0  0 0 0 S 0 0.0 0:00.00 migration/1                    
    170 root  0 -20  0 0 0 S 0 0.0 0:00.00 kblockd                     
    6 root  RT 0  0 0 0 S 0 0.0 0:00.00 migration/0                    
    167 root  20 0  0 0 0 S 0 0.0 0:00.00 sync_supers                    
    281 root  0 -20  0 0 0 S 0 0.0 0:00.00 nfsiod 
+0

你在做什么类型的I/O操作会触发它? – 2014-10-27 15:45:19

+0

让我承认这个系统是一个机顶盒。我做了一个频道zap。 – 2014-10-28 06:22:00

回答

1

对于有很多进程运行的嵌入式系统,可能有多种原因。您可能需要从各个角度进行调查。

检查竞争条件和死锁的代码。内核可能正忙于在特定条件下循环。可能会出现应用程序正在等待选定呼叫或CPU资源已用完(根据您所共享的顶级命令的输出排除此CPU资源使用情况的选择)或读取时被阻止的情况。

如果您正在执行阻塞I/O操作,则进程将进入等待队列,并且仅在请求完成后才移回执行路径(就绪队列)。也就是说,它从调度程序运行队列中移出并放入特殊状态。只有当它们从睡眠中唤醒或等待的资源可用时,它才会被放回到运行队列中。

立即执行'strace'。它应拦截/记录由进程调用的系统调用以及进程接收的信号。它将能够显示事件的顺序以及呼叫的所有返回/恢复路径。这可以让你几乎接近问题领域。

还有其他很多方便的工具可以根据您的开发环境/设置进行尝试。主要工具如下:

iotop” - 它由内核监控I/O的使用信息输出系统为您提供电流I/O利用率的表由进程或线程。

'LTTng' - 使跟踪的竞争条件和中断级联成为可能。它是LTT的继承者。它是kprobes,tracepoint和perf功能的组合。

'Ftrace' - 这是一个Linux内核内部跟踪程序,您可以使用它分析/调试延迟和性能相关问题。

如果您的系统基于TI处理器,CCS(跟踪分析器)提供了对系统活动进行非侵入式调试和分析的功能。所以,请注意,根据您的设置,您可能还需要使用相关工具。

遇到几个更多的想法: 魔法SysRq键是Linux中的另一种选择。如果驱动程序卡住了,命令SysRq p可以将您带到导致问题的确切程序。

数据分析可以确定内核花费的时间。有几个工具,如Readprofile和Oprofile。 Oprofile可以通过配置CONFIG_PROFILING和CONFIG_OPROFILE来启用。另一个选项是通过启用配置文件选项并使用Readprofile实用程序通过命令行启动profile=2来读取配置文件计数器来重建内核。

mpstat可以通过'iowait'参数给出'CPU或CPU处于空闲状态的时间百分比,在此期间系统有一个突出的磁盘I/O请求'。

0

你说你运行top应用。你有没有发现哪个程序的CPU时间最长,以及它的百分比是多少?

如果您运行top您应该会看到另一个屏幕,您既没有提供也没有提及CPU负载百分比(或其他相关信息)。

enter image description here

我劝你,包括你可以发现,有趣/相关的或可疑的通过top。如果已经完成,您应该更明确地在您的问题中发现它,因为现在不明白什么是CPU最大负载。

+0

我现在编辑了我的问题。我现在已经提供了更多信息。 – 2014-10-27 12:23:58