Масштабирование нескольких запросов HttpWeb? - PullRequest
4 голосов
/ 13 июля 2010

Я создаю серверное приложение, которое должно выполнять множество HTTP-запросов к паре других серверов на постоянной основе.В настоящее время я в основном настраиваю около 30 потоков и постоянно выполняю HttpWebRequests синхронно в каждом потоке, обеспечивая пропускную способность около 30 запросов в секунду.

Я действительно устанавливаю ServicePoint ConnectionLimit в app.config, так что это не ограничивающий фактор.

Мне нужно резко увеличить это значение.По крайней мере, мне понадобится больше мощности процессора, но мне интересно, получу ли я какие-либо преимущества, используя асинхронные методы объекта HttpWebRequest (например, .BeginGetResponse ()), а не создавая потоки самостоятельно и используясинхронные методы (например: .GetResponse ()) в этих потоках.

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Если вы работаете в Windows NT, то класс System.Net.Sockets.Socket всегда использует порты завершения ввода-вывода для асинхронных операций. И HTTPWebRequest в асинхронном режиме использует асинхронные сокеты и, следовательно, будет использовать IOCP.

Без проведения детального бенчмаркинга сложно сказать, находится ли наше узкое место внутри HttpWebRequest или в стеке, в вашем приложении или на удаленной стороне, на сервере. Но не случайно, asyncc даст вам лучшую производительность, потому что в конечном итоге он будет использовать IOCP под прикрытием. И переопределить приложение для асинхронного не так сложно.

Итак, я бы посоветовал вам сначала изменить архитектуру вашего приложения на асинхронную. Затем посмотрите, какую максимальную пропускную способность вы получаете. Затем вы можете начать бенчмаркинг и выяснить, где находится узкое место, и устранить его.

0 голосов
/ 14 июля 2010

Самым быстрым результатом для меня на данный момент является использование 75 потоков с синхронизацией httpwebrequest.Около 140 запросов в секунду на сервере Windows 2003, 4core 3 ГГц, 100 МБ соединения.

Асинхронный запрос Httprequest / winsock застрял со скоростью около 30-50 запросов / сек.Не тестировал синхронизацию winsock, но, думаю, это даст примерно тот же результат, что и httpwebrequest.

Тесты были проведены против 1 200 000 каналов блога.

В прошлом месяце мы боролись с этим, поэтому было бы интересно узнать, удалось ли кому-нибудь выжать больше из .net?

EDIT

Новый тест: Получено 350req / sec с компонентом xfserver iocp.Использовал кучу потоков с одним экземпляром каждый перед любым большим результатом.«Клиентская часть» библиотеки имела несколько действительно раздражающих ошибок, которые усложняли реализацию, чем «серверная часть».Не то, что вы просите и не рекомендуется, а какой-то шаг.

Далее: В предыдущем тесте winsock не использовалось 3.5 SocketAsyncEventArgs, что будет следующим.

ОТВЕТ

Ответ на ваш вопрос, нет, это не будет стоить усилий.Асинхронные методы HttpWebRequest выгружают основной поток, сохраняя загрузку в фоновом режиме, но не улучшают количество / масштабируемость запросов.(по крайней мере, не в 3.5, может отличаться в 4.0?)

Тем не менее, стоит обратить внимание на создание собственной оболочки вокруг асинхронных сокетов / SocketAsyncEventArgs, где работает iocp, и, возможно, реализует шаблон начала / конца аналогичноHttpWebRequest (для простейшей реализации в текущем коде).Улучшение действительно огромное.

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