しばらくの間、大きな問題なく Kubernetes で Kafka を実行しています。しかし、最近 Cassandra ポッドのクラスターを導入したところ、Kafka でパフォーマンスの問題が発生し始めました。
Cassandra は Kafka のようにページ キャッシュを使用しませんが、ディスクへの書き込みを頻繁に行うため、おそらくカーネルの基盤となるキャッシュに影響を与えます。
Kubernetes ポッドが cgroup を介してメモリ リソースを管理していることは理解していますが、これは Kubernetes でメモリ要求と制限を設定することによって構成できますが、Cassandra がページ キャッシュを使用すると、Kafka ポッドのページ フォールトの数が増加する可能性があることに気付きました。リソースをめぐって競合しているようには見えません (つまり、ノードに利用可能なメモリがあります)。
Kafka では、ページ フォールトが増えるとディスクへの書き込みが増えるため、シーケンシャル IO の利点が損なわれ、ディスク パフォーマンスが低下します。AWS の EBS ボリュームのようなものを使用すると、最終的にバースト バランスが枯渇し、最終的にクラスター全体で壊滅的な障害が発生します。
私の質問は、Kubernetes でページ キャッシュ リソースを分離したり、Kafka ポッドが所有するページを Cassandra ポッドのページよりも長くキャッシュに保持する必要があることをカーネルに知らせることは可能ですか?