一尘不染

如何监视Linux UDP缓冲区的可用空间?

linux

我在linux上有一个Java应用程序,它可以打开UDP套接字并等待消息。

在高负载下运行了几个小时之后,有一个数据包丢失,即数据包被内核接收,但不是由我的应用程序接收(我们在嗅探器中看到丢失的数据包,在netstat中看到UDP数据包丢失,我们没有看到这些数据包)在我们的应用日志中)。

我们尝试扩大套接字缓冲区,但这并没有帮助-我们早些时候就开始丢失数据包,仅此而已。

对于调试,我想知道在任何给定时刻OS udp缓冲区有多满。谷歌搜索,但没有找到任何东西。你能帮助我吗?

PS伙计们,我知道UDP不可靠。但是-我的计算机收到所有UDP消息,而我的应用无法使用其中的一些消息。我想最大程度地优化我的应用,这就是问题的原因。谢谢。


阅读 656

收藏
2020-06-02

共1个答案

一尘不染

Linux提供了文件/proc/net/udp/proc/net/udp6,其中列出了所有打开的UDP套接字(分别用于IPv4和IPv6)。在这两个字段中,列tx_queuerx_queue以字节显示出站队列和入站队列。

如果一切正常,在这两列中通常不会看到任何与零不同的值:应用程序生成数据包后,它们将通过网络发送,而一旦这些数据包从网络到达,则应用程序将被唤醒并接收它们(recv呼叫立即返回)。rx_queue如果您的应用程序打开了套接字但没有调用recv接收数据,或者没有足够快地处理此类数据,则可能会看到上升。

2020-06-02