linux网卡接收缓存,网络-如何监视Linux UDP缓冲区的可用空间?

UDP是一种完全可行的协议。 这是正确的工具,可以完成正确的工作!

如果您有一个程序等待UDP数据报,然后先处理它们,然后再返回以等待另一个数据报,则您经过的处理时间必须始终比最坏情况下的数据报到达率要快。 如果不是,则UDP套接字接收队列将开始填充。

短时间突发可以忍受。 队列完全按照预期的方式工作-将数据报排队,直到您准备就绪为止。 但是,如果平均到达率经常导致队列积压,那么该重新设计程序了。 这里有两个主要选择:通过巧妙的编程技术减少经过的处理时间,和/或对程序进行多线程处理。 也可以在程序的多个实例之间进行负载平衡。

如前所述,在Linux上,您可以检查proc文件系统以获取有关UDP最新状态的状态。 例如,如果我netstat -c --udp -an /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

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

干杯!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值