我正在尝试构建带宽测试工具,有点像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();
}
答案 0 :(得分:1)
UDP不是很好......可能你可以使用TCP&amp;检查S.O.的tcp统计数据看转发...
netstat -s
您可以使用CharacterGenerator,将BufferedOutputStream更改为64KB并删除os.flush();加速和测试...
答案 1 :(得分:1)
它不允许我发表评论,我走了。
在点击线路限制之前,您不应该看到丢弃的数据包。我建议隔离丢包的问题,并在花费大量时间查看代码之前使用工具来确定是否存在硬件/环境问题。
iperf
?然后查看丢弃的数据包统计信息https://iperf.fr/iperf-doc.php bmon
是一个简洁的工具,可以显示carrier error
,dropped
,fifo error
统计信息。