Linux
发布时间:2022-03-31 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么分叉会减慢我的申请速度,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
我的应用程序
通过使用fork系统调用每隔几百毫秒获取一个检查点.但是,我注意到使用检查点(分叉)时我的应用程序显着减慢.我测试了fork调用所花费的时间,结果是1到2毫秒.那么为什么fork会大大减慢我的应用程序.请注意,我一次只保留
1个检查点(分叉进程),并且每当我拿一个新检查点时都会终止前一个检查点.另外,我的电脑有一个巨大的RA
m. 请注意,我的分叉进程在
创建后就会休眠.只有在需要进行回
@H_
944_13@
我的应用程序
通过使用fork系统
调用每隔几百毫秒
获取一个检查点.但是,我注意到使用检查点(分叉)时我的应用程序显着减慢.我测试了fork
调用所花费的时间,结果是1到2毫秒.那么为什么fork会大大减慢我的应用程序.请注意,我一次只保留
1个检查点(分叉进程),并且每当我拿
一个新检查点时都会终止前
一个检查点.另外,我的电脑有
一个巨大的RA
m.
请注意,我的分叉进程在创建后就会休眠.只有在需要进行回滚时才会被唤醒.因此,它不应由操作系统安排.我想到的一件事是,由于fork是一种写时复制机制,每当我的应用程序修改页面时都会出现页面错误.但是,这应该显着减缓应用程序的速度吗如果没有检查点(分叉),我的应用程序将在大约3.1秒内完成,使用它大约需要3.7秒.有什么想法,什么减慢了我的申请?
正如您所假设的那样,您可能正在观察写时复制机制的成本.这实际上非常昂贵 – 这也是vfork仍然存在的原因. (主要成本不是额外的
页面错误本身,而是触及的每个
页面的mem
cpy,以及相关的缓存和TLB刷新.)它没有
显示为fork的成本,因为
页面错误不
会发生在内部系统
调用.
您可以通过查看getrusage报告的时间来确认假设 – 如果这是正确的,则额外的时间应该几乎都是“系统”时间(内核中的cpu烧毁). oprofile或perf会让你更具体地解决这个问题…如果你可以让它们完全工作,这是非常重要的,唉.
不幸的是,写时复制也是您的检查点机制首先工作的原因.您能否以较长的间隔离开检查站?这是我能想到的唯一快速解决方案.