我在两个对等点之间设置了 wireguard VPN。在高负载下,我遇到了每次 50-1500 个数据包的丢包高峰(请参阅出站丢弃 wg0)。这种情况仅发生在一台服务器上。
# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eno1 1500 2079788141 0 0 1572 3128566305 0 0 0 BMRU
wg0 1420 538066564 46 0 0 810751810 0 26374 0 OPRU
...
# ip a s eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ab:cd:ef:fe:dc:ba brd ff:ff:ff:ff:ff:ff
...
# ip a s wg0
83: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
...
...
我用了滴滴手表和性能记录找出内核丢弃这些数据包的原因。
perf:
kworker/2:2-wg- 32301 [002] 541917.031566: skb:kfree_skb: skbaddr=0xffff9f378059d000 protocol=2048 location=0xffffffffaf
ffffffffaf3fb324 kfree_skb+0x74 ([kernel.kallsyms])
ffffffffaf3fb324 kfree_skb+0x74 ([kernel.kallsyms])
ffffffffaf3fb363 kfree_skb_list+0x13 ([kernel.kallsyms])
ffffffffaf412778 __dev_queue_xmit+0x888 ([kernel.kallsyms])
ffffffffaf489c6f ip_finish_output2+0x2cf ([kernel.kallsyms])
ffffffffaf48b8d9 ip_output+0x69 ([kernel.kallsyms])
ffffffffaf4dcb7d iptunnel_xmit+0x15d ([kernel.kallsyms])
ffffffffc10a3777 send4+0x127 ([kernel.kallsyms])
ffffffffc10a3e15 wg_socket_send_skb_to_peer+0x95 ([kernel.kallsyms])
ffffffffc10a110f wg_packet_tx_worker+0xaf ([kernel.kallsyms])
ffffffffaeea15b7 process_one_work+0x1a7 ([kernel.kallsyms])
ffffffffaeea1c80 worker_thread+0x30 ([kernel.kallsyms])
ffffffffaeea6f02 kthread+0x112 ([kernel.kallsyms])
ffffffffaf600215 ret_from_fork+0x35 ([kernel.kallsyms])
dropwatch:
[2019-12-08 16:29:36.293087] 82 drops at kfree_skb_list+13 (0xffffffffaf3fb363)
我查看了内核源代码,有几个问题
kfree_skb_list
这是什么意思语境?- 数据包在插入 eno1 的 txqueue 或其他地方时是否被丢弃?
- 可以调整哪些设置来解决此问题?
答案1
增加 eno1 接口的 txqueuelen 解决了我的问题。