当前位置: 首页 > 面试题库 >

在Linux上更快地分叉大型进程?

海鸣
2023-03-14
问题内容

在现代Linux上, 从大型过程 中获得与a fork- execvecombo 相同的效果的最快,最好的方法是什么? __

我的问题是流程分叉的大小约为500 MB,而简单的基准测试只能从该流程中获得约50个forks / s(相对于最小规模的流程而言约为1600叉/
s),这对于预期的应用而言太慢了。

有人将Google搜索vfork作为解决此问题的方法而发明了……但同时也警告不要使用它。现代Linux似乎已经获取的相关cloneposix_spawn电话;
这些可能有帮助吗?现代替代品是vfork什么?

我在i7上使用的是64位Debian Lenny(如果posix_spawn有帮助,该项目可以移至Squeeze )。


问题答案:

结果
:我将按照此处其他答案的建议采用早期产生的帮助程序子过程路线,但是随后我遇到了这种重新使用巨大页面支持来提高fork性能的问题。

自己尝试使用libhugetlbfs来使所有应用程序的malloc分配巨大的页面后,
无论进程大小如何 (无论如何,我都对这个范围感兴趣),我现在的速度都达到2400 forks / s 。惊人。



 类似资料:
  • 问题内容: 是否可以在一个执行序列中将“ PROGRAM”的完整分支创建为两个子程序来执行? 产生的子程序完全相同。它们具有相同的执行顺序和值,但是现在它们是两个不同的程序。这就像创建对象的克隆,从而为我们提供了两个相同类型的不同对象一起使用。但是在这里,我们不仅要创建对象和某些值,还要创建一个已经在JVM中加载的程序的完全并行执行序列(对于Java,希望使用此答案)。 问题答案: 您似乎正在寻找

  • 问题内容: 我在写一些代码,但一直崩溃。后来,在挖掘转储之后,我意识到我正在超出最大堆限制(如果我在malloc上添加了检查,生活会更轻松)。尽管我已解决问题,但是有什么办法可以增加堆大小? 问题答案: 堆通常与体系结构上可寻址的虚拟内存一样大。 您应该使用命令检查系统的当前限制,并找到这行最大值,在我的OpenSuse 11.4 x86_64上,此行具有约3.5 GiB的ram,表示每个进程大约

  • 问题内容: 我想派生多个进程,然后在它们上使用一个信号灯。这是我尝试过的: 输出为: 显然,这意味着信号灯没有按预期的方式工作。您能解释一下我应该如何在分支进程中使用信号量? 问题答案: 您面临的问题是对功能的误解。阅读手册页时, 您将看到以下内容: pshared参数指示此信号量是在进程的线程之间还是在进程之间共享。 如果您到此为止都读完了,您将认为pshared的非零值将使信号量成为进程间信号

  • 这显然意味着信号量没有正常工作。你能解释一下我应该如何在分叉进程上使用信号量吗?

  • 问题内容: 在Linux上,在C ++应用程序进程之间发送消息的最快技术是什么?我隐约知道桌上有以下技巧: TCP协议 UDP协议 插座 管子 命名管道 内存映射文件 还有更多的方法,最快的是什么? 问题答案: 基本上,我在一台计算机上进行IPC时会丢弃诸如TCP和UDP之类的网络协议。这些具有打包开销,并且绑定到甚至更多的资源(例如端口,环回接口)。

  • 我的进程在linux服务器上被杀,无需人工干预。我已经验证了以下场景。 用户或管理员均未进行手动干预以杀死 该进程占用16.5GB的虚拟内存,其中RAM为16GB,交换为50GB。 任务:总共393个,2个跑步,387个睡觉,4个停止,0个僵尸 Cpu:12.8%us,0.5%sy,0.0%ni,86.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st 内存:总共16015M,使用8