我的后端是在ubuntu linux中运行的nodejs应用程序。当客户端发出请求时,它需要spawn
一个nodejs子进程。子过程通常不到20秒即可完成。如果有许多并发请求进入,则需要管理这些进程。我正在考虑将spawn
进程移至docker容器内。这意味着如果客户端发出请求,将创建一个新的Docker容器来运行该过程。这样,我可以使用kubernetes来管理这些docker容器。我不确定这是否是一个好的设计。是否将进程放入docker容器会导致任何性能问题。
我考虑使用docker容器而不是spawn
的原因是kubernetes
提供了管理这些容器的所有功能。例如,如果请求过多,则自动缩放,限制docker容器,调度程序,监视等的cpu和内存。如果我使用spawn
,则必须实现这些逻辑。
答案 0 :(得分:2)
来自Docker documentation on network settings:
与默认的
bridge
模式相比,host
模式使明显更好的联网性能,因为它使用主机的本机联网堆栈,而网桥必须经过一个级别通过docker守护程序进行虚拟化。当网络性能至关重要时,建议以这种模式运行容器,例如生产负载平衡器或高性能Web服务器。
因此,没有明显的性能差异的答案是不正确的,因为Docker文档本身说有。
仅在网络情况下。访问磁盘,内存,CPU或其他内核资源可能有影响,也可能没有影响。我不是Docker的出口商,但是对此问题还有其他很好的答案,例如here,以及详细介绍Docker特定性能问题的博客。
最终,这将完全取决于您的应用程序对其影响方式。最好的建议永远是,如果您非常关注性能,则应该设置自己的基准并在环境中进行测试。那没有回答您的问题,因为没有通用答案。重要的是,“几乎没有影响”似乎并不正确。
答案 1 :(得分:1)
docker实际上只是Linux本身核心功能的包装,因此没有明显的影响-它只是在容器中分离进程。因此,问题更多是关于主机中的虚拟化级别。如果是Windows中的linux或Windows中的docker,则可能以某种方式影响您的应用程序,因此虚拟化是一种繁重的方法。 docker让您分离依赖关系,而对性能几乎没有任何影响。
答案 2 :(得分:1)
您可以自己轻松地测量开销:获取任何基本的docker映像(例如Debian基本映像)并运行
time bash -c true
time docker run debian bash -c true
(每次运行几次,而忽略第一次运行。)
这将为您提供启动和清理成本。在实际运行期间,可以忽略的/没有更多的开销。
Kubernetes本身可能会增加一些开销-最好的衡量方法。