問題タブ [http.sys]
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.
windows - アプリケーションを Http.sys に登録する方法は?
そこで、TCP\HTTP サーバー (IN C#) を作成しました。私が持っている他の HTTP サーバーの近くにある 80 年代のポートに名前空間を与えたいと考えています。そのようなことを行う方法(ステップバイステップ)?
c# - http.sys ファイルのアップロード パフォーマンスを最大化する方法
私は、あるサーバーから別のサーバーに非常に大きなストリーミング データ セット (おそらく単一ストリームで数テラバイト、通常は数十ギガバイト) を転送するツールを構築しています。ツールのクライアント部分は、ソース ディスクからブロックを読み取り、ネットワーク経由で送信します。サーバー側はこれらのブロックをネットワークから読み取り、サーバー ディスク上のファイルに書き込みます。
現在、どの交通機関を利用するか検討中です。オプションは raw TCP と HTTP です。
私は本当に、本当にHTTPを使用できるようにしたいと思っています。HttpListener (または、そのルートに行きたい場合は WCF) を使用すると、HTTP サーバー API (http.sys) に簡単にプラグインでき、認証や SSL などを無料で取得できます。今の問題はパフォーマンスです。
サーバー側で async BeginRead/EndRead を使用して、BeginWrite/EndWrite 非同期 I/O イディオムを使用して 128K ブロックの NULL バイトを送信する簡単なテスト ハーネスを作成しました。HttpWebRequest
このテスト ハーネスを変更して、 /を介した HTTP PUT 操作、または/HttpListener
を使用した単純な古いソケット書き込みのいずれかでこれを実行できるようにしました。ネットワーク カードまたはネットワーク パスの問題を除外するために、クライアントとサーバーの両方が 1 台のマシン上にあり、localhost 経由で通信します。TcpClient
TcpListener
私の 12 コア Windows 2008 R2 テスト サーバーでは、このテスト ハーネスの TCP バージョンは、最小の CPU 使用率で 450MB/秒でバイトをプッシュできます。同じボックスで、テスト ハーネスの HTTP バージョンは、調整方法に応じて 130MB/s から 200MB/s の間で実行されます。
どちらの場合も CPU 使用率は低く、CPU 使用率の大部分はカーネル時間であるため、C# と .NET ランタイムの使用がボトルネックではないと確信しています。このボックスには、2 つの 6 コア Xeon X5650 プロセッサ、24 GB のシングルランク DDR3 RAM が搭載されており、私自身のパフォーマンス テスト専用に使用されています。
、、、、などServicePointManager.MaxServicePointIdleTime
のHTTP クライアントの微調整については既に知っています。 ServicePointManager.DefaultConnectionLimit
ServicePointManager.Expect100Continue
HttpWebRequest.AllowWriteStreamBuffering
HTTP.sys のパフォーマンスを 200MB/s を超えるようにする方法について、誰かアイデアはありますか? どの環境でもこれほどうまく機能するのを見た人はいますか?
更新:
TcpListener
vsで見たパフォーマンスの詳細を次に示しますHttpListener
。
まず、TcpClient/TcpListener テストを作成しました。私のテストボックスでは、450MB/s をプッシュできました。
次に、リフレクターを使用して、HttpWebRequest の基になる未加工の Socket オブジェクトを取得する方法を見つけ、それを使用するように HTTP クライアント テストを変更しました。まだ喜びはありません。かろうじて200MB/秒。
私の現在の理論では、http.sys は典型的な IIS のユース ケースに合わせて最適化されているというものです。これは、多数の同時実行の小さな要求と、多数の同時実行の、場合によっては大規模な応答です。この最適化を達成するために、MSFT は私が達成しようとしていることを犠牲にしてそうしなければならなかったと仮定します。これは、単一の非常に大きな要求で非常に高いスループットを実現し、応答は非常に小さくなります。
価値のあるものとして、最大 32 の同時 HTTP PUT 操作も試して、スケールアウトできるかどうかを確認しましたが、それでも満足できるものではありませんでした。約200MB/秒。
興味深いことに、64 ビット Windows 7 を実行するクアッドコア Xeon Precision T7400 である私の開発ワークステーションでは、私の TcpClient 実装は約 200MB/秒であり、HTTP バージョンも約 200MB/秒です。Server 2008 R2 を実行しているハイエンドのサーバークラスのマシンにそれを持っていくと、TcpClient コードは最大 450MB/秒になり、HTTP.sys コードは約 200 のままです。
残念ながら、この時点で、HTTP.sys は私が必要とする仕事に適したツールではなく、ずっと使用してきた手巻きのソケット プロトコルを引き続き使用する必要があるという結論に達しました。
registry - Windows Azure で http.sys レジストリ設定を変更しますか?
Windows AzureのHttp.sys レジストリ設定の UrlSegmentMaxLength を上げる必要があります。誰もそれを行う方法を知っていますか? (または同等の動作につながる何かをする)
windows - HTTP.SYS を使用しない WCF
WCF で HTTP バインディングを使用する場合、そのポート/パスにバインドできるように特別なアクセス許可を自分自身に付与する必要があります。これは、WCF がhttp.sysドライバーを介して HTTP トラフィックを受け入れるためだと理解しています。
昔は、管理者でなくても、ソケットを新しく作成し、使用されていない古いポートにバインドできました。NetTcpBinding はこれを行うことができます。
http.sysを気にしない場合、WCFにそれを使用しないように指示し、代わりにHTTPバインディングを使用しながら通常の古いソケットを開く方法はありますか?
asp.net - スレッドは、Http.sys、IIS、および ASP.NET を介した要求にどのように関連付けられていますか?
現在、node.js について多くのことを読んでいます。従来のリクエストごとのスレッド モデル (Apache) を使用するサーバーと、イベント ループを使用するサーバー (Nginx、ノード、Tornado) との間で頻繁に比較が行われます。
ASP.NET で要求がどのように処理されるかについて詳しく知りたいと思います。http.sys で受信された時点から、ASP.NET 自体で処理されるまでです。http.sys と IIS に関する MSDN ドキュメントが少し不足していることがわかりましたが、おそらく私の google-fu は今日弱いです。これまでのところ、私が見つけた最良のリソースはThomas Marquardt のブログ の投稿です。
誰かがこのトピックにもっと光を当てたり、他のリソースを教えてくれませんか?
(この質問の目的のために、私は典型的な統合パイプラインを備えた IIS7 にのみ関心があります)
c# - C# NET HTTP.SYS Web サーバー
基本的にhttp://1.2.3.4:8080にアクセスして、C:\web などにあるファイルのリストを参照できる、非常に基本的な Web サーバーを作成する必要があるだけです。
完璧に見えるhttp://mikehadlow.blogspot.com/2006/07/playing-with-httpsys.htmlを見つけましたが、いくつか質問がありました。
1) ドキュメントにあるように IP を * または + に置き換えると、system.dll でアクセス拒否エラーが発生します。localhost またはローカル IP を使用すると、正常に動作します。どうしてこれなの?複数あるマシンの特定の IP アドレスにバインドできるようにしたいと考えています。
2)おそらく何かが欠けていますが、このコードで提供されているファイルがあるコアディレクトリをどのように指定しますか?
windows - HttpAddFragmentToCache と OS エラー 50
アプリケーションに組み込み Web サーバーを作成しようとしています。これには、Windows の http.sys HTTP サーバー コンポーネントを使用します。を使用しないと、すべてがうまく機能しますHttpAddFragmentToCache
。
これまでに行ったこと(エラーチェックを削除しましたが、フラグメントキャッシュがなくても問題なく動作します):
ヘルパー スレッドでリクエストが来ると、次のようになります。
私が変更しようとしているのは、いくつかの静的ドキュメントをフラグメントキャッシュに追加することです (上の省略記号で):
注:重複するすべてのパラメーターは、コードでオプションで nil / NULL になり、そのパラメーターを見逃す可能性がある理由を説明しています。
これにより、結果は 50 になります (要求はサポートされていません)。メモリとファイルハンドルからフラグメントを追加しようとしましたが、すべて異なるポリシーです。渡された値が逆アセンブルで正しいかどうかを確認し、渡された文字列HttpAddFragmentToCache
が実際に渡されたものから有効なサブ URL であるかどうかを確認しましたHttpAddUrl
(そうでない場合は、OS エラー 2 が発生するため、それもそうではありません)。
私の質問は次のとおりです。これは何でしょうか? 私はこのAPI呼び出しを私が見ることができる最も簡単な方法で使用しようとしています(APIが設計されている場所です)が、どうやら私は何か間違ったことをしています..
アップデート:
関数で追加されたフラグメントにHttpAddFragmentToCache
は最大サイズがあるようです:
上記のコードを次のように置き換えると:
エラーは発生しません。に置き換えたとき
失敗します。どうやらサイズ制限があり...私はそれを見つけました:
http://support.microsoft.com/kb/820129
UriMaxUriBytes 262144 (バイト) 4096(4k) – 16777216(16MB) バイト この値より大きい応答は、カーネル応答キャッシュにキャッシュされません。
これにより、2 つのオプションが残されます。1. 大きなファイル用に複数のフラグメントを保持します。または 2. レジストリでこの制限を増やします。
windows - Http.sys は全二重通信をサポートしていますか?
これは可能ですか?特定の要求に対する応答を提供するために http.sys によって使用される基になるソケットにアクセスできますか。ポート 80 で http プロトコルを介した全二重通信をサポートできるようにしたいと考えています。
現在のリクエストに対して確立されたソケットを取得し、それを全二重通信用に保持する方法はありますか?
私の使用例は Web ソケットです。Web ソケットのハンドシェイクは実際には有効な http 要求であり、アップグレードのために Web サーバーを再利用したいと考えています。クライアント マシンで別のポートが開かれていない可能性があるため、ポート 80 が不可欠です。
任意の代替案をいただければ幸いです。
.net - HttpListenerスロットリング?
MSDNによると、HttpListenerはhttp.sysに基づいており、「HTTP.sysは接続管理、帯域幅調整、およびWebサーバーロギングを提供します。」
サーバーへの接続の最大数を制限する必要があります。HttpListenerでこれを行う最良の方法は何ですか?
wcf - WCF サービスでのエラー 503
ポート 80 でリッスンしているセルフホステッド WCF サービスがあります。接続しようとすると、503 Service Unavailable
.
私の WCF プロセスは実行されており、IIS も実行されています。私の URL ACL は正しいです。コントロールが WCF プロセスに到達することはありません。
WCF トレースは、次のことだけを示しています。
正しくオンになっているFailed Request Tracingには何も表示されません。他のトレースが表示されます。503 Service Unavailable
メッセージは非常に単純で、ユーザー モードではなくカーネル モードから送信されていることを示しています。
名前空間が正しく予約されていることを示すHTTP.SYS トレースを有効にしました。
しかし、後で、同じトレースで次のように表示されます。
私はiisreset
数回試しましたが、役に立ちません。PC も再起動しました。同じ問題。
何がうまくいかないのですか?この問題をさらにデバッグするには、他に何ができますか?
アップデート
URL の名前を変更すると (たとえば、「Foo」を「Fizz」に変更)、機能します。どこかで構成が壊れているようです。
にバインドされている同じプロセスでホストされている他のサービスがhttps://localhost/Foo/Bar/
あり、それらは正しく動作しているようです。
WCFだけじゃない
私は自己ホスト型のNancyサービスで同じ問題を抱えていました。以下のコメント投稿者の 1 人が、自己ホスト型のServiceStackサービスでも同じことを報告しています。