Kafka は、Apache Software Foundation によって開発されたオープンソースのストリーム処理プラットフォームです。データのバッファリング、非同期通信、ログの集約、システムの分離などに広く使用されています。他の一般的なメッセージング システムと比較して、Kafka はほとんどの機能特性を保証するだけでなく、高スループットと低レイテンシで優れたパフォーマンスを発揮します。この記事は、Kafka の使用方法や実装を紹介する他の記事とは異なります。ここでは、Kafka が優れたパフォーマンスを実現するために使用する「ブラック テクノロジー」についてのみ説明します。
ほとんどのディスクは依然として機械的な構造です (SSD はこの議論の範囲外です)。メッセージがディスク上にランダム書き込みモードで保存される場合、シリンダー、ヘッド、セクターでアドレス指定する必要があります。アドレス指定は「機械的な動作」であり、最も時間がかかります。ハードディスクの読み取りと書き込みの速度を上げるために、Kafka はシーケンシャル I/O を使用します。 図1 Kafka シーケンシャルIO 上図では、各パーティションがファイルであり、各メッセージがパーティションに追加されます。ディスクへの順次書き込みなので、効率が非常に高くなります。この方法には欠陥があり、データを削除する方法がないため、Kafka はデータを削除しません。すべてのデータが保持されます。各コンシューマーには、どのデータが読み取られたかを示すためにトピックごとにオフセットがあります。 ディスクのシーケンシャル読み取りと書き込み、およびランダム読み取りと書き込みのパフォーマンスに関しては、Kafka の担当者が提供した一連のテスト データが引用されています (Raid-5、7200rpm)。
したがって、シーケンス I/O のみを実行することで、Kafka のパフォーマンスが大幅に向上します。
Web プログラムがファイルの内容を読み取り、それをネットワークに送信するシナリオを考えてみましょう。この実装のコアコードは次のとおりです。 図2 一般的な読み取り方法 呼び出しは 2 回だけですが、CPU コピーが 2 回、ユーザー モードとカーネル モード間のコンテキスト スイッチが複数回発生するなど、コピーが 4 回あるため、CPU の負担が増加します。ゼロコピーは、この非効率性を解決するために設計されています。 # mmap: コピー数を減らす 1 つの方法は、read() の代わりに mmap() を呼び出すことです。 アプリケーションが mmap() を呼び出すと、ディスク上のデータが DMA 経由でカーネル バッファーにコピーされます。オペレーティング システムはこのカーネル バッファーをアプリケーションと共有するため、カーネル バッファーの内容をユーザー スペースにコピーする必要はありません。アプリケーションは再度 write() を呼び出し、オペレーティング システムはカーネル バッファーの内容をソケット バッファーに直接コピーし、最後にデータをネットワーク カードに送信します。 図3 mmap法 mmap を使用すると CPU コピーを 1 つ減らすことができますが、いくつかの落とし穴があります。プログラムがファイルをマップしたが、そのファイルが別のプロセスによって切り捨てられた場合 (truncate)、不正なアドレスにアクセスしたため、書き込みシステム コールは SIGBUS シグナルによって終了します。この問題は通常、SIGBUS シグナルのシグナル ハンドラーを作成するか、ファイル リースを使用することで解決できますが、これについてはここでは説明しません。 # 送信ファイル: カーネル バージョン 2.1 以降、Linux では操作を簡素化するために sendfile が導入されました。 図4 sendfileメソッド sendfile() メソッドは、DMA エンジンをトリガーしてファイルの内容を読み取りバッファーにコピーし (DMA コピー)、次にカーネルがデータをソケット バッファーにコピーし (CPU コピー)、最後にネットワーク カードにコピーします (DMA コピー)。 sendfile を使用すると、データのコピー数が減るだけでなく、コンテキストの切り替えも減ります。データ転送は常にカーネル空間でのみ行われます。 この時点で、sendfile には少なくとも 1 つの CPU コピーが必要なので、この手順を省略できますか?カーネルによって実行されるすべてのデータのコピーを排除するには、収集操作をサポートするネットワーク インターフェイスが必要です。同時に、カーネル バージョン 2.4 では、ソケット バッファー記述子もゼロコピー要件に適合するように変更されました。このアプローチは、複数のコンテキストスイッチを削減するだけでなく、CPU コピーも完全に排除します。 図5 sendfileメソッド(DMAギャザー) sendfile システム コールは、DMA エンジンを使用してファイルの内容をカーネル バッファーにコピーし、ファイルの場所と長さの情報を含むバッファー記述子をソケット バッファーに追加します。このステップでは、カーネル内のデータはソケット バッファーにコピーされません。 DMA エンジンは、最後の CPU コピーを回避して、カーネル バッファー内のデータをプロトコル エンジンにコピーします。 ゼロコピー技術は非常に一般的です。 JAVA の transferTo メソッドと transferFrom メソッドはゼロ コピーです。 [この記事は51CTOコラム「AiChinaTech」、WeChatパブリックアカウント(id:tech-AI)からのオリジナル記事です] この著者の他の記事を読むにはここをクリックしてください |
<<: マルチクラウド仮想化環境のバックアップコンプライアンス
>>: エッジコンピューティングは企業のネットワーク需要のバランスをとるのに役立つ
アマゾン川で蝶が羽ばたき、2週間後に竜巻がテキサスを襲う。 3か月前には、「疫病」が2020年に新た...
Justhost は中東の UAE で新たに VPS サービスを開始しました。データ センターはフジ...
松原市公安局は、20以上の省に被害が及び、被害総額が2,500万元を超える中、綿密な捜査を通じて松原...
これまでの 3 つの記事では、オンライン マーケティングの 2 つの主要な側面、つまりコミュニケーシ...
FESCAR: 高速かつ簡単なコミットとロールバックFESCARとは何ですか?マイクロサービス アー...
多くのウェブマスターの友人は、自分のウェブサイトが降格された状況に遭遇するでしょう。一生懸命に努力し...
あなたのウェブサイトのトラフィックはどれくらいですか? かなり多いかもしれませんが、ウェブサイトのリ...
2018年はNetEaseにとって重要な年です。財務報告によると、NetEaseの第1四半期のオンラ...
最近、Bai Ya兄弟のSEOとユーザーエクスペリエンス、親しみやすさ、長い道のり、ウェブサイトコン...
テンセントテクノロジーニュース(トム)北京時間6月24日、海外メディアの報道によると、消費者向けテク...
みなさんこんにちは。今日は、ウェブサイトが競合他社との直接の競争を避ける方法を皆さんと一緒に分析しま...
検索結果:検索者の検索リクエストに応じて、検索エンジンは一致する Web ページへのリンクを返します...
今日の社会では、文学、機械、デザインなどあらゆる分野で独創性がますます重視されるようになっています。...
スペインのバルセロナデータセンターにあるginernetの特別なVPSをご紹介します。比較的、一般の...
[[351688]] 10年以上の開発を経て、クラウドコンピューティングは徐々に成熟してきました。こ...