我有一个在Atmel AT91SAM9260EK板上运行的嵌入式Linux系统,我有两个进程以实时优先级运行。管理器进程使用POSIX消息队列定期“ping”工作进程,以检查工作进程的运行状况。 通常往返ping大约需要1毫秒,但偶尔需要更长时间 - 大约800毫秒。没有其他流程以更高的优先级运行。
看来停顿可能与日志记录(syslog)有关。如果我停止记录问题似乎消失了。但是,如果日志文件位于JFFS2或NFS上,则没有任何区别。没有其他进程写入“磁盘” - 只是syslog。
我可以使用哪些工具来帮助我找出这些档位发生的原因?我知道等待时间并将使用它。还有其他一些可能更有用的工具吗?
一些细节:
答案 0 :(得分:2)
问题是(如你所说)syslogd。当您的进程以RT优先级运行时,syslogd 不是。此外,syslogd不会锁定其堆,并且可以(并且将)被内核分页,特别是对于很少的“客户”。
你可以尝试的是:
启动另一个线程来管理优先级队列,让该线程与syslog通信。然后记录只是获取一个锁并在列表中插入一些东西。如果只有两个订阅者,则不应该花费大量时间来获取互斥锁。
不使用syslog,实现自己的日志记录(基本上是第一个建议,减去与syslog的对话)。
我有类似的问题,我第一次尝试修复它是修改syslogd本身来锁定它的堆。那是一场灾难。然后我尝试了rsyslogd,它改进了一些,但我仍然有随机延迟峰值。我最后使用优先级队列来实现自己的日志记录,以帮助确保首先实际写入更多关键消息。
注意,如果您没有使用swap(根本没有),修复此问题的最短路径可能是实现您自己的日志记录。