Во-первых, числа, которые вы указываете для iperf, звучат неправильно.
1.6Гигабайт / сек = 12.8Гигабит / сек.Это выходит за рамки стандарта 10Gigabit Ethernet.Возможно, вы захотите повторить цифры.
Если с другой стороны у вас есть Gigabit ethernet, то я бы ожидал что-нибудь от 60-100 мегабайт / сек
Основным фактором в Windows являетсябуферы передачи и приема.Если вы увеличите их, вы увидите резкое увеличение производительности.Я не слишком уверен, как вы это делаете в Java.
Под C это делается так (например, буфер 1MegaByte):
int sndbuf_size = 1048575;
result = setsockopt(thesocket, SOL_SOCKET, SO_SNDBUF, &sndbuf_size, sizeof(int));
if (result != -1){
socklen_t optlen = sizeof(sndbuf_size);
if (getsockopt(native_socket, SOL_SOCKET, SO_RCVBUF, &sndbuf_size, &optlen) != -1){
printf(" SO_SNDBUF: %d bytes\n", sndbuf_size);
}
} else {
printf("Error setting socket opt SO_SNDBUF (%d)\n", errno);
}
Убедитесь, что вы вызываете это как для отправки, так и дляПолучите буферы до того, как вы вызовете прослушивание или соединение.Примечание: если вы вызовите setsockopt со значением, превышающим максимальное, это не даст сбоя.Чтобы узнать, насколько он велик после вызова, вы должны вызвать getsockopt с той же опцией.
РЕДАКТИРОВАТЬ: Другим узким местом может быть ваш протокол или диск.Однако, если вы просто передаете файлы через сокет с очень небольшими издержками, например, HTTP-сервер, вам следует рассмотреть возможность использования API TransmitFile в Windows или sendfile, если вы используете Linux.
sendfile () копирует данные междуодин дескриптор файла и другой.Поскольку это копирование выполняется в ядре, sendfile () более эффективен, чем комбинация read (2) и write (2), которая потребует передачи данных в пространство пользователя и из него.
Функция TransmitFile используетдиспетчер кэша операционной системы для извлечения данных файла и обеспечения высокопроизводительной передачи данных файла через сокеты.