什么是“金丝雀线”,为什么它会挨饿?

以下偶尔会出现在/var/log/syslog

 rtkit-daemon[1145]: The canary thread is apparently starving. Taking action. rtkit-daemon[1145]: Demoting known real-time threads. rtkit-daemon[1145]: Successfully demoted thread 1431 of process 1368 (n/a). rtkit-daemon[1145]: Successfully demoted thread 1430 of process 1368 (n/a). rtkit-daemon[1145]: Successfully demoted thread 1368 of process 1368 (n/a). rtkit-daemon[1145]: Demoted 3 threads. 

这里发生了什么?

这里使用的术语“金丝雀”最初来自采煤 。 煤矿工人使用金丝雀来探测危险气体(如果他们携带的金丝雀死亡,他们知道他们必须尽快离开井/矿井)。 因此,“金丝雀”这个术语现在经常被用于任何你用来获得危险情况(早期)警告的东西。

在这种情况下, 似乎 ‘rtkit’启动一个“正常”线程来测试获得“实时”优先级的线程是否“挨饿”其他线程(和进程),其中“饥饿”意味着它们获得的处理器时间太少。 这是一种安全措施,可确保有权访问实时优先级的进程/线程不会耗费太多CPU时间,而其他任务不再需要。

显然,从rtkit获得实时优先级的一些线程是错误的,并试图垄断CPU,rtkit用它的“canary线程”检测到这一点,因此rtkit消除了实时优先级。

这是缓冲区溢出

维基百科缓冲溢出金丝雀

我无法从你发布的问题所在的日志中看出来,你能检查或粘贴上面这些消息的日志条目吗? 什么是流程1368?

 sudo ps -p 1368