Использование HttpWebRequest на моно 3.2.8 Ubuntu Server 14

1

У меня есть консольное приложение, которое создает 500 потоков, и каждый поток вытягивает URL-адреса из параллельного стека и создает объекты HttpWebRequest, получает ответ и регистрирует время. Я запустил эту программу на ядре Windows Server 2012 R2 с 512 МБ ОЗУ, и он отлично работает.

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

Работа на сервере Ubuntu 14 64-разрядная (1 ГБ ОЗУ) вызывает следующие ошибки:

Warning: Degraded allocation.  Consider increasing nursery-size if the warning persists.
_wapi_connect: error looking up socket handle 0x1f (error 10038)
_wapi_connect: error looking up socket handle 0x91 (error 10038)
_wapi_connect: error looking up socket handle 0xb (error 10022)
_wapi_connect: error looking up socket handle 0x6c (error 10038)
_wapi_connect: error looking up socket handle 0x6b (error 10038)
_wapi_connect: error looking up socket handle 0x1c (error 10038)
_wapi_connect: error looking up socket handle 0x1b (error 10038)
_wapi_connect: error looking up socket handle 0xbd (error 10038)
_wapi_connect: error looking up socket handle 0x31 (error 10038)
_wapi_connect: error looking up socket handle 0x1a2 (error 10038)
_wapi_connect: error looking up socket handle 0x187 (error 10038)
_wapi_connect: error looking up socket handle 0x18c (error 10038)
Warning: Degraded allocation.  Consider increasing nursery-size if the warning persists.
_wapi_connect: error looking up socket handle 0xa5
_wapi_connect: error looking up socket handle 0x141 (error 10038)
_wapi_connect: error looking up socket handle 0x44

Вот код, который создает веб-запрос:

private static HttpWebRequest CreateRequest(string url)
{
    HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest;
    req.UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36";
    req.Method = "GET";
    req.AllowAutoRedirect = true;
    req.KeepAlive = false;
    req.MaximumAutomaticRedirections = 1;
    req.Timeout = 5000;
    req.Proxy = null;

    return req;
}

Код для вставки:

Thread thread = new Thread(() =>
{
    Stopwatch s = Stopwatch.StartNew();
    string url;
    while (urlsToPull.TryPop(out url))
    {
        try
        {
            Stopwatch indiv = Stopwatch.StartNew();
            using (HttpWebResponse res = CreateRequest(url).GetResponse() as HttpWebResponse)
            {
                if (res.StatusCode != HttpStatusCode.OK)
                {
                    Interlocked.Increment(ref badStatus);
                }
            }
            indiv.Stop();
            Add(ref urlSum, indiv.Elapsed.TotalSeconds);
            lock (goodFile)
            {
                goodFile.WriteLine(url);
            }
        }
        catch
        {
            lock (errorFile)
            {
                errorFile.WriteLine(url);
            }
            Interlocked.Increment(ref errors);
        }
        Interlocked.Increment(ref urlsChecked);
    }
    Interlocked.Decrement(ref tasks);
    s.Stop();
}, 4096);

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

Любая помощь приветствуется.

  • 0
    Чтобы настроить размер питомника из командной строки, используйте переменную среды MONO_GC_PARAMS, например: MONO_GC_PARAMS = размер питомника = 16 м
Теги:
multithreading
garbage-collection
mono

2 ответа

1

Я бы предложил обновить вашу моно версию до самого последнего. Microsoft также обновила.NET с открытым исходным кодом, поэтому вы можете попробовать, если/когда моно-команда интегрирует этот конкретный код.

0

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

  • 0
    Не использовать Windows, использовать Ubuntu Server без брандмауэра

Ещё вопросы

Сообщество Overcoder
Наверх
Меню