![为什么数据包被丢弃(kfree_skb)?](https://linux22.com/image/205513/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%95%B0%E6%8D%AE%E5%8C%85%E8%A2%AB%E4%B8%A2%E5%BC%83%EF%BC%88kfree_skb%EF%BC%89%EF%BC%9F.png)
我目前正在发送〜9mpps,每个数据包有72字节大,并且是UDP DNS请求。这些数据包正在发送到我使用 intel i40e 接口的戴尔服务器。服务器正在使用其全部 32 个队列,每个队列的队列大小为 4096。所有客户端源数据包在大约 150 个池中都有随机源 MAC 地址和随机 IP 地址。请注意,没有网卡显示丢弃/丢弃的数据包。
我可以看到所有单播流量都以 ~9mpps 的ethtool -S
速度到达接口。rx_unicast
但rx_packets
显示为 1.7mpps。出口接口显示正在处理并发送出我转发的另一个接口的相同数量的数据包。请注意,生成的流量到达的远端 IP 只是一个 L3 接口,没有 DNS 服务在其上侦听,因此数据包会在远端被丢弃(这是正常的)。
当我使用时,dropwatch
我可以看到以下消息:
224021 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
235277 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
232467 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
227083 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
228235 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
227216 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
221967 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
225418 drops at kfree_skb+1e (0xffffffffa33f5cbe) [software]
我尝试查找0xffffffffa33f5cbe
其中的内容/boot/System.map-$(uname -r)
,但没有列出任何内容。我尝试查找 kfree_skb 的作用,但是这它释放 sk_buff 内存。 (不是很有帮助)
我相信这可能是内核(转发、netfilter 等)或 CPU 能够处理如此多流量的限制,但是我想知道为什么/并演示数据包在内核中被丢弃的原因。
如何确定所有流量未发送的原因?
更新 我能够删除以下模块
nf_conntrack
ip_tables
iptables_filter
x_tables
这提高了处理速度,我现在可以看到我能够发送〜4.5mpps,看来netfilter是瓶颈。删除其他模块将更加有效。好奇其他人是否有关于为什么会发生这种情况的详细信息?