Устранение неполадок со скоростью веб-службы - PullRequest
2 голосов
/ 25 марта 2009

C # .NET 2.0, если это применимо.

Я собираюсь начать, чтобы понять, почему наш веб-сервис работает медленно - этот веб-сервис перепрыгивает через прокси-сервер в другой домен, запрашивает хранимую процедуру для некоторых данных, а затем возвращает int / строка / набор данных, в зависимости от того, что я просил. Я только что написал консольное приложение, которое неоднократно запрашивает его таким же образом, чтобы я мог собрать некоторую статистику для начала.

Keep-alive выключен выключен для каждого запроса, по какой-то устаревшей причине никто не задокументировал, так что тут сразу пахнет.

При повторении одного и того же запроса несколько раз я заметил странное поведение. Вот мой вывод, который показывает, сколько времени потребовалось для каждой итерации, чтобы выполнить запрос и вернуть данные.

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 отслеживает его локально для каждого цикла, поэтому я не думаю, что это так.

РЕДАКТИРОВАТЬ: Джон спросил код синхронизации, так что поехали (имена переменных изменены, чтобы защитить проприетарные, так что, возможно, что-то упитанное, что сделает это не компилировать) ...

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");

Ответы [ 3 ]

1 голос
/ 25 марта 2009

Самый простой способ, без запуска профилировщика и т. Д., - заставить веб-приложение регистрировать точное время (как можно ближе к нему, очевидно), когда оно запускает операцию, в разное время внутри звонка и во время его завершения. , Тогда вы можете увидеть, где это занимает время. (Использование Stopwatch даст вам больше точности, но это будет немного сложнее.)

Я согласен, что странно, что у вас были повторения. Не могли бы вы опубликовать код, который его измеряет? Я не был бы чрезвычайно удивлен, увидев какую-то проблему с захваченной переменной, которая сбивает вас с толку.

РЕДАКТИРОВАТЬ: Ваш код времени выглядит хорошо. Это очень странно. Я предлагаю вам также записать время на веб-сервисе и посмотреть, выглядит ли он так же. Это как будто что-то намеренно душит.

Когда вы запускаете его, похоже, что требуется время, которое он говорит, то есть - то есть когда он говорит, что это заняло 3 секунды, это примерно через 3 секунды после написания последней строки?

0 голосов
/ 26 марта 2009

Может ли создание (и время создания) 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");
0 голосов
/ 25 марта 2009

теперь вам нужно получить некоторые контрольные значения для других шагов в цепочке. Просмотрите журналы сервера, чтобы узнать время, когда ваш запрос достиг веб-сервера, и добавьте некоторую регистрацию в код веб-службы, чтобы увидеть, когда веб-сервер переключается на действительный «рабочий» код.

Как только вы это сделаете, вы можете начать сужать производительность самой медленной партии, повторяйте столько, сколько хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...