我々はすべてのカフカは、競合他社のほとんどよりもはるかに速く、非常に高速であることを知っているよう。だからここに理由は何ですか?
ランダムディスクアクセスを避けます
カフカは、順番に、ディスク上にすべてを書き込み、消費者があまりにも順序でデータをフェッチします。だから、ディスクアクセスは常に順番の代わりに、ランダムに動作します。従来のハードディスク(HDD)について、シーケンシャルアクセスはランダムアクセスよりもはるかに高速です。ここでの比較は以下のとおりです。
ハードウェア | シーケンシャル書き込み | ランダム書き込み |
---|---|---|
6 * 7200rpmのSATAのRAID-5 | 300メガバイト/ sの | 50キロバイト/秒 |
カフカはメモリではなくディスクにすべてを書き込みます
はい、あなたはその権利をお読みください。カフカは、代わりに、メモリのディスクにすべてを書き込みます。しかし、ちょっと待っメモリはディスクよりも速くすることになっていませんか?通常、それはランダムディスクアクセスのために、ケースです。しかし、シーケンシャルアクセスのために、その差は非常に小さいです。ここから取られた比較です https://queue.acm.org/detail.cfm?id=1563874が。
あなたが見ることができるように、それはその違いはないのです。メモリを選択しない理由しかし、それでもまだ、シーケンシャルメモリアクセスは、シーケンシャルディスクアクセスよりも速いのですか?カフカは私たちに2つの欠点を与えるJVMの上、上で実行されるため。
オブジェクトの1.メモリオーバーヘッドは、多くの場合、非常に高い 倍加 格納されたデータのサイズ(またはそれ以上)。
2.Garbageコレクションは、すべての今して起こるので、我々は(ごみ)で使用されていないデータを収集するために多くの時間が必要になりますので、メモリ内のオブジェクトを作成することで、ヒープデータの増加に伴って非常に高価です。
だから、メモリへの書き込みよりも良いかもしれファイルシステムに書き込むこと。さらに良いことに、我々はそれがより速く作るためにMMAP(メモリマップされたファイル)を利用することができます。
メモリマップトファイル(MMAP)
基本的には、MMAP(ファイルマップされたメモリ)がメモリにディスクからファイルの内容をマッピングすることができます。私たちがマップされたメモリに何かを書くときには、OSはいつか、後でディスクに変更をフラッシュします。だから、すべては私たちが実際にメモリを使用しますが、間接的な方法でされているので、高速です。だからここに質問が来ます。なぜ我々は、後にメモリにマップされ、ディスク上にデータを書き込むためにMMAPを使うのでしょうか?回り道のようです。理由だけではなく、メモリに直接データを書き込むことではありませんか?我々は以前に学習してきたように、カフカは、私たちが直接メモリにデータを書いた場合は、メモリのオーバーヘッドが高くなると、GCが頻繁に起こる、JVM上で動作します。だから我々はこの問題を回避するために、ここでMMAPを使用しています。
ゼロコピー
私たちは、メモリからデータをフェッチし、インターネットに送信されていると仮定します。どのようなプロセスで起こっていることは、通常は二つあります。
1.Toメモリからデータをフェッチし、我々はアプリケーションコンテキストにカーネルコンテキストからこれらのデータをコピーする必要があります。
2.Toインターネットにそれらのデータを送って、我々は、カーネルコンテキストにアプリケーション・コンテキストからデータをコピーする必要があります。
あなたが見ることができるように、それはカーネルコンテキストおよびアプリケーション・コンテキストの間でデータをコピーするために冗長です。我々はそれを避けることはできますか?はい、ゼロコピーを使用して、我々は、カーネルコンテキストにカーネルコンテキストから直接データをコピーすることができます。
バッチデータ
ときカフカは、データのみを送信 batch.size
代わりに、一つ一つの到達しました。一度に10メガバイトのデータを送信すること10000件のメッセージを一つずつ送信するよりもはるかに高速であり、帯域幅は10メガバイト/秒であると仮定すると(各メッセージを仮定すると、100バイトを要します)。
「私は細かいことと何のトラブルを作らないだろう。」