并发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.代码是怎么写的,你用futures
和promises
吗。 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”数据库(没有经验)。
最后,如果您确实必须在每个用户的实例化时预加载数据,请尝试将其减少到最低限度并尽可能简化它。如果您的数据是例如分层,您可以考虑仅预加载***别,然后在需要时加载较低级别(例如,使用 futures
和 promises
)。
类似的建议也适用于其他数据类型 - 只加载需要的内容,修剪脂肪(你真的需要从一开始就处理这些数据吗?),也许你的一些预先计算实际上可以通过在需要时即时计算。
脚注:
1:请注意,docker 容器只占用它们需要的内存,它们不会仅仅因为它们启动就分配一块内存。
[2]:然而,我注意到我在 Chrome 的两个不同选项卡中访问的应用程序被重定向到同一个容器。因此,用户可能并不总是被孤立。
【讨论】:
至脚注 2:我想如果您在同一个浏览器的 2 个选项卡上打开 shinyApp,您仍然只是 ShinyProxy 的 1 个用户。尝试用 2 个不同的浏览器打开应用,我想你会看到 2 个容器。 @SeGa 我同意。我只是想指出两个“用户”/“会话”严格来说不会导致两个独立的容器。以上是关于并发shinyapp 用户如何使用shinyproxy 和shiny 服务器上的内存和磁盘空间?的主要内容,如果未能解决你的问题,请参考以下文章