风暴如何强制实施组件内存约束



Storm 可以选择使用setMemoryLoad函数配置每个组件(螺栓/喷口)的内存大小。工作进程如何对每个执行程序/任务强制执行此约束,因为它们都在同一个 JVM 中?

我认为你误解了setMemoryLoad的用途。

SetMemoryLoad 和类似的方法(例如 setCPULoad)并不能确定实际分配给组件的内存或 CPU 量。它们是资源感知调度程序 https://storm.apache.org/releases/2.0.0-SNAPSHOT/Resource_Aware_Scheduler_overview.html 的提示。

您可以配置每个管理引擎上可用的内存/CPU 量,资源感知调度程序使用该信息以及您在组件上设置的内存/CPU 负载,尝试以有意义的方式在管理引擎之间分配组件。例如,如果您想在集群中均匀分布繁重的组件,或者如果您的主管是异构的(也就是说,您有一些弱机器和一些强机器,并且您不希望 Storm 在弱机器上运行非常繁忙的组件),则可能需要这样做。

我相信 Storm 确实有能力强制执行您指定的 CPU/内存限制,但您必须为该 http://storm.apache.org/releases/2.0.0-SNAPSHOT/cgroups_in_storm.html 启用 cgroups。我对代码的这一部分不是很熟悉,但它允许您为每个工作线程 JVM 设置一个固定的限制,或者尝试根据资源感知调度程序的分配动态设置限制。

正如我所说,我不熟悉 cgroups 支持,所以这可能是错误的,但我想 Storm 可以在引导该 JVM 时为 worker JVM 设置 cgroup 限制。例如,如果 RAS 将一个 boltA 实例和一个 boltB 实例分配给您的工作线程,则整个工作线程的组合限制仅为 512+1024 meg。

最新更新