运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

为什么分叉会减慢我的申请速度

运维开发网 https://www.qedev.com 2020-07-05 12:21 出处:网络
我的应用程序通过使用fork系统调用每隔几百毫秒获取一个检查点.但是,我注意到使用检查点(分叉)时我的​​应用程序显着减慢.我测试了fork调用所花费的时间,结果是1到2毫秒.那么为什么fork会大大减慢我的应用程序.请注
我的应用程序通过使用fork系统调用每隔几百毫秒获取一个检查点.但是,我注意到使用检查点(分叉)时我的​​应用程序显着减慢.我测试了fork调用所花费的时间,结果是1到2毫秒.那么为什么fork会大大减慢我的应用程序.请注意,我一次只保留1个检查点(分叉进程),并且每当我拿一个新检查点时都会终止前一个检查点.另外,我的电脑有一个巨大的RAM.

请注意,我的分叉进程在创建后就会休眠.只有在需要进行回滚时才会被唤醒.因此,它不应由操作系统安排.我想到的一件事是,由于fork是一种写时复制机制,每当我的应用程序修改页面时都会出现页面错误.但是,这应该显着减缓应用程序的速度吗如果没有检查点(分叉),我的应用程序将在大约3.1秒内完成,使用它大约需要3.7秒.有什么想法,什么减慢了我的申请?

正如您所假设的那样,您可能正在观察写时复制机制的成本.这实际上非常昂贵 – 这也是vfork仍然存在的原因. (主要成本不是额外的页面错误本身,而是触及的每个页面的memcpy,以及相关的缓存和TLB刷新.)它没有显示为fork的成本,因为页面错误不会发生在内部系统调用.

您可以通过查看getrusage报告的时间来确认假设 – 如果这是正确的,则额外的时间应该几乎都是“系统”时间(内核中的CPU烧毁). oprofile或perf会让你更具体地解决这个问题…如果你可以让它们完全工作,这是非常重要的,唉.

不幸的是,写时复制也是您的检查点机制首先工作的原因.您能否以较长的间隔离开检查站?这是我能想到的唯一快速解决方案.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号