2009-03-25 8 views
2

C#.NET 2.0これが該当する場合は、Webサービスの速度のトラブルシューティング

なぜ私たちが持っているWebサービスが遅くなっているのかを知るために始めるつもりです。このWebサービスは、プロキシを介して別のドメインにジャンプし、ストアドプロシージャにデータを照会し、私が尋ねたものに応じて、int/string/dataset私はちょうど同じ方法でそれを繰り返し問い合わせるコンソールアプリを書いたので、始めにいくつかの統計を集めることができます。

キープアライブは、各リクエストごとにオフ、となっています。レガシーな理由で誰も記載されていないため、直ちに匂いがあります。

同じリクエストを何回も繰り返していると、私はいくつかの奇妙な動作に気付きました。ここでは、各繰り返しがクエリを作成してデータを返すのにかかる時間を反映した結果を示します。

Beginning run #1...completed in 4859.3128 ms 
Beginning run #2...completed in 3812.4512 ms 
Beginning run #3...completed in 3828.076 ms 
Beginning run #4...completed in 3828.076 ms 
Beginning run #5...completed in 546.868 ms 
Beginning run #6...completed in 3828.076 ms 
Beginning run #7...completed in 546.868 ms 
Beginning run #8...completed in 3828.076 ms 
Beginning run #9...completed in 3828.076 ms 
Beginning run #10...completed in 578.1176 ms 
Beginning run #11...completed in 3796.8264 ms 
Beginning run #12...completed in 3828.076 ms 
Beginning run #13...completed in 3828.076 ms 
Beginning run #14...completed in 3828.076 ms 
Beginning run #15...completed in 3828.076 ms 
Beginning run #16...completed in 3828.076 ms 
Beginning run #17...completed in 546.868 ms 
Beginning run #18...completed in 3828.076 ms 
Beginning run #19...completed in 3828.076 ms 
Beginning run #20...completed in 546.868 ms 
Total time: 61165 ms 
Average time per request: 3058 ms 

非常に小さいレベルまで複数の繰り返し値があることは奇妙です。 繰り返し同じ時間内に返されるボトルネックはありますか?

...ミリ秒の時間を計算して表示するためのコードはオフではありませんが、それをトラッキングするTimeSpanオブジェクトは各ループのローカルなので、私はそうは思わないと思います。

EDIT:ジョンは...屋(変数名は、独自のを保護するために変更し、ので、これはコンパイルされないになるだろう脂肪指何かを持っているかもしれません)に行くので、ここでは、タイミングコードのため

int totalRunTime = 0; 
for (int i = 0; i < numberOfIterations; i++) 
{ 
    Console.Write("Beginning run #" + (i + 1).ToString() + "..."); 
    DateTime start = DateTime.Now; 
    SimpleService ws = new SimpleService(); 
    DataSet ds = ws.CallSomeMethod(); 
    DateTime end = DateTime.Now; 
    TimeSpan runTime = end - start; 
    totalRunTime += (int)runTime.TotalMilliseconds; 
    Console.Write("completed in " + runTime.TotalMilliseconds.ToString() + " ms\n"); 
} 
Console.WriteLine("Total time: " + totalRunTime.ToString() + " ms"); 
Console.WriteLine("Average time per request: " + (totalRunTime/numberOfIterations).ToString() + " ms\n"); 
を尋ねました

答えて

1

最も簡単な方法は、プロファイラなどを実行することなく、ウェブアプリケーションログに正確な時刻を記録させることです(明らかに手に入れるほど近く)。操作を開始し、通話中のさまざまな時間と、終了する時間を記録します。時間がどこにあるのかを見ることができます。 (Stopwatchを使用すると正確さは向上しますが、やや難しいでしょう)

私は繰り返し時間があることに賛成します。それを測定しているコードを投稿できますか?私はひどくあなたのタイミングを混同しているキャプチャされた変数の問題のいくつかの並べ替えを参照して驚いていないだろう。

編集:あなたのタイミングコードは大丈夫です。それは非常に奇妙です。私はあなたもWebサービスで時間を記録し、それが同じかどうかを確認することをお勧めします。それは、意図的にそれを絞っているようなものです。

実行すると、時間がかかると思われます。つまり、最後の行が書き込まれてから約3秒後です。

+0

確かに、今編集で投稿されています。 – Chris

+0

もう1つ:テストアプリを繰り返し実行すると、ほとんど同じ時間の異なる組み合わせが表示されます。同じミリ秒の時間値ですが、異なる順序です。 – Chris

+0

re:あなたの編集...はい、もし小秒のうちの1つがヒットを実行するならば、それは間違いなくその速さについて過去をスキャンします。 リクエストするサーバーとエンドポイントサーバー(プロキシではありません)にアクセスできますので、それぞれのネットワークトレースを起動して何かを識別できるかどうか確認します。 – Chris

0

チェーン内の他のステップのベンチマーク値を取得する必要があります。あなたのリクエストがウェブサーバにヒットした時間を取得するためにサーバログを参照し、ウェブサーバが実際の「動作中の」コードにいつハンドオフするかを見るためにウェブサービスコードにいくつかのログを追加します。

これを済ませたら、最も遅い部分のパフォーマンスを絞り込み、好きなだけ繰り返すことができます。

0

SimpleServiceを作成(および作成のタイミングを決める)して数字を歪ませることはできますか? ループから取り除くとどうなりますか?

int totalRunTime = 0; 
SimpleService ws = new SimpleService(); 
for (int i = 0; i < numberOfIterations; i++) 
{ 
    Console.Write("Beginning run #" + (i + 1).ToString() + "..."); 
    DateTime start = DateTime.Now; 
    DataSet ds = ws.CallSomeMethod(); 
    DateTime end = DateTime.Now; 
    TimeSpan runTime = end - start; 
    totalRunTime += (int)runTime.TotalMilliseconds; 
    Console.Write("completed in " + runTime.TotalMilliseconds.ToString() + " ms\n"); 
} 
Console.WriteLine("Total time: " + totalRunTime.ToString() + " ms"); 
Console.WriteLine("Average time per request: " + (totalRunTime/numberOfIterations).ToString() + " ms\n"); 
関連する問題