最後の
さらにテストを行った結果、G-WAN の新しいバージョンでは、すべてが期待どおりに機能することが明らかになりました。
オリジナル 私は大きなファイルを扱っており、G-WAN は私のユースケースに最適なようですが、コンテンツをクライアントにストリーミングすることに頭を悩ませているようには見えません。
メモリが非常に速く消費されるため、バッファリングされた応答を避けたいと思います。
最後の
さらにテストを行った結果、G-WAN の新しいバージョンでは、すべてが期待どおりに機能することが明らかになりました。
オリジナル 私は大きなファイルを扱っており、G-WAN は私のユースケースに最適なようですが、コンテンツをクライアントにストリーミングすることに頭を悩ませているようには見えません。
メモリが非常に速く消費されるため、バッファリングされた応答を避けたいと思います。
ソースコード公開中
ありがとう。取得した値は明らかに間違っています。これは、CLIENT_SOCKET 列挙型が定義されている gwan.h ファイルの不一致に起因する可能性があります。実行可能ファイルと同期するファイルについては、次のリリースを待ちます。
以下で説明するように、ローカル ファイルは G-WAN によってストリーミングされて提供され、リモート ファイルは G-WAN のリバース プロキシを使用してより適切に提供されるため、ストリーミング ファイル (ローカル ファイルまたはリモート ファイルのいずれか) について CLIENT_SOCKET を処理する必要はありません。
ディスクへのコピーと gwan からの提供は非効率的であり、メモリ内のファイルのバッファリングも非効率的です
Nginx や他の多くの G-WAN と同様に、既に使用されているため、 「大きなファイルをクライアントにストリーミングする」sendfile()
ために何もする必要はありません。
sendfile() を調べましたが、gwan がクライアント ソケットを格納する場所が見つかりませんでした。CLIENT_SOCKET を使用しようとしましたが、機能しませんでした
CLIENT_SOCKET
がクライアント ソケットを返さない唯一の方法は、実行可能ファイルgwan.h
のバージョンと一致しないヘッダーを使用することです。gwan
G-WAN を使用することで、 connection handler
G-WAN のデフォルトの動作をバイパスできます (それがあなたが試したことだと思います)... しかし、G-WAN はすでに達成しようとしていることを行っているため、これは不要です (上記で説明したように)。
これを念頭に置いて、G-WAN と に関するいくつかのポイントを次に示しますsendfile()
。
G-WAN の古いリリースが誤って無効になりsendfile()
ました - 使用しないでください。より新しいリリースを使用していることを確認してください。
4 月のパブリック リリースでは、接続を閉じる際に注意が必要でした (キープアライブされていない接続を遅くする)sendfile()
ため、特定のサイズを超えるファイルに対してのみ使用していました。
最近の開発リリースではsendfile()
、すべての静的ファイルに使用されています (デフォルトでは、あまりにも多くのユーザーを混乱させるため、グローバル、接続ごと、または特定のリソースに対して明示的に復元できるキャッシュを無効にしました)。
その結果、大きなファイルのテスト ロードの場合、G-WAN は、テストした他のすべてのサーバーよりも高速になりました。
また、sendfile() で提供される大きなファイルであっても、比類のないレベル (Nginx のメモリ消費量のごく一部) に達するように、メモリ消費量を大幅に作り直しました。
G-WAN は起動時on a 6-Core Xeon
に 2.2 MB の RAM を使用します (サーブレットやハンドラーなどのコンパイルおよびロードされたスクリプトを除く)。
> Server 'gwan' process topology:
---------------------------------------------
6] pid:4843 Thread
5] pid:4842 Thread
4] pid:4841 Thread
3] pid:4840 Thread
2] pid:4839 Thread
1] pid:4838 Thread
0] pid:4714 Process RAM: 2.19 MB
---------------------------------------------
Total 'gwan' server footprint: 2.19 MB
対照的に、Nginxworker_connections 4096;
は起動時に 15.39 MB を消費します。
> Server 'nginx' process topology:
---------------------------------------------
6] pid:4703 Process RAM: 2.44 MB
5] pid:4702 Process RAM: 2.44 MB
4] pid:4701 Process RAM: 2.44 MB
3] pid:4700 Process RAM: 2.44 MB
2] pid:4699 Process RAM: 2.44 MB
1] pid:4698 Process RAM: 2.44 MB
0] pid:4697 Process RAM: 0.77 MB
---------------------------------------------
Total 'nginx' server footprint: 15.39 MB
また、Nginx とは異なり、G-WAN は事前にメモリを予約しなくても (ちなみに構成も必要ありません)、100万を超える同時接続を処理できます。
Nginx を構成すると、次のようにworker_connections 1000000;
なります。
> Server 'nginx' process topology:
---------------------------------------------
6] pid:4568 Process RAM: 374.71 MB
5] pid:4567 Process RAM: 374.71 MB
4] pid:4566 Process RAM: 374.71 MB
3] pid:4565 Process RAM: 374.71 MB
2] pid:4564 Process RAM: 374.71 MB
1] pid:4563 Process RAM: 374.71 MB
0] pid:4562 Process RAM: 0.77 MB
---------------------------------------------
Total 'nginx' server footprint: 2249.05 MB
Nginx は、接続を受信する前でも 2.2 GB の RAM を消費しています!
同じシナリオで、G-WAN に必要な RAM は 2.2 MB だけです (1024 分の 1)。
また、G-WAN は、大きなファイルの場合、Nginx よりも高速になりました。
リモート ソースから大きなファイルをストリーミングしたい
sendfile()
「リモートソースから大きなファイルをストリーミングしたい」と述べているように、探しているものではないかもしれません。
ここで、私があなたの質問を正しく理解していれば、G-WAN をリバース プロキシとして使用してリモート リポジトリから大きなファイルを中継したいと考えていますが、これは (ローカル ファイルを提供するのとは対照的に) まったく別のゲームです。
最新の G-WAN 開発リリースには、G-WAN でパーソナライズできる汎用 TCP リバース プロキシ機能がありますconnection handler
。
しかし、あなたの場合、バックエンドサーバーの応答をフィルタリングして変更できるようにする代わりに、ブラインドリレー(トラフィックの書き換えなし)ができるだけ速くなるだけで済みます.
Griffin が言及したsplice()
syscall は (ゼロコピー) 方法であり、G-WAN の (効率的なイベントベースおよびマルチスレッド) アーキテクチャは、特に RAM 使用量が少ない場合に驚異的です。
G-WAN は将来のリリースでこれを行うことができます (これはトラフィックを変更するよりも簡単です) が、Web/クラウド開発者がアプリケーションを作成できるようにするという G-WAN の主なターゲットとは対照的に、これはかなり垂直的なアプリケーションです。
とにかく、このレベルの効率が必要な場合、G-WAN は新しいレベルのパフォーマンスに到達するのに役立ちます. G-WANのウェブサイトからお問い合わせください。
コメットではなく、おそらく http ストリーミングを意味していると思います。この場合、gwan で提供される flv.c 接続ハンドラの例があります。sendfile()
また、必要に応じて、ファイルのゼロコピー転送にc を使用するか、 splice()
syscall を使用できます。