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

谁在OpenCPU中管理(创建、分配内存等)R会话/R进程?,r,apache,opencpu,rapache,R,Apache,Opencpu,Rapache,我们有一个OpenCPU云服务器,安装在带有Apache2.0和rApache的RedHat服务器上,它运行一些相当内存和处理密集的计算。我们的应用程序运行得相当慢(比功能较弱的笔记本电脑慢)——我们认为这是因为服务器上的内存分配。 出于这个原因,我们为服务器并行化了应用程序(使用parallel包),但即使通常一个人可以在服务器上运行多个(超过20个)并行R作业,我们的应用程序也只能运行18个左右 为了理解发生了什么,我的问题是:当我通过OpenCPU web界面调用R函数时,服务器的哪个组件

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

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


我阅读了OpenCPU文档,rApache文档,所有关于OpenCPU的stackoverflow问题,但是我没有理解R进程是如何管理的。抱歉,如果我遗漏了什么,如果有人能告诉我这些信息的来源,我将非常感激。

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

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

回答你的问题:

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

你好,Jeroen,非常感谢您的详细回答。我是否理解正确:Prefork(Apache模块)控制每个子进程的创建以及内存分配,如果子进程太多,这可能会限制其他子进程的资源?至于包的预加载,我们记录了我们的进程,我认为这花费的时间可以忽略不计——最花时间的是从SQL数据库加载和处理数据,所以可能是其他空闲子进程的存在减缓了速度。我不理解你的问题。任何程序都会分配所需的内存量,除非系统内存不足,否则操作系统可能会终止进程。如果您运行的worker太多,您可能会耗尽内存,但这将导致http 500错误,而不是缓慢。您的函数是否返回或打印大量数据?由于opencpu序列化并保存会话输出,因此可能会产生开销。我认为R会话在某种程度上受到限制,这些进程无法从操作系统分配任意数量的内存,因此这可能是导致速度减慢的原因,我认为这可能是通过一些Apache2参数控制的。因此,如果有太多的子进程拥有自己的内存,并且这限制了一个R会话所需的内存,那么会出现错误而不是减慢速度?我的功能是打印日志并最终返回一个大数据帧,但我认为日志并不是那么多,而且会话在数据输出之前很久就慢了,而是在从DB导入数据时慢了。你说“启动时,每个apache2工作进程启动一个新的私有R进程。”-你说的这是什么意思,启动什么?OpenCPU的启动?提前谢谢你的帮助。