我需要建立一個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我已經做到了,但仍然有丟包 –
使用多線程來同時處理多個數據包。您也可以在您的以太網接口和交換機上相應的端口上激活流量控制(但丟失數據包是一種被告知擁塞的方式,因此激活流量控制可能會產生不良的副作用)。 –