- 已关闭**。此问题为opinion-based。当前不接受答案。
- 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
2天前关闭。
Improve this question
上下文
我正在kubernetes设置中运行一个作业处理任务(具体来说就是Resque)。此任务设置一个或多个工作进程从队列中取出作业消息并进行处理。典型的调用是设置所需的工作进程计数,例如COUNT=8 QUEUE=* resque:work
。
当然,在Kubernetes中,我将向运行此任务的部署添加自动伸缩功能。
有一个流行的建议是每个pod运行一个进程(见下文)。我担心这样做可能是浪费,当我希望运行的进程有一个内置的多进程管理系统来运行相同的进程。我试图理解的理论和文件,以通知决策和实验。
我的动机问题是:是否有任何理由继续设置工作进程计数,或者每个pod只使用一个工作进程是否更有意义?即,与让Resque产生多个进程相比,每个pod示例是否有显著的开销?
问题
客观问题是:在每个pod运行一个进程而不是让一个pod的主进程产生多个子进程时,我应该在哪里期待/寻找开销?
例如,IIUC每个pod运行其自己版本的操作系统和安装在容器中的其他实用程序,因此与运行单个容器、单个操作系统、多资源工作者设置相比,这至少是一些内存开销;这是正确的吗?在简单地对一堆猜测进行基准测试之前,我还应该看什么来为这个设置建模资源消耗?
更多背景
我知道小的进程数允许更细粒度的扩展。我不认为以比一次4个进程更细的分辨率进行扩展会有多大好处,所以如果要考虑pod开销,我会从那里开始。我是否想得太多了,我是否应该忘记pod开销,而只使用每个pod 1个工作进程?
这个问题是从许多"每个pod一个进程"的引用中得到的。许多都列在this similar question和stack exchange question linked therein中。
- 相关问题涉及扩展pod内的进程以优化节点计算使用率,我认为k8已经很好地管理了这一点
- 嵌套链接更多的是将每个pod限制为一个 * concern *,这就是我的问题中的情况。
我的问题是关于在4个pod中运行4个相同的工作进程与在1个pod中运行4个相同的工作进程的开销。
1条答案
按热度按时间8cdiaqws1#
无论哪种方式都很好,我不期望它会有很大的不同,除非是大规模的。
在一个容器中运行多个工作任务在架构上没有什么问题,特别是在专门设计的框架中。正如您所注意到的,通常认为每个容器运行一个关注点是好的形式,运行多个进程会有各种问题(从失败的进程中恢复,收集日志);但如果您有一个专门设计用于启动和管理子进程的系统,那么在容器中运行它就可以了。
我在这里要问的问题是,您计划同时运行多少个Resque工作进程。如果是“数千个”,那么您可能会开始触及每个节点的pod数量限制和Kubernetes调度器的压力。在这种情况下,每个集装箱使用多个工人来减少豆荚的数量是有意义的。如果是“几十个”则将其限制为仅一个可以使其更易于可视化和管理。
启动一个新的容器可能会有些昂贵(我习惯于看到30- 60秒的启动时间,但很大程度上取决于映像),但拥有一个正在运行的容器并不特别昂贵。看起来Resque在一定数量的工作者之上有一个管理器进程,所以您将拥有这些额外的Ruby,但这可能不是很重要的内存或存储。