13

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

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

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

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

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

4

1 回答 1

7

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

而且,由于 20 个用户中的每一个都在他们的每个容器中被隔离,所以无论您在-functionglobal.R内部或外部做什么server,用户(大多数是2)都不会相互影响。

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

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

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

脚注:

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

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

于 2019-08-20T08:04:50.727 回答