【问题标题】:very interesting result from latency test of IPC on Linux 2.6.18Linux 2.6.18 上 IPC 延迟测试的非常有趣的结果
【发布时间】:2014-03-01 09:37:05
【问题描述】:

我正在 linux 2.6.18 下对 unix socket 进行性能(延迟)测试,
进程 A 每 10 ms 向进程 B 写入 1024 个字节,结果显示平均延迟为 20 us,标准差很小(2~3 us)。

当我与进程 A&B 同时运行一些额外的 CPU 绑定进程时,测试变得很有趣,这些新进程对缓存非常友好,例如简单数学计算的繁忙循环,但结果令我惊讶的是,IPC 延迟突然下降,平均变成15个我们。

据我所知,为了提高交互性,O(1) 调度程序(2.6.23 之前的 2.6)通过一些启发式方法奖励 IO-bound 进程,但这不能解释为什么速度甚至比第一种情况。

我也考虑过,如果Linux在进程A得到奖励的时候做一些busy-loop的特殊情况,但似乎没有进一步测试。

这真的让我很困惑。


我的配置: CPU:Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz,带 10M L3 高速缓存 内存:32G 操作系统:Linux 2.6.18-308.el5 SMP x86_64

【问题讨论】:

  • 如果你使用更新的东西呢? kernel.org/finger_banner
  • 好的,我尝试在更新的 Linux 上测试它以进行比较。
  • 我想性能提升来自某种空间局部性,因为这些进程的工作集不是那么大,所以内核可以读/写数据'从 DRAM'/'到缓存'一枪。
  • 也许“动态频率缩放”就是答案,就像英特尔® 按需切换一样:“一种电源管理技术,其中微处理器的施加电压和时钟速度保持在最低必要水平,直到需要更多的处理能力。这项技术是作为英特尔 SpeedStep® 技术引入服务器市场的。”
  • 运行powertop,看看在省电状态下花费了多少时间。

标签: c++ c linux performance low-latency


【解决方案1】:

我怀疑硬件的一些省电功能在这里起作用。 10ms 的睡眠时间足以让现代硬件进入低功耗状态。当您在微秒级查看事物时,从省电状态中退出会有一个真实的、可测量的延迟。

我的猜测是并行运行“忙碌”程序会阻止硬件进入低功耗状态。标准的尝试:

  • 在 BIOS 级别禁用所有节能功能,包括 C 状态
  • 在操作系统级别,禁用 cpuspeed(或您的发行版使用的任何频率缩放程序)
  • 尝试使用“idle=poll”内核参数引导

最后一个建议对于 Sandy Bridge CPU(这是你所拥有的)尤其重要,至少对于 RHEL/CentOS 5.x(我猜你正在运行)。我发现 Linux 内核仍然会覆盖一些 BIOS 设置。其他可能对您有所帮助的 Linux 内核参数:

  • intel_idle.max_state=0
  • processor.max_cstate=0

【讨论】:

  • 感谢您的精彩解释。
猜你喜欢
  • 2016-08-07
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2018-09-27
  • 1970-01-01
  • 2020-09-18
  • 2020-08-27
相关资源
最近更新 更多