查找嵌入式Linux系统中的延迟问题(停顿)

时间:2010-04-26 06:16:32

标签: linux embedded latency

我有一个在Atmel AT91SAM9260EK板上运行的嵌入式Linux系统,我有两个进程以实时优先级运行。管理器进程使用POSIX消息队列定期“ping”工作进程,以检查工作进程的运行状况。 通常往返ping大约需要1毫秒,但偶尔需要更长时间 - 大约800毫秒。没有其他流程以更高的优先级运行。

看来停顿可能与日志记录(syslog)有关。如果我停止记录问题似乎消失了。但是,如果日志文件位于JFFS2或NFS上,则没有任何区别。没有其他进程写入“磁盘” - 只是syslog。

我可以使用哪些工具来帮助我找出这些档位发生的原因?我知道等待时间并将使用它。还有其他一些可能更有用的工具吗?

一些细节:

  • 内核版本:2.6.32.8
  • libc(syslog函数):uClibc 0.9.30.1
  • syslog:busybox 1.15.2
  • 未配置交换空间[在编辑中添加]
  • 根文件系统在tmpfs上(从initramfs加载)[在编辑中添加]

1 个答案:

答案 0 :(得分:2)

问题是(如你所说)syslogd。当您的进程以RT优先级运行时,syslogd 不是。此外,syslogd不会锁定其堆,并且可以(并且将)被内核分页,特别是对于很少的“客户”。

你可以尝试的是:

  • 启动另一个线程来管理优先级队列,让该线程与syslog通信。然后记录只是获取一个锁并在列表中插入一些东西。如果只有两个订阅者,则不应该花费大量时间来获取互斥锁。

  • 不使用syslog,实现自己的日志记录(基本上是第一个建议,减去与syslog的对话)。

我有类似的问题,我第一次尝试修复它是修改syslogd本身来锁定它的堆。那是一场灾难。然后我尝试了rsyslogd,它改进了一些,但我仍然有随机延迟峰值。我最后使用优先级队列来实现自己的日志记录,以帮助确保首先实际写入更多关键消息。

注意,如果您没有使用swap(根本没有),修复此问题的最短路径可能是实现您自己的日志记录。