我有一个嵌入式系统,当我进行用户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
答案 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负载百分比(或其他相关信息)。
我建议您通过top
添加有趣/相关或可疑的内容。如果它已经完成,你应该更明确地在你的问题中发现它,因为现在不明显的是CPU最大负载是什么。