VPN TX 数据包丢失

VPN TX 数据包丢失

我在两个对等点之间设置了 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 解决了我的问题。

相关内容