并发的闪亮应用程序用户如何使用闪亮代理和闪亮服务器上的内存和磁盘空间?

zes*_*sla 10 r shiny shiny-server shinyproxy

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

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

  1. 为了提高应用程序的响应速度,我的应用程序将所有数据加载到内存中。每个实例是否都有自己的数据副本?说,如果我加载的数据是100 mb。对于20个并发用户,仅用于数据加载的服务器内存就必须至少2GB?如果每个Docker实例为1GB,那么对于20个并发用户,服务器上的总内存至少需要为20GB?这样行吗?

  2. 那闪亮的服务器专业版呢?如果我将应用程序托管在Shiny Server Pro上而不是Shinyproxy,服务器上的应用程序是否仅加载一次数据,每个用户都可以使用自己的会话访问数据?打开一定数量的并发会话时,用户是否看到其会话速度变慢?

我是闪亮的应用程序部署新手。如果有人可以在这些概念上澄清我,请多加赞赏。

MrG*_*ble 6

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

而且,由于这 20 个用户中的每一个都被隔离在每个容器中,因此无论您在-function 内部global.R或外部做什么server,用户(主要是2 个)都不会相互影响。

有一些选项可以在 docker 容器之间共享内存,但这是非常高级的东西(请参阅本文)。

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

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

脚注:

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

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