OpenCPU 中的高内存使用率

High memory usage in OpenCPU

R requires CPU more than anything else so it is recommended to pick one of the newer generation compute optimized instance types, preferably with a SSD disk.

我最近 运行 遇到负载测试期间内存使用率过高(迅速上升到 100%)的问题。重现:有一个 R 包,其处理时间在无压力条件下可达 0.2。如果我试图在 3 台机器上并行查询使用 curl 的 1000 个 json 的端点之一,所有内存都会突然被使用,这会导致 'cannot fork' 或:

cannot popen '/usr/bin/which 'uname' 2>/dev/null', probable reason 'Cannot allocate memory' In call: system(paste(which, shQuote(names[i])), intern = TRUE, ignore.stderr = TRUE)

设置是 2x AWS 8GB CPU-优化服务器 + 负载均衡器,全部在专用网络中。 HTTPS 已启用,我的主要用途是在线处理请求,因此我主要查询 /json 个端点。

您对如何处理这个问题有什么建议吗?计划是安装更多包(更多在线进程请求各种功能的结果)并且不希望最终每个盒子有 32GB RAM。

所有包都使用以下选项部署:

LazyData: false
LazyLoad: false

它们也被添加到 serverconf.yml.j2 - 预加载部分。 RData 文件通过调用 utils::data.

onLoad 函数中加载

此外,请记住我使用的是没有 github 的 OpenCPU 并且只有单向通信(从后端到 ocpu 盒)你建议打开哪些选项 on/optimize?文档中还没有明确说明。

这主要取决于您使用的软件包以及您在做什么。您能否 运行 与您在本地(在命令行中)通过 opencpu 调用的相同功能而不会 运行 内存不足?

Apache2 prefork 创建工作进程来处理并发请求。这些工人中的每一个都包含一个 R 进程,所有预加载 包裹。因此,如果一个请求需要 500mb,则总内存 服务器上的消费是 n * 500,其中 n 是工作人员的数量 已加载。

根据您期望的并发请求数,您可以尝试 在您的 apache2 配置中降低 StartServers or MaxRequestWorkers

同时尝试提高(或降低)文件 /etc/opencpu/server.conf 中的选项 rlimit.as 以限制 单个进程的内存量(地址 space)允许消费