9

我有一个在 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 加载)[在编辑中添加]
4

1 回答 1

2

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

你可以尝试的是:

  • 启动另一个线程来管理优先级队列,让该线程与 syslog 对话。然后,日志记录将只是获取锁并将某些内容插入列表。仅给定两个订阅者,您不应该花费大量时间来获取互斥锁。

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

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

请注意,如果您(根本)不使用交换,解决此问题的最短路径可能是实现您自己的日志记录。

于 2010-04-26T07:38:46.613 回答