在系统级别上,我们已经增加了最大接收缓冲区:
# 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()函数后,打印出的值始终是它设置值的两倍(例如上面的67108864),但我认为这是可以预料的。
我知道不能及时消耗数据可能会导致数据包丢失。但是,该应用程序所做的只是检查排序,然后将数据推入队列;实际处理工作在另一个线程中完成。此外,该机器是现代化的(双Xeon X5560,8 GB RAM)且负载非常轻。我们有成千上万个相同的应用程序以更高的速率接收数据,但不会出现这个问题。
除了应用程序消费过慢之外,Linux内核是否还有其他原因可能会丢弃UDP数据包?
顺带一提,这是在CentOS 4上,使用的是2.6.9-89.0.25.ELlargesmp内核。