页面错误陷阱的成本

我有一个应用程序定期(每1或2秒后)通过分叉自己的检查点。 所以检查点是原始进程的一个分支,它只是保持空闲,直到在原始进程中出现错误时要求启动。

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

在我看来,页面错误陷阱开销可能会相当高,因为中断发生时,我们从用户空间降落到内核空间,然后从内核回到用户空间。 我可以从这样的页面错误陷阱中损失多lessCPU周期。 假设RAM足够大,我们不需要交换到硬盘。

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

Solutions Collecting From Web of "页面错误陷阱的成本"

你可以自己做一个受过教育的猜测。 假设没有磁盘访问(〜100亿个周期),你必须考虑

  • 陷阱和返回的160个周期(大约在x86_64上)
  • 有效性检查,配额,会计和什么(不知道,可能几百到几千个周期)
  • 对齐的4096字节的memcpy ,约500-800个周期
  • TLB失效(首次访问时增加10-100个周期)
  • 或者驱逐其他缓存的数据或者保证缓存未命中(80-400个周期),这取决于memcpy的实现。 无论您的访问模式如何,访问模式都很重要。

总而言之,我们正在讨论大约2000个周期的事情,其中​​一些影响(例如TLB和缓存效应)被分散开来,而不是立即可见。 Omondi和Sedukhin在2003年报告了P-III 1700个周期,这与这一估计一致。

请注意,如果页面以前从未写入过,根据2000年的L. Torvalds的评论,事情会稍有不同。零页上的写入时复制缺失会从池中拉出另一个零页,而不会复制零。 但是,这也是一个有保证的缓存未命中。