У меня есть серверное приложение ASP.NET 3.5, написанное на C#. Он отправляет исходящие запросы в REST API с использованием HttpWebRequest и HttpWebResponse.HttpWebResponse не будет масштабироваться для одновременных исходящих запросов
У меня настроено тестовое приложение для отправки этих запросов в отдельных потоках (для того, чтобы смутно имитировать параллелизм с сервером).
Обратите внимание, что это скорее вопрос Mono/Environment, чем вопрос с кодом; поэтому имейте в виду, что приведенный ниже код не является дословным; просто вырезать/вставить функциональные биты.
Вот некоторые псевдо-код:
// 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 веб-сервер, я могу вверх по numThreads и получить тот же самый Avg ответ время с минимальным изменением: «1» пользователь или 100.
Публикация и развертывание приложения на Apache2 в среде Mono 2.10.2, время отклика масштабируется почти линейно. (т. е. 1 нить = 300 мс, 5 ниток = 1500 мс, 10 потоков = 3000 мс). Это происходит независимо от конечной точки сервера (другое имя хоста, другая сеть и т. Д.).
Использование IPTRAF (и других сетевых инструментов) выглядит так, как будто приложение открывает только 1 или 2 порта для маршрутизации всех подключений, и оставшиеся ответы должны ждать.
Мы создали аналогичное приложение PHP и развернуто в Mono с одинаковыми запросами и шкалой ответов соответствующим образом.
Я выполнил все настройки конфигурации, которые я могу представить для Mono и Apache, а параметр ONLY, который отличается от двух сред (по крайней мере, в коде), заключается в том, что иногда ServicePoint SupportsPipelining = false в Mono, тогда как истинно с моей машины.
Похоже, что ConnectionLimit (по умолчанию 2) по какой-либо причине не изменяется в Mono, но я устанавливаю его более высокое значение как в коде, так и в файле web.config для указанных узлов.
Либо я, и моя команда упускают из виду что-то важное или это какая-то ошибка в Моно.
Вы нашли решение? – Kugel