如何识别,什么在Linux中拖延系统?

时间:2014-10-27 11:00:50

标签: linux embedded embedded-linux

我有一个嵌入式系统,当我进行用户i / o操作时,系统就会停止。它经过很长一段时间才能完成。该系统非常复杂,并且有许多进程在运行。我的问题是如何确定导致系统失速的原因 - 它在5分钟内没有任何作用。 5分钟后,我看到了结果。我真的不知道是什么阻碍了系统。有关如何调试此问题的任何输入。我在系统上运行了顶级。但是,它不会导致任何问题。看到这里,jup_render占用了30%的CPU,这还不足以阻止系统。所以,我不确定top是否在这里有用。

〜#top

top - 12:01:05 up 21 min,1位用户,平均负载:1.49,1.26,0.87 任务:总共116次,2次跑步,114次睡眠,0次停止,0次僵尸 Cpu(s):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免费,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   

2 个答案:

答案 0 :(得分:2)

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

检查竞争条件和死锁的代码。内核可能在某种情况下忙于循环。可能存在应用程序正在等待选择调用或CPU资源已用完的情况(根据您共享的top命令的输出排除了CPU资源使用的这种选择)或在读取时被阻止。

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

立即采取措施:尝试 strace '。它应该拦截/记录进程调用的系统调用以及进程接收的信号。它将能够显示事件的顺序和所有呼叫的返回/恢复路径。这可以让你几乎更接近问题的区域。

还可以根据您的开发环境/设置尝试其他许多方便的工具。关键工具如下:

'的 iotop ' - 它将通过监视内核输出的I / O使用信息,为您提供系统上进程或线程的当前I / O使用情况表。

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

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

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

遇到了更多想法: magic SysRq key 是linux中的另一个选项。如果驱动程序卡住,命令SysRq p可以将您带到导致问题的确切例程。

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

mpstat 可以给出CPU或CPU闲置的时间百分比,在此期间系统具有未完成的磁盘I / O请求'通过' iowait'参数。

答案 1 :(得分:0)

你说你运行top应用。您是否发现哪个程序获得最大的CPU时间以及它的百分比是多少?

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

enter image description here

我建议您通过top添加有趣/相关或可疑的内容。如果它已经完成,你应该更明确地在你的问题中发现它,因为现在不明显的是CPU最大负载是什么。