为什么在zookeeper和kafka中交换不是一个好主意?

Hel*_*lad 4 apache-kafka apache-zookeeper

我已阅读说明书

do not use swap
Run Code Online (Sandbox Code Playgroud)

在zookeeper和kafka都有.我知道kafka依赖于页面缓存来保持顺序日志的一部分缓存在内存中,即使它们被写入磁盘也是如此.

但无法理解如何交换可以伤害zk和kafka.

Mic*_*oll 11

交换可能会导致性能和稳定性问题; 在您的示例中,您不希望Linux内核"错误/意外地"交换您的Kafka或ZooKeeper进程.

此外,对于像Kafka和ZooKeeper这样的JVM进程,交换可能特别糟糕,引用:

[J] JVM通常不会执行完整的GC循环,直到它的允许堆耗尽为止,因此大部分堆可能都是由尚未收集的垃圾占用.由于这些页面没有被触摸(因为它们是垃圾并因此未被引用),操作系统很乐意将它们交换掉.当GC最终运行时,你有一个荒谬的交换风暴,拉入所有这些页面,然后发现它们实际上充满了垃圾,应该被丢弃; 这可以轻松使您的GC循环花费很多分钟!

因此,建议通过设置来禁用交换vm.swappiness0,虽然对于一些操作系统,如RHEL 6.5这实际上应该是1(因为该值的语义0是这些操作系统的改变).请注意,仍可能发生一些交换.

以下链接可能会进一步阐明您的问题.他们解释了为什么分别禁用Hadoop和Elasticsearch的交换,这与你应该禁用Kafka和ZooKeeper交换的原因相同: