socket reuse
От: vf  
Дата: 09.11.10 10:19
Оценка:
Немного кросс-пост, но я думаю в данном случае уместно, приложение дот.нет-ское.

В сетях задал вопросы
Автор: vf
Дата: 09.11.10
, кто использовал reuse сокетов в .net, что удалось получить в сравнении без него?
Re: socket reuse
От: Nikolay_P_I  
Дата: 09.11.10 14:36
Оценка:
Здравствуйте, vf, Вы писали:

А дает оно в основном то, что для перезапуска сервера не надо ждать 2 минуты, пока нужный порт освободится.

Если мы про один и тот же Reuse говорим
Re[2]: socket reuse
От: vf  
Дата: 09.11.10 14:51
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>А дает оно в основном то, что для перезапуска сервера не надо ждать 2 минуты, пока нужный порт освободится.

N_P>Если мы про один и тот же Reuse говорим

Не о разном Я про Socket.Disconnect(true), после чего этот сокет можно заново использовать.
Re: socket reuse
От: Jolly Roger  
Дата: 10.11.10 04:50
Оценка:
Здравствуйте, vf, Вы писали:

vf>В сетях задал вопросы
Автор: vf
Дата: 09.11.10
, кто использовал reuse сокетов в .net, что удалось получить в сравнении без него?


Я делал в нативной реализации, но отдельно степень влияния реюзинга не замерял. ИМХО, это довольно сложно корректно оценить. Но я замерял время создания экземпляра сокета с помощью функций socket и WsaSocket, и там счёт шёл на миллисекунды, если не на десятки, просто не помню конкретные цифры, да они и от железа наверняка зависят.
"Нормальные герои всегда идут в обход!"
Re[2]: socket reuse
От: vf  
Дата: 10.11.10 10:14
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Я делал в нативной реализации, но отдельно степень влияния реюзинга не замерял. ИМХО, это довольно сложно корректно оценить. Но я замерял время создания экземпляра сокета с помощью функций socket и WsaSocket, и там счёт шёл на миллисекунды, если не на десятки, просто не помню конкретные цифры, да они и от железа наверняка зависят.


А DisconnectEx не замерял? Я щас в клиенте считаю время для 8К подключений:
Create/Bind sockets: 827ms (всегда одно и то же)
Disconnect(reuse) sockets: 686ms, 733ms, 796ms, 795 (плавает)

Что при таком раскладе можно выгадать?

int start1 = Environment.TickCount;

for (int x = 0; x < sockets.Length; x++)
{
    sockets[x] = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    sockets[x].Bind(new IPEndPoint((server.AddressFamily == AddressFamily.InterNetwork) ? IPAddress.Any : IPAddress.IPv6Any, 0));
}

Console.WriteLine(@"Create/Bind sockets: {0} ms", Environment.TickCount - start1);

for (int x = 0; x < sockets.Length; x++)
    sockets[x].Connect(server);

int start2 = Environment.TickCount;

for (int x = 0; x < sockets.Length; x++)
{
    sockets[x].Disconnect(true);
}

Console.WriteLine(@"Disconnect(reuse) sockets: {0} ms", Environment.TickCount - start2);
Re[3]: socket reuse
От: Jolly Roger  
Дата: 10.11.10 15:35
Оценка:
Здравствуйте, vf, Вы писали:

vf>А DisconnectEx не замерял? Я щас в клиенте считаю время для 8К подключений:

vf>Create/Bind sockets: 827ms (всегда одно и то же)
vf>Disconnect(reuse) sockets: 686ms, 733ms, 796ms, 795 (плавает)

А CloseSocket сколько? DisconnectEx не замерял, ибо бессмычленно. Там Shutdown с обменом квитанциями и FIN'ами. Что мерять, TTL и скорость отклика клиентской машины?


vf>Что при таком раскладе можно выгадать?


827 — 795?
Мало? Ну у каждого свои критерии, не используйте тогда

PS Да, кстати, а bind-то зачем?
"Нормальные герои всегда идут в обход!"
Re[4]: socket reuse
От: vf  
Дата: 10.11.10 21:27
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>PS Да, кстати, а bind-то зачем?


И то правда.. тогда совсем уныло получается

Create -----> Disconnect            Create ---------> Close
219 ms        749 ms                265 ms            405 ms
266 ms        687 ms                218 ms            452 ms
358 ms        889 ms                234 ms            328 ms
453 ms        702 ms                234 ms            468 ms


JR>А CloseSocket сколько? DisconnectEx не замерял, ибо бессмычленно. Там Shutdown с обменом квитанциями и FIN'ами. Что мерять, TTL и скорость отклика клиентской машины?


Shutdown принудительно поставил и там и там.

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

            for (int i = 0; i < 20; i++)
            {
                MeasureConnectDisconnect(8129, server1, true);
                Thread.Sleep(240 * 1000);
                MeasureConnectDisconnect(8129, server1, false);
            }


        private static void MeasureConnectDisconnect(int count, IPEndPoint server, bool disconnectOrClose)
        {
            Socket[] sockets = new Socket[count];

            int start1 = Environment.TickCount;

            for (int x = 0; x < sockets.Length; x++)
                sockets[x] = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            Console.WriteLine(@"Create sockets: {0} ms", Environment.TickCount - start1);


            for (int x = 0; x < sockets.Length; x++)
                sockets[x].Connect(server);


            int start2 = Environment.TickCount;

            for (int x = 0; x < sockets.Length; x++)
            {
                sockets[x].Shutdown(SocketShutdown.Both);
                if (disconnectOrClose)
                    sockets[x].Disconnect(true);
                else
                    sockets[x].Close();
            }

            Console.WriteLine((disconnectOrClose ? "Disconnect(reuse)" : "Close") + @" sockets: {0} ms",
                Environment.TickCount - start2);
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.