2009-09-24 2 views
3

Я запускаю консольное приложение C#, которое многопоточно. Основной процесс извлекает некоторые данные для работы, разбивает его на настраиваемое количество меньших наборов данных, а затем генерирует одинаковое количество потоков для обработки каждого подмножества данных.Многопоточные вызовы и соперничество WebRequest

Для обработки отдельной записи поток должен выполнить вызов веб-службы с использованием класса WebRequest и метода POST. Запрос отправляется с помощью GetRequestStream(), и ответ извлекается с помощью GetResponse().

В псевдокоде, процедура выглядит следующим образом:

prepare WebRequest data; 
* get time (start-of-Processing); 
Stream str = request.GetRequestStream(); 
Write data to stream; 
stream.Close(); 
WebResponse resp = request.GetResponse(); 
* get time (response-received); 
process response; 
finally close response stream; 

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

  • На 4 нитей, наши очевидно накладные для передачи данных и извлечения потока ответа средних вокруг секунды.
  • Когда мы запускаем более 4 потоков, среднее значение увеличивается с максимальными значениями , которые встречаются в десятки секунд!

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

Это заставляет меня полагать, что мы сталкиваемся с каким-то ограничением ресурсов по отношению к классу WebRequest; но это ограничение для каждого процесса, а не ограничение машины. Я знаю, что мы могли бы сделать наши вызовы асинхронно с BeginGetRequestStream и BeginGetResponse, но я скептически отношусь к тому, что это окажет положительное влияние, если мы на самом деле нажмем какой-то ресурс?

На что я могу обратить внимание, чтобы мы могли увеличить количество разделов в рамках одного процесса без снижения производительности?

+0

Спасибо за детали. –

ответ

13

Вам необходимо поднять количество одновременных веб-запросов, которые вы можете сделать на одном хосте, иначе ваши потоки будут в основном ждать друг друга, несмотря на то, что имеется много доступных ЦП. Самый простой способ сделать это состоит в использовании <connectionManagement> элемент app.config:

<configuration> 
    <system.net> 
    <connectionManagement> 
     <add address = "*" maxconnection = "100" /> 
    </connectionManagement> 
    </system.net> 
</configuration> 
+0

Спасибо, Джон - это звучит обнадеживающе ... Я дам больше отзывов, как только у меня будет возможность проверить это, что будет завтра :) – Nij

+0

Спасибо, спасибо спасибо John! Мало того, что это изменение конфигурации позволило мне увеличить количество потоков, которые я запускал, это также сократило эту «одну секунду» накладные расходы совсем немного, поэтому я, должно быть, уже довольно раздумывал. – Nij

+0

https://support.microsoft.com/en-us/kb/821268 Этот Microsoft KB рекомендует 12 * Число процессоров в качестве значения, но также перечисляет другие значения конфигурации, которые напрямую связаны с производительностью исходящих асинхронных вызовов в сочетании с ASP .Net threadpool. – Mazrick

0

Сколько процессоров/ядер делает компьютер, который вы используете это на есть?

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

+0

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

+0

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

+0

Мы сейчас перейдем к четырехъядерному ядру, но на двухъядерном ядре мы действительно нашли «ограничение» 4-запроса. Процессор работает примерно на 1-2% от этого процесса, так же как и Network (в соответствии с диспетчером задач), поэтому ни одна из этих проблем не является проблемой ... – Nij

 Смежные вопросы

  • Нет связанных вопросов^_^