linux内核丢弃udp报文,c++ Linux UDP数据包丢失的原因

我有一个

Linux C应用程序接收有序的UDP数据包.由于排序,我可以很容易地确定数据包何时丢失或重新排序,即当遇到“间隙”时.该系统具有处理差距的恢复机制,但最好避免出现差距.使用一个简单的基于libpcap的数据包嗅探器,我已经确定硬件级别的数据没有差距.但是,我看到我的应用程序有很多差距.这表明内核正在丢弃数据包;通过查看/ proc / net / snmp文件来确认.当我的应用程序遇到差距时,Udp InErrors计数器增加.

在系统级,我们增加了最大接收缓冲区:

# sysctl net.core.rmem_max

net.core.rmem_max = 33554432

在应用层面,我们增加了接收缓冲区大小:

int sockbufsize = 33554432

int ret = setsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF,

(char *)&sockbufsize, (int)sizeof(sockbufsize));

// check return code

sockbufsize = 0;

ret = getsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF,

(char*)&sockbufsize, &size);

// print sockbufsize

在调用getsockopt()之后,打印值总是为它设置的2x(上例中为67108864),但是我相信这是预期的.

我知道不能足够快地消耗数据可能会导致数据包丢失.但是,所有这些应用程序都是检查顺序,然后将数据推入队列;实际的处理是在另一个线程中完成的.此外,该机器是现代的(双Xeon X5560,8 GB RAM)和非常轻载.我们有几十个相同的应用程序以更高的速度接收数据,没有遇到这个问题.

除了太慢的消费应用程序,还有其他原因导致Linux内核可能丢弃UDP数据包?

FWIW,这是在CentOS 4,内核2.6.9-89.0.25.ELlargesmp.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值