Отправка HttpWebRequest занимает много времени, когда клиент сразу получает пакет - PullRequest
2 голосов
/ 01 сентября 2010

Я пытаюсь выполнить нагрузочное тестирование сервера Comet-ish с помощью клиента нагрузочного тестирования C #, который создает много запросов HttpWebRequests (1000+).Я обнаружил, что через несколько минут случайным образом серверу требуется много времени для получения некоторых запросов.Клиент думает, что он успешно отправил запрос, но на самом деле на сервер требуется 40 секунд, и в этот момент уже слишком поздно.(Так как это сервер типа Comet, сервер заканчивает тем, что отбрасывал сеанс клиента, что плохо).Я попытался переключиться с асинхронных вызовов на синхронные, но это не имело значения.

Проблема должна быть на стороне клиента.Я провел некоторую трассировку с Wireshark, и оказалось, что запрос на самом деле занимает около 40 секунд, чтобы добраться до сетевого канала из клиентского программного обеспечения!Сервер обслуживает запрос сразу же, когда получает его по своему каналу.

Может быть, C # не работает, потому что запрос выглядит точно так же, как запрос, который я сделал ранее, и кеширует его по какой-то странной причине?Я включаю "Cache-Control: no-cache" в мои ответы, чтобы вообще избежать кэширования.

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Я столкнулся с аналогичной проблемой, когда впервые создавал свой веб-сканер, который каждую минуту выполняет более 2000 запросов. Проблема оказалась в том, что я не всегда своевременно выбрасывал объекты HttpWebResponse. Механизм сбора / завершения сборки мусора не будет работать, когда вы делаете запросы с такой скоростью.

Неважно, выполняете ли вы синхронные или асинхронные запросы. Просто убедитесь, что вы всегда звоните response.Close().

1 голос
/ 01 сентября 2010

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

Чтобы обойти это, добавьте это в файл app.config:

  <system.net>
    <connectionManagement>
      <remove address="*"/>
      <add address="*" maxconnection="10" />
    </connectionManagement>
  </system.net>

Поэкспериментируйте с maxconnection, чтобы увидеть, гдеваш эффективный верхний предел составляет.

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