gpt4 book ai didi

linux - 如何监控 Linux UDP 缓冲区可用空间?

转载 作者:IT老高 更新时间:2023-10-28 12:35:58 28 4
gpt4 key购买 nike

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

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

我们尝试扩大套接字缓冲区,但这无济于事 - 我们开始丢失数据包,但仅此而已。

为了调试,我想知道操作系统 udp 缓冲区在任何给定时刻有多满。谷歌搜索,但没有找到任何东西。你能帮帮我吗?

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

最佳答案

UDP 是一个完全可行的协议(protocol)。正确的工作是正确的工具!

如果您有一个程序等待 UDP 数据报,然后在返回等待另一个数据报之前去处理它们,那么您经过的处理时间需要始终快于数据报的最坏情况到达率。如果不是,则 UDP 套接字接收队列将开始填满。

这对于短脉冲是可以容忍的。队列完全按照它应该做的事情——排队数据报,直到你准备好。但是如果平均到达率经常导致队列中的积压,那么是时候重新设计你的程序了。这里有两个主要选择:通过巧妙的编程技术减少经过的处理时间,和/或多线程您的程序。还可以在程序的多个实例之间进行负载平衡。

如前所述,在 Linux 上,您可以检查 proc 文件系统以获取有关 UDP 的状态。例如,如果我 cat /proc/net/udp 节点,我会得到如下内容:

$ cat /proc/net/udp   
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
40: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 3466 2 ffff88013abc8340 0
67: 00000000:231D 00000000:0000 07 00000000:0001E4C8 00:00000000 00000000 1006 0 16940862 2 ffff88013abc9040 2237
122: 00000000:30D4 00000000:0000 07 00000000:00000000 00:00000000 00000000 1006 0 912865 2 ffff88013abc8d00 0

由此,我可以看到用户 id 为 1006 的套接字正在监听端口 0x231D (8989),并且接收队列大约为 128KB。由于 128KB 是我系统的最大大小,这告诉我我的程序在跟上到达的数据报方面非常薄弱。到目前为止已经有 2237 个丢弃,这意味着 UDP 层不能再将任何数据报放入套接字队列,必须丢弃它们。

您可以随着时间的推移观察程序的行为,例如使用:

watch -d 'cat /proc/net/udp|grep 00000000:231D'

还要注意 netstat 命令做同样的事情:netstat -c --udp -an

我的小程序的解决方案是多线程。

干杯!

关于linux - 如何监控 Linux UDP 缓冲区可用空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2289830/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com