我有一个应用程序,它定期(每 1 或 2 秒后)通过分叉自身来获取检查点。因此,检查点是原始进程的一个分支,它一直保持空闲状态,直到原始进程发生某些错误时被要求启动。
现在我的问题是fork的写时复制机制的成本有多大。每当原始进程写入内存页面(即在获取检查点后第一次)时,页面错误陷阱的成本是多少,因为写时复制机制将确保它为原始进程提供了与检查点不同的物理页。
在我看来,当发生中断时,页面错误陷阱开销可能会相当高,我们从用户空间着陆到内核空间着陆,然后从内核返回到用户空间。这样的页面错误陷阱可能会丢失多少个 CPU 周期。假设 RAM 足够大,并且我们不需要交换到硬盘。
好吧,我知道很难想象一个检查点方案比这更有效,因此你可以说为什么我担心页面陷阱错误开销,但我只是想知道这个方案的成本是多少。
您可以自己进行粗略的数学计算,进行有根据的猜测。假设没有磁盘访问(约 100 亿个周期),您必须考虑
- 陷阱和返回需要 160 个周期(大约在 x86_64 上)
- 有效性检查、配额、会计等等(未知,可能几百到一千个周期)
- aligned
memcpy
4096 字节,大约 500-800 个周期
- TLB 失效(首次访问时增加 10-100 个周期)
- 要么驱逐other缓存数据或一次保证的缓存未命中(80-400 个周期),具体取决于
memcpy
。一种或另一种更好对您的访问模式非常重要。
总而言之,我们谈论的是大约 2000 个周期的情况,其中一些影响(例如 TLB 和缓存影响)分散开来,并且不会立即可见。 Omondi 和 Sedukhin 早在 2003 年就报告了 P-III 的 1700 个周期,这与这一估计一致。
请注意,如果该页以前从未被写入过,则根据 L. Torvalds 在 2000 年的评论,情况会略有不同。零页上的写时复制未命中会从池中拉出另一个零页,并且不会复制零。不过,这也几乎可以保证缓存未命中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)