谁在 OpenCPU 中管理(创建、分配内存等)R 会话/R 进程?

Who manages (creates, allocates memory, etc.) R sessions / R processes within OpenCPU?

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

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

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

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

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

回答您的问题:

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