3

私はIPerfのような帯域幅テストツールを構築しようとしていますが、Javaでは、予想よりも多くのパケット損失が発生しているようですが、わずかに高い帯域幅(約30〜40Mb / sで開始)で、誰かができることを望んでいましたパケットが失われる原因となる最適化または間違っていることを指摘してください。

これは、メトリックを収集する別のクラスにサイズ 2000 のキューを渡す受信コードであり、パケットから関連情報のみを渡します。NIO の使用

while (data.isRunning()) 
{
    if(channel.receive(buf) != null)
    {

    int j = buf.array().length;
    //add the packets important information to the queue
    packet_info.add(new PacketInfoContainer(buf.getLong(j-12), System.nanoTime(), buf.getInt(j-4)));

    // if we have 2000 packets worth of information, time to handle it!
    if((packet_info.size() == 2000))
    {
        Runnable r1;
        //if this is running on the client side, do it this way so that we can calculate progress
        if(client_side)
        {
            if(data_con.isUserRequestStop())
            {
                System.out.println("suposed to quit");
                data.stopTest();
                break;
            }
            if(packets_expected > 0)
            {
                total_packets_received+=1000;
                setChanged();
                notifyObservers("update_progress" + Integer.toString( (int) (((double)total_packets_received/(double)packets_expected) * 1000) ) );
            }
            r1 = new PacketHandler(packet_info, results, buffer_size, client);
        }
        //server side, no nonsense
        else
        {
            r1 = new PacketHandler(packet_info, results, buffer_size);
        }
        pool.submit(r1);
        packet_info = new LinkedList<PacketInfoContainer>();
    }

}
buf.clear();

}

4

2 に答える 2

1

まだコメントすることはできません。

ワイヤ制限に達するまで、ドロップされたパケットは表示されません。ドロップされたパケットの問題を特定し、ツールを使用して、コードを調べるのに多くの時間を費やす前に、ハードウェアや環境に問題があるかどうかを確認することをお勧めします。

于 2016-08-07T11:36:09.753 に答える
1

UDPはあまりうまくいきません... TCPを使用してSOのtcp統計をチェックして、再送信を確認できるかもしれません...

netstat -s

CharacterGeneratorを使用して、BufferedOutputStream を 64KB に変更し、os.flush(); を削除できます。高速化してテストするには...

于 2013-01-05T22:06:54.713 に答える