問題タブ [zero-copy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - LinuxでゼロコピーUDPパッキングを受信する可能性はありますか?
UDP パケットをイーサネット アダプタからユーザー空間バッファに直接コピーしたい
私のセットアップに関するいくつかの詳細:
ギガビット イーサネット カメラのペアからデータを受信しています。組み合わせると、1 秒あたり 28800 UDP パケットを受信しています (1 ラインあたり 1 パケット * 30FPS * 2 台のカメラ * 480 ライン)。ジャンボ フレームに切り替える方法はなく、CPU 使用率を下げるためにドライバー レベルの割り込みを調整することを既に検討しています。ここで求めているのは、この ~40MB/s のデータ ストリームをコピーする回数を減らすことです。
これは私がこれについて見つけた最良の情報源ですが、そのようなアプローチが実際にうまくいったというより完全な参照または証拠があることを望んでいました.
python - Python はゼロコピー I/O をサポートしていますか?
開いているファイル オブジェクトが 2 つdest
あり、src
. ファイル オブジェクトdest
は書き込み用に開かれ、シーク位置はファイル内のあるオフセットに配置され、ファイル オブジェクトsrc
は読み取り用に開かれます。私がする必要があるのは、現在の位置から EOF までを読み取り、できるだけ早くsrc
コンテンツを転送することです。dest
Java でプログラミングしていた場合、このFileChannel#transferTo()
メソッドを使用してゼロコピー ファイル I/O を実行できます。
Python はゼロコピーもサポートしていますか?
linux - Linux ソケット: ゼロコピー ローカル、TCP/IP リモート
ネットワークは、オペレーティング システムの中で私が最も苦手とする分野です。不完全な質問をしてしまったことをお許しください。私はこれについて数時間読んでいますが、頭の中を泳いでいます。(私にとって、チップの設計は、ネットワーク プロトコルを理解するよりも簡単だと思います。)
ソケットを介して相互に通信するネットワーク サービスがいくつかあります。具体的には、fd = socket(PF_INET, SOCK_STREAM, 0);
TCP/IP を自動的に取得する でソケットが作成されます。これらのサービスは別のマシンで実行されている可能性があるため、これが基本ケースとして必要です。
しかし、あるプロジェクトでは、Atom Z530P に基づいて、それらすべてを非力な組み込み「アプライアンス」に詰め込もうとしています。そのため、メモリ コピーのオーバーヘッドは最適化できるもののように思えます。私はそれについてここで読んでいます: data-link-access-and-zero-copyおよびLinux_packet_mmapおよびpacket_mmap。
この場合、次のようなソケットを作成しますfd = socket(PF_PACKET, PF_RAW, 0);
。また、リングバッファの割り当て、mmap、ソケットへの関連付けなど、他にもやるべきことがたくさんあります。データの使用sendto
とrecvfrom
送信に制限されているようです。私が理解しているように、ソケットはローカルであるため、信頼できる「ストリーム」タイプのソケットは必要ないため、生のソケットが適切なインターフェイスであり、リングバッファーはページの粒度で使用され、各パケットが(またはデータグラム) はページ境界から始まります。
これをさらに調査するために多大な時間を費やす前に、いくつかの質問で親切な人が私を助けてくれることを期待していました:
- ここで、ゼロコピー ソケットから得られるパフォーマンス上の利点はどれくらいですか? 最後にチェックしたときは、あるプロセスから別のプロセスへ、そして最終的にはディスクへ、最大で 40 MB/秒ほど移動していたと思います。最も基本的なシナリオでは、データはキャプチャ プロセスから 1 対多のプロセス (他のプロセスはストリームをリッスンできます)、ディスクに書き込むアーカイバ プロセスに移動します。これは、ディスクと内部のものを数えない 2 つのホップです。
- Linux はこれを自動的に行い、同じマシン上で実行されているプロセスを最適化しますか?
- いずれにせよ、TCP ポートでリッスン ソケットを使用します。それらを使用してプロセス間の接続を作成できますが、それでもゼロコピーを使用できますか? つまり、PF_PACKET で AF_INET を使用できますか?
- SOCK_RAW を使用した PF_PACKET は、ゼロコピー ソケットの唯一の有効な構成ですか?
- フォールバックとして TCP/IP でゼロコピーを使用する良いサンプル コードはありますか?
- 2 つのプロセスが同じマシン上にあることを検出する最も簡単な方法または最良の方法は何ですか? 彼らはお互いの IP アドレスを知っているので、それぞれに異なるコード パスを比較して使用することができます。これを行う簡単な方法はありますか?
- パケットベースのソケットで write() と read() を使用できますか、それともストリームに対してのみ有効ですか? (すべてのソケット コードを書き直すよりも、接続方法を書き直す方が簡単です。)
- 物事を過度に複雑にしたり、間違ったことを最適化したりしていませんか? OProfiler によると、ほとんどの CPU 時間は (1) zlib と (2) カーネルの 2 つの場所で費やされています。これは、VMLinux を提供しない CentOS 6.2 を使用しているためプロファイルできません。カーネル時間は、アイドル時間とデータのコピーの組み合わせであり、他にはあまりないと思います。
助けてくれてありがとう!
linux - Linux ゼロ コピー
ユーザー空間から読み書きする必要がある PCI デバイスがあります。ゼロコピーを使用しようとしています。ユーザー空間内で完全にユーザー空間アドレスの物理アドレスを割り当て、ピン留めし、取得する方法はありますか、それとも virt_to_phys または get_user_pages を呼び出すカーネル モジュールが必要ですか? デバイスのメモリは MMIO を介してユーザー空間メモリにマップされるため、必要なデータを渡すことができます。ありがとう。
c - スキャッター/ギャザー操作の有無にかかわらずゼロコピー
ゼロコピーのメカニズムを説明する記事を読んだばかりです。
Scatter/Gatherサポートがある場合とない場合のゼロコピーの違いについて説明します。
SGをサポートしないNIC、データコピーは次のとおりです
SGをサポートするNIC、データコピーは次のとおりです
つまり、SGをサポートするゼロコピーは1つのCPUコピーを排除できます。
私の質問は、なぜカーネルバッファ内のデータが分散する可能性があるのかということです。
multithreading - ソケットの質問
いくつかのソケットに関する質問があり、明確な「はい」または「いいえ」を見つけることができなかったので、再投稿である場合は事前にお詫び申し上げます:) プラットフォームは Linux 2.6.30、C++ アプリです。ネットワーキングにはまだ非常に慣れていないため、スピードを上げています。
ソケット API スレッドは安全ですか? たとえば、ミューテックスを使用せずに複数のスレッドから送信した場合、または独自のミューテックスを使用してそれを確認する必要がありますか?
送信を行って送信APIの内部キューイングに送信を任せるよりも、送信がブロックされてから送信を行うかどうかを確認するためにポーリング/選択する方が良いですか? とにかくスレッドがブロックされる場合 (つまり、タイムアウトを使用しない場合)、ポーリングとそれに続く送信が必要な理由がわかりません。
Linux ではソケットはデフォルトでゼロコピーですか、それともコピーが関係していますか? コピーがある場合のサイズ制限はありますか (API の観点ではなく、粒度の観点から)? 答えが、カーネルがコピーを行うというものである場合、ゼロ コピー ソケットはありますか?
2 台のマシン間で通信する必要がある場合、単一のソケットよりも複数のソケットの方が帯域幅をはるかにうまく利用できると思います。それは正しい仮定でしょうか?2 台の通常の Linux マシン間で全帯域幅を利用する最善の方法は何ですか?
5.インターフェイスの現在の帯域幅使用量を測定するためのお気に入りのツールは何ですか? これはおそらく単なる好みです。私は iptraf などを見ましたが、他の人が何を使用し、最も気に入っているのかを知りたいと思います。
java - Javaでゼロコピーを作成するにはどうすればよいですか? 主な違いは何ですか
Java nio ライブラリを使用して、「ゼロ コピー」と呼ばれる O/S レベルでのファイル転送/バッファリングを利用する方法について読んでいました。
ファイルの作成/書き込み方法の違いは何ですか? ゼロコピーを使用することの欠点はありますか?
c++ - C++でロックフリー循環バッファを使用してゼロコピーTCPを実装する方法
TCPストリームからのデータを消費する必要がある複数のスレッドがあります。TCPソケットから読み取るために、共有メモリ内の循環バッファ/キューを使用したいと思います。TCP受信は、循環キューに直接書き込みます。コンシューマーはキューから読み取ります。
この設計では、ゼロコピーとゼロロックを有効にする必要があります。ただし、ここには2つの異なる問題があります。
TCPソケットから1つの論理メッセージだけを読み取ることは可能/効率的ですか?そうでない場合で、複数のメッセージを読んだ場合は、残差をこれからthis->nextにコピーする必要があります。
ロックレスキューを実装することは本当に可能ですか?不可分操作があることは知っていますが、これらもコストがかかる可能性があります。すべてのCPUキャッシュを無効にする必要があるためです。これは、24コアすべてのすべての操作に影響します。
低レベルのTCPで少し錆びており、メッセージがいつ完了したかを正確に判断する方法がわかりません。\ 0を探しますか、それとも実装固有ですか?
ty
cuda - Thrust::host_vector を使用できますか、それとも Thrust のゼロコピーに cudaHostAlloc を使用する必要がありますか?
によってマップされたメモリでゼロコピーを使用したいcudaHostGetDevicePointer
。使用できますthrust::host_vector
か、または使用する必要がありますか、cudaHostAlloc(...,cudaHostAllocMapped)?
または Thrust を使用する方が簡単ですか?
performance - ベクトル化された参照バッファーの実装
github のプロジェクトの 1 つからコードを読んでいました。Vectored Referencing バッファの実装と呼ばれるものに出会いました。誰かがこれに出くわすことはできますか?これの実用的なアプリケーションは何ですか。私は簡単なグーグル検索を行いましたが、これのための簡単なサンプル実装を見つけることができませんでした.
いくつかの洞察が役立つでしょう。