【发布时间】:2018-07-14 13:35:01
【问题描述】:
我在 Kubernetes 上运行 Kafka 已经有一段时间了,没有出现任何重大问题;然而,我最近引入了一组 Cassandra pod,并开始遇到 Kafka 的性能问题。
尽管 Cassandra 不像 Kafka 那样使用页面缓存,但它确实会频繁写入磁盘,这可能会影响内核的底层缓存。
我了解 Kubernetes pod 是通过 cgroups 管理内存资源的,这可以通过在 Kubernetes 中设置内存请求和限制来进行配置,但我注意到 Cassandra 对页面缓存的利用会增加我的 Kafka pod 中的页面错误数量即使它们似乎没有竞争资源(即,它们的节点上有可用内存)。
在 Kafka 中,更多的页面错误会导致更多的磁盘写入,这会阻碍顺序 IO 的优势并损害磁盘性能。如果您使用 AWS 的 EBS 卷之类的东西,这最终会耗尽您的突增余额并最终导致整个集群发生灾难性故障。
我的问题是,是否可以在 Kubernetes 中隔离页面缓存资源,或者以某种方式让内核知道我的 Kafka pod 拥有的页面应该比我的 Cassandra pod 中的页面保留在缓存中的时间更长?
【问题讨论】:
-
撇开 k8s 不谈,我看不出问题中描述的那种精确的隔离可以通过编程或配置来合理地完成,是吗? mlock + mmap 将在 RAM 中保留不需要的页面。 Cgroups 可以限制这两个应用程序,但这真的不是人们想要的。将应用程序指向它们自己的 I/O 资源并不能缓解主机争用。通常一个人不会在单个主机上运行两个 i/O 饥饿服务。您可以使用污点将它们隔离到不同的节点组吗?
-
我现在正在使用 k8s 反关联规则将它们分开,但它似乎有限制。如果您确信没有办法做到这一点,请写一个详细说明原因的答案,我会奖励您。
标签: apache-kafka kubernetes cgroups page-caching