【发布时间】:2016-05-22 14:24:20
【问题描述】:
所以我们有一个不是线程安全的应用程序。 它使用的一些库正在文件系统级别上进行锁定。不幸的是,它不能正常工作,如果有一些库的并发使用,它会崩溃并抛出错误。我们也不能切换这个库。要实现并发,哪一个更好?在一台强大的机器上运行 100 个容器还是将其拆分为 100 台小型机器?
由于我们使用的是 Amazon,我正在考虑 100 个 X t2.micro 实例,每个实例运行一个容器 VS 一台 c4.8xlarge 机器和 100 个 docker 容器。我们的记忆没有任何问题。这些任务受 CPU 限制。但它也没有那么重,一个 t2.micro 实例就足以处理它,只要它一次只处理一个。
我与一位同事讨论了哪个更好。我更喜欢 100 个实例,因为我认为 Docker 隔离将是一个巨大的开销。就像您只有一种资源,但它被分成需要使用该资源的 100 个人。另一方面,我的同事提出了一个我认为可能有效的观点。创建 Linux 命名空间比启动整个操作系统更轻松。所以如果我们有 100 台机器,我们就有 100 个操作系统,而对于一台大机器,我们只有 1 个操作系统。
问题是,我不知道哪个是正确的。有这方面知识的人能解释一下哪个更好,并给我一个具体的理由吗?
由于我意识到我刚刚问了一个不好的问题,因此我将尝试在此处添加更多信息。为了使问题更准确,我并没有真正问在我的特定用例中哪个更好,或者哪个更便宜。只是好奇哪个在 CPU 方面表现更好。试想一下,我们有一个非常大的计算问题,我们必须做 100 个。我们想并行化它们,但它们不是线程安全的。是在 100 台小型机器上完成,还是在 1 台强大的机器上使用 100 个容器更好?哪一个会更快完成?为什么?
如果我们只有 1 台强大的机器,这 100 个容器会不会都在争夺资源并减慢整个进程?如果是 100 台小型机器,可能会因为操作系统或其他因素导致整体性能变慢?无论如何,我对此没有任何经验。我当然可以试试这个,但最终,由于它不是理想的环境(有很多因素),结果无论如何也不会是权威的。我一直在寻找知道这两种事情在低级别如何工作并且可以争论哪种环境可以更快地完成任务的人的答案。
【问题讨论】:
-
是否存在可变负载,您可以在其中利用自动缩放微实例来根据负载需求进行扩展/缩减?如果是这样,您可能会获得节省成本的优势。
-
它每天运行 1-2 小时。所以最小大小为 0。如果我们使用 100 个实例,我们可以在使用后完全关闭它们,如果我们只使用 1 个实例,我们也可以只关闭单个实例。所以成本不是问题。这个问题更注重性能而不是成本节约。
-
您的选择实际上取决于您的应用程序保证在任何给定时间(例如每小时)服务的最小并发用户数。在节省成本方面,为不可预测的工作负载运行 t2.micro 按需实例比为 Docker 容器运行 c4.8xlarge 实例要好。
-
并发也会被封顶100。节省成本的部分也是次要的。主要问题是哪一个会提供更好的性能。
-
与在主机上相比,通过 docker 运行进程几乎没有 CPU 开销。
标签: linux amazon-ec2 concurrency parallel-processing docker