我有一个将日志发送到位于另一台机器上的日志服务器的应用程序。这些日志作为 UDP 数据包发送。我的问题是我看到 UDP 日志丢失。我在与日志消息一起打印的 UDP 数据包中有一个正在运行的序列号。我在日志服务器上看到了序列号的空白。起初我怀疑我的日志服务器是罪魁祸首,但看起来问题出在发件人机器上丢包。环境是:发送方和接收方都在装有 CentOS 6.4 (2.6.32-358.el6.i686) 的 HP G8 服务器上运行。以下是我已经尝试或观察到的事情:
- 发送方和接收方 (/proc/net/snmp) 上的 SndbufErrors 和 RcvbufErrors 均为 0
- ifconfig 没有显示任何错误
- 这些机器连接的交换机不报告任何丢包/错误
- 在发送方运行 tcpdump(增加 tcpdump 缓冲区,以便 tcpdump 报告 0 个数据包丢弃)表明接收方错过的数据包实际上没有发送(或者至少这些数据包没有显示在捕获的 pcap 上)
- 数据包发送的最大速率约为每秒 30K(速率不是恒定的。通常它保持在非常低的每秒 500 左右,偶尔会出现峰值。在这些峰值期间数据包会丢失)。接口为 100Mbps 链路。
- 数据包的大小从大约 80 字节到 300 字节不等。
- NIC 上的环形缓冲区是: eth0 的环形参数:预设最大值:RX:2047 RX Mini:0 RX Jumbo:0 TX:511 当前硬件设置:RX:200 RX Mini:0 RX Jumbo:0 TX:511
- 网卡驱动程序信息:驱动程序:tg3 版本:3.124 固件版本:5719-v1.38 NCSI v1.2.37.0 总线信息:0000:03:00.0 支持统计:是支持测试:是支持 eeprom 访问:是支持注册转储:是支持私人标志:否
- NIC 统计数据也显示没有错误(通过 ethtool -S eth0)
- 如果我在与发件人相同的机器上运行我的日志服务器,则不会丢失日志。
我不知道这些数据包在哪里被丢弃(堆栈/NIC/NW ...)。我知道 UDP 不可靠,并且由于多种原因可能会丢弃数据包。但是我仍然无法找到为什么这些数据包在发送方的情况下被丢弃的原因。在不同的旁注中,我的应用程序还有许多 TCP 连接(大约 8-10 个),每个连接都有流量。