查找嵌入式 Linux 系统中的延迟问题(停顿)
Posted
技术标签:
【中文标题】查找嵌入式 Linux 系统中的延迟问题(停顿)【英文标题】:Finding latency issues (stalls) in embedded Linux systems 【发布时间】:2010-04-26 06:16:31 【问题描述】:我有一个在 Atmel AT91SAM9260EK 板上运行的嵌入式 Linux 系统,在该板上我有两个以实时优先级运行的进程。管理器进程使用 POSIX 消息队列定期“ping”工作进程以检查工作进程的健康状况。 通常往返 ping 需要大约 1 毫秒,但偶尔需要更长的时间 - 大约 800 毫秒。没有其他进程以更高的优先级运行。
看来停顿可能与日志记录(syslog)有关。如果我停止记录,问题似乎就消失了。但是,如果日志文件位于 JFFS2 或 NFS 上,则没有区别。没有其他进程正在写入“磁盘” - 只是 syslog。
我可以使用哪些工具来帮助我找出这些停顿发生的原因?我知道latencytop并将使用它。还有其他一些可能更有用的工具吗?
一些细节:
内核版本:2.6.32.8 libc(系统日志功能):uClibc 0.9.30.1 系统日志:busybox 1.15.2 未配置交换空间 [在编辑中添加] 根文件系统在 tmpfs 上(从 initramfs 加载)[在编辑中添加]【问题讨论】:
LTTng 现在是一个选项,如下所述:lttng.org/blog/2015/02/04/web-request-latency-root-cause 【参考方案1】:问题是(如您所说)syslogd。当您的进程以 RT 优先级运行时,syslogd 不是。此外,syslogd 不会锁定其堆,并且可以(并且将)被内核分页,尤其是在“客户”很少的情况下。
你可以尝试的是:
启动另一个线程来管理优先级队列,让该线程与 syslog 对话。然后,日志记录将只是获取锁并将某些内容插入列表。只有两个订阅者,您不应该花费大量时间来获取互斥锁。
不使用 syslog,实现自己的日志记录(基本上是第一个建议,减去与 syslog 的对话)。
我遇到了类似的问题,我第一次尝试修复它是修改 syslogd 本身以锁定其堆。那是一场灾难。然后我尝试了 rsyslogd,它改进了一些,但我仍然得到随机延迟峰值。我最终只是使用优先级队列实现了我自己的日志记录,以帮助确保实际上首先写入更重要的消息。
注意,如果您(根本)不使用交换,解决此问题的最短路径可能是实现您自己的日志记录。
【讨论】:
不使用交换。此外,rootfs 是一个 tmpfs (initramfs),因此程序文本 (busybox) 将从 ram 中分页。 @camh - 我讨厌不提出更多建议来解决你手头的问题,但是在调查这个问题的时间里,你可以实现自己的日志记录。 我不认为问题出在系统日志本身,而是在内核的某个地方。 Busybox syslog 非常简单,并且重新实现不会有太大变化,因为我需要能够将来自多个应用程序的日志收集到单个旋转日志中(基于大小)。此外,我必须知道为什么会停滞不前。我不能让它回到现场。谢谢你的回答。 虽然本例中的问题可能出在 syslogd 上,但问题更笼统 - 如何找出停顿的位置,以及为什么。如果他禁用 syslog,但后来需要运行其他东西(例如 web 服务器、snmp 守护进程、cron 作业等等) - 可以做些什么来找出真正导致停顿的原因?因为它没有交换(他没有配置交换),所以它必须是别的东西 - 通常上下文切换在高优先级进程上不是 800ms 的顺序,所以必须发生一些事情。未运行 syslogd/crond/snmpd/等。可能不是一个选择。 @nos 我想我会回来并稍微维护一下这个答案,根据需要,还有更多的现代替代方案基本上可以开箱即用。设置一个提醒,周末我会在这里度过休闲时光。以上是关于查找嵌入式 Linux 系统中的延迟问题(停顿)的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式Linux系统(十)——桌面linux系统和嵌入式linux系统的不同点