页面错误陷阱的成本

pyt*_*nic 9 c linux memory-management x86-64

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

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

在我看来,页面错误陷阱的开销可能是因为发生中断时相当高,我们从用户空间的土地到内核空间耕地的土地,然后再从内核到用户空间.我可以从这样的页面错误陷阱中丢失多少CPU周期.假设RAM足够大,我们不需要交换到硬盘.

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

Dam*_*mon 11

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

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

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

请注意,如果以前从未写过该页面,那么根据L.Torvalds在2000年发表的评论,情况略有不同.零页面上的写时复制错过从池中拉出另一个零页面而不是复制零.不过,这几乎也是保证缓存未命中的原因.