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

在高负载下运行几个小时后,会出现数据包丢失,即数据包由内核接收,而不是由我的应用程序接收(我们在sniffer中看到丢失的数据包,在netstat中看到丢失的UDP数据包,在应用程序日志(log)中看不到这些数据包).

我们试图扩大套接字缓冲区,但这没有帮助——我们后来开始丢失数据包,但仅此而已.

对于调试,我想知道在任何给定的时刻,OS udp缓冲区有多满.谷歌搜索了一下,但什么也没找到.你能帮助我吗?

各位,我知道UDP是不可靠的.然而,我的计算机接收所有UDP消息,而我的应用程序无法使用其中的一些消息.我想最大限度地优化我的应用程序,这就是问题的原因.谢谢

推荐答案

Linux提供了文件/proc/net/udp/proc/net/udp6,其中列出了所有打开的UDP套接字(分别用于IPv4和IPv6).在这两个队列中,第tx_queue列和第rx_queue列都以字节为单位显示了传出队列和传入队列.

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

Linux相关问答推荐

如何告诉链接器不要在链接的共享库中查找某些符号?

"‘operator<<’匹配失败(可能是因为我的C++/GCC版本问题)"

命令行中使用`..`为什么会导致权限被拒绝错误?

使用awk命令将以:分隔的两个文件合并的方法

加载ELF64头文件为什么会导致分段错误?

在 bash 中获取目录或文件的基本名称的快速且正确的方法

使用具有特定值的字段对文件进行排序

如何判断 Ubuntu 12.04 LTS 上是否安装了多个版本的 PHP?

安装 mod_ssl 亚马逊 Linux

按主机名的 IPv6 地址

未定义的引用 'shm_open',已在此处添加 -lrt 标志

qstat 和长作业(job)名称

从文本文件中删除奇数行或偶数行

cmake : 从脚本设置环境变量

将所有文件扩展名转换为小写

使用 Bash 查找和复制文件

PostgreSQL psql 终端命令

Postgresql -bash:psql:找不到命令

crontab 在特定小时之间每 15 分钟运行一次

'grep' 的返回码在 Linux 上不如预期