Tcp расчет времени туда и обратно с использованием Java - PullRequest
0 голосов
/ 06 июля 2011

Когда я выполняю трассировку от одного Solaris M / C к другому, используя сетевой интерфейс 10 ГБ, это займет 0,073 мс для 40-байтовых пакетов.

Когда я делаю то же самое в Java, время намного дольше. Это длиннее даже после 10К итерации. Что может быть причиной ?

Java: отправитель (фрагмент)

Socket sendingSocket = new Socket(address, RECEIVER_PORT);
 sendingSocket.setTcpNoDelay(true);
 OutputStream outputStream = sendingSocket.getOutputStream();
 byte[] msg = new byte[64]; // assume that it is populated. 
 for (int i = 0; i < 10000; i++) {
    long start = System.nanoTime();
    outputStream.write(msg,0,64);
    outputStream.flush();

    inputStream.read(msg,0,64);  // inputStream is initialized like outputstream 
    long end = System.nanoTime(); 
 }  

Это занимает больше времени, чем 69 миллисекунд, и даже не зависит от размера байта. Даже если я уменьшу его до 1 байтового массива, он все равно займет 69 миллисекунд. Любой комментарий / предложение?

Другие наблюдения: 1. OutputStream.write и flush занимает всего 6 микросхем. 2. Точно так же на другой стороне TCPReceiver, которая получает и записывает обратно, это займет всего 6 микро.

Решение: Спасибо всем, что вы ответили на этот запрос. Я обнаружил, что это связано с размером буфера сокета:

Размер буфера по умолчанию установлен на Solaris M / C.

Размер полученного буфера 49152.

Размер буфера отправки 7552.

Я увеличил размер буфера сокета, и производительность почти совпадает с traceRoute.

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Вы не сравниваете подобное с подобным. ICMP и TCP являются разными протоколами.

Если вы хотите решить, есть ли задержка в вашем коде, JVM, стеке Solaris TCP или сети, которую вы должны начать с tcpdump / wireshark и т. Д.

1 голос
/ 06 июля 2011

Вероятно, это связано с рядом факторов.Для начала, установление канала TCP требует времени.Есть несколько пакетов, которые должны быть отправлены между обеими конечными точками, чтобы установить надежный носитель.Это не относится к сообщениям ICMP, это просто отдельные пакеты.Фактически, поскольку вы не видите разницы во времени, которое требуется для передачи данных, независимо от их размера, вы, вероятно, можете предположить, что количество времени, необходимое для фактической передачи данных (вы говорите об очень небольшом объеме данныхв любом случае при соединении 10 Гбит) ничтожно мало по сравнению со временем, необходимым для установления канала.Кроме того, вполне возможно, что есть некоторые накладные расходы, связанные с тем, что вы используете Java (язык байт-кода), а не что-то вроде C или C ++, которое изначально работает на оборудовании.

0 голосов
/ 06 июля 2011

Время подключения может составлять около 20 мс.Вам нужно протестировать, используя существующее соединение.

Стек TCP довольно медленно проходит через ядро.На многих машинах у нас уходит около 50-100 человек.Вы можете уменьшить это, используя драйверы / поддержку обхода ядра.

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