为什么网络的吞吐量如此之慢?

时间:2015-07-05 22:13:39

标签: java sockets tcp network-programming nio

我刚刚以简单的客户端 - 服务器方式进行了两个线程的通信。这是发件人的代码:

    //Open and configure the socket   
    SocketChannel channel = SocketChannel.open();
    InetSocketAddress address = new InetSocketAddress("localhost", 5050);
    channel.connect(address);
    channel.socket().setTcpNoDelay(true);
    channel.socket().setKeepAlive(false);
    int count = 0;
    OutputStream os = channel.socket().getOutputStream();
    int amount = 50;

    //Prepare a simple buffer to send.
    byte[] data = new byte[amount];
    Arrays.fill(data, (byte)1);

    double start = System.currentTimeMillis(); //Time it.

    //Send and print the throughput each 50000 tuples.
    while(true){
        count++;
        IOUtils.write(data, os);
        if(count % 50000==0){
            double totalsize = count;
            double end = System.currentTimeMillis();
            double time = (end-start)/1000;
            System.out.println("Writer:"+(totalsize/time)/1000000+"Tuples/second");
        }
    }

对于接收者:

    .....//Just accepting the channel.

    //After accepting the channel. Read the tuples.

    readC.socket().setTcpNoDelay(true);
    readC.socket().setKeepAlive(false);
    byte[] readbuf = new byte[50];
    InputStream is = readC.socket().getInputStream();
    double start = System.currentTimeMillis();
    while(true){
        IOUtils.read(is, readbuf);
    }

输出表明每秒的平均元组仅为0.1 x 10 ^ 6,这意味着每个元组= 50字节,我只能获得5MB / s的吞吐量。

这两个线程都在本地计算机上运行,​​因此我认为理想的吞吐量远远大于我得到的。

我还检查了wireshark的原因,并发现,当我发送一个元组时,让我们说,从端口71581到端口5050.然后会发送一堆tcp数据包,大约300个数据包! !!!!并且,在这300个数据包中,只有1个数据包真正在71581到5050之间发送数据。

对于其他299个数据包,一个奇怪的事情是通信在端口71581和71580(邻居端口)之间。任何机构都可以解释为什么它做了这么愚蠢的事情?我可以禁用吗?

任何建议,评论和想法都会非常感激!!!!!!!!!!!谢谢!

0 个答案:

没有答案