页面错误陷阱的成本

时间:2012-04-19 07:44:59

标签: c linux memory-management x86-64

我有一个应用程序,它定期(在每1或2秒后)通过分叉来获取检查点。因此,检查点是原始进程的一个分支,只有在原始进程发生某些错误时才会被要求启动,它才会保持空闲状态。

现在我的问题是fork的copy-on-write机制有多昂贵。每当原始进程写入内存页时(第一次在获取检查点之后)将发生页错误陷阱的成本,因为写时复制机制将确保它给原始进程a与检查点不同的物理页面。

在我看来,当中断发生时,页面错误陷阱开销可能非常高,我们从用户空间着陆到内核空间域然后从内核返回到用户空间。我可以从这样的页面错误陷阱中丢失多少CPU周期。假设RAM足够大,我们不需要交换到硬盘。

我知道很难想象一个检查点方案比这更有效,因此你可以说为什么我担心页面陷阱错误开销,但我只是想知道会有多少成本对于这个计划。

1 个答案:

答案 0 :(得分:11)

你可以自己做一个有教养的猜测的粗略数学。假设没有磁盘访问(约100亿个周期),您必须考虑

  • 陷阱的160个循环并返回(大约在x86_64上)
  • 有效性检查,配额,会计等等(未知,可能是几百到一千个周期)
  • 对齐memcpy 4096字节,大约500-800个周期
  • TLB失效(首次访问时增加10-100个周期)
  • 根据memcpy的实现,驱逐其他缓存数据或一个保证缓存未命中(80-400个周期)。对于您的访问模式而言,重要的是一个或另一个是否更好。

总而言之,我们谈论的是大约2000个周期的事情,其中​​一些效果(例如TLB和缓存效果)被展开并且不会立即可见。 Omondi和Sedukhin在2003年报告了P-III的1700个周期,这与此估计一致。

请注意,如果以前从未写过该页面,那么根据L.Torvalds在2000年发表的评论,情况会略有不同。零页面上的写时复制错过了来自池的另一个零页面不复制零。不过,这几乎也是一种有保证的缓存缺失。