我需要建立一个UDP服务器,它可以处理〜10_000个请求/秒。从下面的代码开始,测试一个java套接字是否可以处理这些数量的请求。java UDP套接字可以处理多少个请求?
我轰击服务器在〜9000个请求一分钟,
Total number of requests sent from the client : 596951
和TCP转储我看到
90640 packets captured
175182 packets received by filter
84542 packets dropped by kernel
UDP服务器代码:
try (DatagramSocket socket = new DatagramSocket(port)) {
System.out.println("Udp Server started at port :" + port);
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket incomingDatagramPacket = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(incomingDatagramPacket);
LinkedTransferQueue.add(incomingDatagramPacket);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
} catch (SocketException e) {
e.printStackTrace();
}
内核在程序中丢弃数据包的可能原因是什么? m 这个简单吗?
如何减少?任何其他实现?
从这个link,从评论阅读,失去UDP协议到Java socket.recieve方法甚至网络之间可以随时发生的数据包。
注意:必须弄清楚捕获到的tcpdump数据包中的异常情况,但丢弃的数据包数量相当多。
了tcpdump的异常是lack of buffer space,为了知道数据包的数量收到,我现在用的是iptraf-ng这给每个端口:)
可能的原因是套接字接收缓冲区填满了,因为没有足够快地读取它。尝试减少'println()'调用,例如每百个数据报一个。 – EJP
@EJP我已经做到了,但仍然有丢包 –
使用多线程来同时处理多个数据包。您也可以在您的以太网接口和交换机上相应的端口上激活流量控制(但丢失数据包是一种被告知拥塞的方式,因此激活流量控制可能会产生不良的副作用)。 –