1

我们有一个 OpenCPU 云服务器,安装在带有 Apache 2.0 和 rApache 的 RedHat 服务器上,它运行一些相当消耗内存和处理密集型的计算。我们的应用程序运行得相当慢(比在功能较弱的笔记本电脑上慢) - 我们认为这是因为服务器上的内存分配。出于这个原因,我们为服务器并行化了应用程序(使用parallel包),但即使通常可以在服务器上运行许多(超过 20 个)并行 R 作业,我们的应用程序也只能运行大约 18 个。

为了了解发生了什么,我的问题是:当我通过 OpenCPU Web 界面调用 R 函数时,服务器的哪个组件创建/生成 R 进程并管理它们的内存分配?是r_mod通过其他模块还是 Apache 服务器本身?MPM 对此有影响吗Prefork(基于此答案)?这项工作的哪一部分是由 OpenCPU 完成的?

我阅读了 OpenCPU 文档、rApache 文档以及有关 OpenCPU 的所有 stackoverflow 问题,但我没有设法了解如何特别管理 R 进程。抱歉,如果我错过了什么,如果有人能指出这些信息的来源,我将不胜感激。

4

1 回答 1

3

缓慢可能是由于应用程序需要未预加载的包,因此需要为每个请求一次又一次地加载它们。

为了加快速度,请尝试将您的包添加到preloadin/etc/opencpu/server.conf或添加预处理 R 代码以/etc/opencpu/Rprofile加载所需的包/数据。

回答你的问题:

  • Apache2 prefork 维护一个工作进程池。池的大小n可在 Apache 中使用StartServersMinSpareServersMaxSpareServersMaxRequestWorkers等进行配置。因为每个 R 工作人员都使用大量资源,所以不应将其设置得太高。
  • 启动时,每个 apache2 工作进程都会启动一个新的私有 R 进程。然后每个 R 进程加载 opencpu 包及其依赖项、preload包和运行/etc/opencpu/Rprofile。因此,总的来说,它使用n的内存量是在 R 中加载这些东西所需的内存量的倍数。
  • 每个请求都在一个随机的工作人员中执行,在一个临时的沙箱分叉中。如果请求需要未预加载的 R 包,则必须按需加载。这使得请求变慢。
  • 一旦请求完成,临时沙箱分叉就会被杀死并清理工作人员。
于 2019-06-07T10:14:43.313 回答