12

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

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

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

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

4

1 回答 1

16

您可以自己进行粗略的数学计算以进行有根据的猜测。假设没有磁盘访问(约 100 亿个周期),您必须考虑

  • 陷阱和返回 160 个周期(大约,在 x86_64 上)
  • 有效性检查、配额、会计等等(未知,可能几百到一千个周期)
  • 对齐memcpy4096 个字节,大约 500-800 个周期
  • TLB 失效(首次访问时增加 10-100 个周期)
  • 根据. _ _ memcpy一种或另一种更好,这对您的访问模式很重要。

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

请注意,如果该页面以前从未被写入过,那么根据 L. Torvalds 在 2000 年的评论,情况会略有不同。零页上的写时复制未命中会从池中拉出另一个零页,并且不会复制零。不过,这也几乎可以保证缓存未命中。

于 2012-04-19T11:56:12.480 回答