并发shinyapp 用户如何使用shinyproxy 和shiny 服务器上的内存和磁盘空间?

Posted

技术标签:

【中文标题】并发shinyapp 用户如何使用shinyproxy 和shiny 服务器上的内存和磁盘空间?【英文标题】:How do concurrent shinyapp users use memory and disk space on shinyproxy and shiny server? 【发布时间】:2019-12-13 02:34:22 【问题描述】:

我在虚拟机上的闪亮代理服务器上托管了我的 dockerized shiny 应用程序(16G 内存和 100G 磁盘空间)。 该应用程序适用于 20 多个并发用户。据我所知,shinyproxy 的工作方式是为每个用户创建一个 docker 实例。所以理论上它们不应该互相干扰。

我的问题是关于并发用户如何消耗服务器的内存和磁盘空间。

    为了使应用程序更具响应性,我的应用程序将我的所有数据加载到内存中。每个实例都有自己的数据副本吗?假设我加载的数据为 100 mb。对于 20 个并发用户,服务器内存至少要 2GB 才能加载数据?如果每个 docker 实例为 1GB,那么对于 20 个并发用户,服务器上的总内存至少需要 20GB?是这样的吗?

    闪亮的服务器专业版怎么样?如果我在闪亮的服务器专业版上托管我的应用程序,而不是闪亮代理,服务器上的应用程序是否只加载一次数据,每个用户都可以通过自己的会话访问数据?当打开一定数量的并发会话时,用户是否会看到他们的会话变慢?

我是闪亮应用部署的新手。如果有人能就这些概念向我澄清,不胜感激。

【问题讨论】:

不能代表 Shinyproxy,但在闪亮的服务器上,Global.R 中加载的所有数据都在实例级别加载。在server.R 中加载的数据处于会话级别。取决于许多因素,用户体验可能会变慢。 1.代码是怎么写的,你用futurespromises吗。 2. 每个实例连接了多少用户? 3.每次操作需要多长时间?rstudio.github.io/promises/articles/shiny.html,shiny.rstudio.com/articles/scaling-and-tuning.html. 有人可以评论我关于 Shinyproxy 的第一个问题吗? 我不确定,但您可以尝试使用tracemem(),有关共享内存分析,请参阅帮助页面中的示例部分。但是,这是在同一会话中。我手头没有闪亮代理服务器,所以我无法测试它。我会争辩说,如果tracemem 在用户之间返回相同的值,则强烈表明它是共享的。但它不会反过来争论,... 如果不想建立数据库的一个选项:将数据作为原始数据放在一个包中,并且只使用sqldf之类的东西访问它的相关部分。 etl 包可能也很有趣:github.com/beanumber/etl 【参考方案1】:

对于 Shiny Proxy,据我所知,是的,20 个用户将启动 20 个容器,每个容器占用 1 GB 内存1

而且,由于 20 个用户中的每个用户都在各自的容器中被隔离,因此无论您在 global.R 中或在 server 函数之外做什么,用户(大多数2)都不会不会互相影响。

有一些选项可以在 docker 容器之间共享内存,但这是非常高级的东西 (see this article)。

根据预加载数据的数据结构,您可以考虑将数据移动到数据库中,以便在需要时从中提取数据。这可能是安装卷中的 SQLite 文件,或者在您的机器上与 ShinyProxy 一起使用 mysql 启动 docker 容器。如果您的数据结构不适合 SQL 数据库,则可以选择所谓的“NoSQL”数据库(没有经验)。

最后,如果您确实必须在每个用户的实例化时预加载数据,请尝试将其减少到最低限度并尽可能简化它。如果您的数据是例如分层,您可以考虑仅预加载***别,然后在需要时加载较低级别(例如,使用 futurespromises)。 类似的建议也适用于其他数据类型 - 只加载需要的内容,修剪脂肪(你真的需要从一开始就处理这些数据吗?),也许你的一些预先计算实际上可以通过在需要时即时计算。

脚注:

1:请注意,docker 容器只占用它们需要的内存,它们不会仅仅因为它们启动就分配一块内存。

[2]:然而,我注意到我在 Chrome 的两个不同选项卡中访问的应用程序被重定向到同一个容器。因此,用户可能并不总是被孤立。

【讨论】:

至脚注 2:我想如果您在同一个浏览器的 2 个选项卡上打开 shinyApp,您仍然只是 ShinyProxy 的 1 个用户。尝试用 2 个不同的浏览器打开应用,我想你会看到 2 个容器。 @SeGa 我同意。我只是想指出两个“用户”/“会话”严格来说不会导致两个独立的容器。

以上是关于并发shinyapp 用户如何使用shinyproxy 和shiny 服务器上的内存和磁盘空间?的主要内容,如果未能解决你的问题,请参考以下文章

R shiny教程-2:布局用户界面

R:在已部署的 ShinyApp 中仅加载一次 .RData

具有动态变量选择的 shinyApp 中的回归

从 Shiny 发送附件

在 ShinyApp 中使用下载处理程序下载数据时出现问题

在 https 模式下运行 shinyapp