使用 ubuntu 15.04 我发现每 1000 微秒就会出现大约 10-11 微秒的抖动。
我绘制了 i7-3970X 上至少 1 微秒的跳转分布图,Ubuntu 15.04 具有低延迟。该程序在 RDTSC 上旋转并将跳转记录到数组中,以便在最后打印。
似乎有两种模式,分别为 1 毫秒和大约 60 - 75 微秒。
有时候数百毫秒内都不会出现这种抖动。
我在用
linux /boot/vmlinuz-3.19.0-22-lowlatency root=UUID=f5747871-dfe2-46bf-b6e5-a6cd474adaf7
ro quiet splash isolcpus=2,3,8,9 $vt_handoff
我正在绑定到隔离的 CPU 2。IrqBalance 已关闭。我的电源管理设置为性能。我试过使用,chrt
但这没有帮助。
有人认识到这种行为吗?有没有办法知道如何诊断并修复它?
我所做的只是在一个 CPU 上旋转 RDTSC。
编辑:我也尝试添加,intel_pstate=disable
但这似乎没有帮助。
@mjpt777 建议我看一下idle=poll
,乍一看,情况变得更糟,但从最糟糕的 50% 延迟来看,情况有了很大的改善。
使用idle=poll
,绘制延迟的长度
这显然是内核正在做的事情。这可以进一步调整吗?也就是说,它必须每毫秒发生一次吗?Linux 应该是无滴答的,但它似乎不是完全无滴答的。
$ grep NO_HZ /boot/config-3.19.0-22-lowlatency
CONFIG_NO_HZ_COMMON=y
CONFIG_NO_HZ_IDLE=y
# CONFIG_NO_HZ_FULL is not set
CONFIG_NO_HZ=y
CONFIG_RCU_FAST_NO_HZ=y
我已经添加了nohz_full=
,rcu_nocbs=
这些似乎有帮助,但抖动的频率并没有改变。
@DougSmythies 建议我恢复到通用内核,这显著减少了中断的数量和长度。
这是中断之间的空间示例(请注意,它们并非全部都是 4000 微秒,并且它们的长度较短)请参阅我的回答。
答案1
看起来在这种情况下,-generic
内核的虚假中断比-lowlatency
内核少。启动命令行参数和机器相同。
在 85 秒内,低延迟内核中断测试 85K 次,而通用内核中断测试 7K 次。此外,中断长度更短。
低延迟内核始终高于 2.5 微秒,而通用内核约有 20% 的时间高于 2 微秒。