我有一个在 Atmel AT91SAM9260EK 板上运行的嵌入式 Linux 系统,其中有两个进程以实时优先级运行。管理器进程使用 POSIX 消息队列定期“ping”工作进程,以检查工作进程的运行状况。通常,往返 ping 需要大约 1 毫秒,但极少数情况下需要更长的时间 - 大约 800 毫秒。没有其他进程以更高的优先级运行。
看来停顿可能与日志记录(syslog)有关。如果我停止记录,问题似乎就会消失。但是,日志文件位于 JFFS2 或 NFS 上并没有什么区别。没有其他进程正在写入“磁盘”——只有系统日志。
我可以使用哪些工具来帮助我找出发生这些停顿的原因?我知道 Latencytop 并将使用它。还有其他一些可能更有用的工具吗?
一些细节:
- 内核版本:2.6.32.8
- libc(系统日志函数):uClibc 0.9.30.1
- 系统日志:busybox 1.15.2
- 没有配置交换空间[在编辑中添加]
- 根文件系统位于 tmpfs 上(从 initramfs 加载)[在编辑中添加]
问题是(正如你所说)syslogd。当您的进程以 RT 优先级运行时,syslogd 会not。此外,syslogd 不会锁定其堆,并且可以(并且将会)被内核调出页面,尤其是在“客户”很少的情况下。
你可以尝试的是:
我遇到了类似的问题,我第一次尝试修复它是修改 syslogd 本身以锁定其堆。那是一场灾难。然后我尝试了 rsyslogd,它改进了一些,但我仍然遇到随机延迟峰值。我最终只是使用优先级队列来实现我自己的日志记录,以帮助确保更重要的消息实际上首先被写入。
请注意,如果您(根本)不使用交换,解决此问题的最短路径可能是实现您自己的日志记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)