首先,您为 iperf 提供的数字听起来不正确。
1.6Gigabytes/sec = 12.8Gigabits/s。这超出了 10Gigabit 以太网标准。
也许你想重做数字。
另一方面,如果您有千兆以太网,那么我预计 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);
}
在调用listen 或connect 之前,请确保为发送和接收缓冲区调用此方法。
注意:如果你调用 setsockopt 的值大于最大值,它不会失败。要了解调用后它的实际大小,您必须使用相同的选项调用 getsockopt。
编辑:另一个瓶颈可能是您的协议或磁盘。但是,如果您只是通过像 HTTP 服务器这样开销很小的套接字传输文件,您应该考虑在 Windows 下使用 TransmitFile API,如果您使用的是 Linux,则应考虑使用 sendfile。
sendfile() 在一个文件描述符和另一个文件描述符之间复制数据。因为这种复制是在内核中完成的,所以 sendfile() 比 read(2) 和 write(2) 的组合更有效,后者需要在用户空间和用户空间之间传输数据。
TransmitFile 函数使用操作系统的缓存管理器来检索文件数据,并通过套接字提供高性能的文件数据传输。