HttpWebResponse не масштабируется для одновременного выполнения исходящие запросы

У меня есть серверное приложение ASP.NET 3.5, написанное на C#. Он отправляет исходящие запросы к REST API, используя HttpWebRequest и HttpWebResponse.

Я настроил тестовое приложение для отправки этих запросов в отдельные потоки (для приблизительной имитации параллелизма с сервером).

Обратите внимание, что это скорее вопрос о моно/среде, чем вопрос о коде; поэтому имейте в виду, что приведенный ниже код не является дословным; просто вырезание/вставка функциональных битов.

Вот некоторый псевдокод:

// threaded client piece
int numThreads = 1;
ManualResetEvent doneEvent;

using (doneEvent = new ManualResetEvent(false))
        {

            for (int i = 0; i < numThreads; i++)
            {

                ThreadPool.QueueUserWorkItem(new WaitCallback(Test), random_url_to_same_host);

            }
            doneEvent.WaitOne();
        }

void Test(object some_url)
{
    // setup service point here just to show what config settings Im using
    ServicePoint lgsp = ServicePointManager.FindServicePoint(new Uri(some_url.ToString()));

        // set these to optimal for MONO and .NET
        lgsp.Expect100Continue = false;
        lgsp.ConnectionLimit = 100;
        lgsp.UseNagleAlgorithm = true;
        lgsp.MaxIdleTime = 100000;        

    _request = (HttpWebRequest)WebRequest.Create(some_url);


    using (HttpWebResponse _response = (HttpWebResponse)_request.GetResponse())
    {
      // do stuff
    } // releases the response object

    // close out threading stuff

    if (Interlocked.Decrement(ref numThreads) == 0)
    {
        doneEvent.Set();
    }
}

Если я запускаю приложение на своем локальном компьютере для разработки (Windows 7) на веб-сервере Visual Studio, я могу увеличить количество потоков и получить одинаковое среднее время отклика с минимальными вариациями. это 1 «пользователь» или 100.

При публикации и развертывании приложения в Apache2 в среде Mono 2.10.2 время отклика увеличивается почти линейно. (т. е. 1 поток = 300 мс, 5 потоков = 1500 мс, 10 потоков = 3000 мс). Это происходит независимо от конечной точки сервера (другое имя хоста, другая сеть и т. д.).

При использовании IPTRAF (и других сетевых инструментов) создается впечатление, что приложение открывает только 1 или 2 порта для маршрутизации всех подключений, а остальные ответы приходится ждать.

Мы создали аналогичное приложение PHP и развернули его в Mono с теми же запросами и соответствующим масштабированием ответов.

Я просмотрел каждый параметр конфигурации, который только мог придумать для Mono и Apache, и ЕДИНСТВЕННЫЙ параметр, который отличается между двумя средами (по крайней мере, в коде), заключается в том, что иногда ServicePoint SupportsPipelining=false в Mono, в то время как это правда с моей машины.

Кажется, что ConnectionLimit (по умолчанию 2) по какой-то причине не изменяется в Mono, но я устанавливаю более высокое значение как в коде, так и в файле web.config для указанных хостов.

Либо я и моя команда упускаем из виду что-то важное, либо это какая-то ошибка в Mono.

12
задан abatishchev 11 December 2014 в 18:26
поделиться