繁体   English   中英

java UDP套接字可以处理多少个请求?

[英]How many requests can a java UDP socket handle?

我需要构建一个可以处理~10_000个请求/秒的UDP服务器。 从下面的代码开始,测试java套接字是否可以处理这些请求。

我用~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();
        }

内核在程序中丢弃数据包的可能原因是什么?

如何减少它? 还有其他实现吗?

从这个链接 ,从评论中读取,UDP协议丢失的数据包总是会发生在网络到java socket.recieve方法之间。

注意:必须弄清楚捕获的tcpdump数据包中的异常,但是丢弃了大量数据包。

tcpdump中的异常是缺少缓冲区空间 ,为了知道收到的数据包数量,我使用的是iptraf-ng ,它给出了每个端口收到的数据包数:)

辑阵线程

收到数据包后,您的代码示例不执行任何操作。 如果是这种情况,多线程无法帮助您。

但是,如果仅用于测试并且您的实际应用程序需要对接收到的数据包执行某些操作,则需要将数据包推送到另一个Thread (或其中的一个池)并立即返回以侦听下一个数据包。

基本上你需要最小化socket.receive()两次调用之间的时间。

注意:这不是唯一可用于此案例的多线程模型。

缓冲区大小

使用映射到SO_RCVBUF的socket.setReceiveBufferSize增加缓冲区大小:

增加SO_RCVBUF可以允许网络实现在数据包到达时比使用receive(DatagramPacket)接收更快地缓冲多个数据包。

但是,这只是一个提示

网络实现使用SO_RCVBUF选项作为调整底层网络I / O缓冲区大小的提示

如果您的设置允许,您也可以直接进入操作系统并更改缓冲区的大小。

不相干

注意:仅在您不确定数据包大小小于1024字节时才读取此内容。

对于通用数据包,您的数据包缓冲区大小似乎很低,这可能会导致错误,因为:如果数据包大于您的缓冲区,则不会出现错误,它将忽略溢出的字节。

编辑:

其他多线程模型

注意:这是一个想法,我不知道它是否真的有效。

3个主题:

  • 线程A:处理数据包
  • 线程B1:接收数据包
  • 线程B2:接收数据包

在里面:

  • 原子计数器设置为0
  • B1正在接收,B2正在等待。

而循环的B1:

  • 而计数器> 0等待
  • 计数器+ = 1
  • 收到了包裹
  • counter - = 1
  • 唤醒B2
  • 将数据包推送到A的队列

B2相同。

这是线程图(收到数据包的行):

B1 [--------|---]    [--------|---]
B2          [--------|---]    [--------|---]

您可以使用AsynchronousDatagramChannel检查在此处使用NIO2 API的可能性,而不是使用线程。

帮助链接: https//www.ibm.com/developerworks/library/j-nio2-1/index.html

可以处理的实际数据包数取决于您和目标服务器的CPU,它们与您的实际程序之间的网络连接。 如果你需要一个高性能的Java网络解决方案,你可以使用珊瑚反应堆: http//www.coralblocks.com/index.php/the-simplicity-of-coralreactor/

UDP的一个缺点是它没有TCP提供的可靠传送保证UDP协议的mcast_recv_buf_sizeucast_recv_buf_size配置属性用于指定接收缓冲区的数量。

它取决于您用来运行程序的操作系统。 不同操作系统的缓冲区大小为:

 <table sytle="width:100% border:1px solid black"> <tr> <th><b>Operating System</b></th> <th><b>Default Max UDP Buffer (in bytes)</b></th> </tr> <tr><td>Linux</td> <td>131071</td></tr> <tr><td>Windows</td> <td>No known limit</td></tr> <tr><td>Solaris</td> <td>262144</td></tr> <tr><td>FreeBSD</td> <td>262144</td></tr> <tr><td>AIX</td> <td>1048576</td></tr> </table> 

因此UDP负载处理取决于机器以及OS配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM