网络编程实现了基准测试

时间:2011-03-22 00:28:20

标签: java c networking performance benchmarking

我一直在使用Java和C进行一些网络编程。到目前为止,我只能使用不同的技术实现大约15兆字节/秒的网络速度,并且看起来无论消息大小超过环回,远程网络也产生大致相同的速度。

尽管我已经使用iperf来衡量网络速度,但它达到了1.6 GigaBytes / sec。这显然是一项重大改进。有没有人有任何想法如何在实际编程中实现这种速度?

3 个答案:

答案 0 :(得分:1)

首先,您为iperf提供的数字听起来不对。

1.6千兆字节/秒= 12.8吉比特/秒。这超出了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之前为发送和接收缓冲区调用此函数。 注意:如果使用大于max的值调用setsockopt,则不会失败。要想知道通话后它有多大,你必须使用相同的选项调用getsockopt。

编辑:另一个瓶颈可能是您的协议或磁盘。但是,如果您只是通过一个像HTTP服务器那样只需很少开销的套接字传输文件,那么您应该考虑使用Windows下的TransmitFile API或sendfile(如果您使用的是Linux)。

sendfile()在一个文件描述符和另一个文件描述符之间复制数据。因为这种复制是在内核中完成的,所以sendfile()比read(2)和write(2)的组合更有效,这需要将数据传入和传出用户空间。

TransmitFile函数使用操作系统的缓存管理器来检索文件数据,并通过套接字提供高性能的文件数据传输。

答案 1 :(得分:1)

警告:接下来是错误的ASCII艺术!

如果您的网络模式如下所示,您将永远无法获得真正的高速度:

REQ   REQ   REQ   REQ   REQ
   RSP   RSP   RSP   RSP

如果你能做到这一点,那将会给你一些极好的速度:

REQ-A REQ-B REQ-C REQ-D REQ-E
     RSP-A RSP-B RSP-C RSP-D RSP-E

有几件事可以锁定你进入第一个模式。单线程,单状态进程。一个锁线严重的多线程进程。

如果您使用异步,多状态网络或者使用非常好的多线程(或多个进程),则可以使用第二种模式。

如果可以,您应该尽量避免为每个请求/响应使用新的TCP会话。当每个TCP会话寻求其最佳速率时,它会导致网络过载和未充分利用的混合。一些新的网络协议如SCTP更好。像流水线这样的HTTP协议选项也很好。

答案 2 :(得分:0)

确定你每秒获得1.6 Giga Bytes 吗?这可以达到13 Gbps。除非您坐在具有多个光纤链路的核心网络交换机上(并且以某种方式设法生成那么多流量),否则我认为您的号码可能存在问题。