本篇文章給大家帶來的內容是關于如何使用 iperf 測試并排查 udp 丟包問題,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
使用 iPerf 測試并排查 UDP 丟包問題
現象描述
使用高速通道打通同一個地域(Region)下的兩臺 VPC 網絡類型的 ECS 實例后,通過 iPerf 測試兩臺實例內網之間 UDP 丟包率,測試帶寬達到 50 Mbps 以上時出現了丟包現象,且隨著帶寬的增加,丟包率出現增長趨勢。如下圖:
問題分析
假設兩臺網絡類型的 ECS 實例的私有 IP 為 VPC ECS A(192.168.104.235) 與 ECS B(10.182.83.13),并用 Netcat(NC)監聽并發送 UDP 數據封包,則網絡類型的 ECS 實例 A 與實例 B 通信鏈路圖如下:
其數據流走向為:
ECS?A(192.168.104.235)->?NC?1(100.105.59.3)->?VGW(10.141.166.253)->?NC?2(100.105.59.9)->?ECS?B(10.182.83.13)
我們需要對其鏈路進行排查分析,找出丟包的最終原因。
解決方法
注意:由于只看到了源 Netcat (即 NC 1) 和目的 Netcat (即 NC 2) 之前的通信,抓包排查要避免誤區,即隨意判斷是 Netcat (NC) 之間的直接通信丟包。
排查時會發現源端 eth0 的抓包發給了 VGW,但是在目的端抓包發現外殼封裝了目的 NC 2 IP,如示例:
?[Time?]?17:32:07.130844???Point:?`input?` ?[ETHER]?24:4c:07:33:0e:02?->?00:04:37:28:00:65,?eth_type:?0x0800 ?[IPv4?]?100.105.59.3?->?10.141.166.253 ?proto:?17,?ver:?04,?ihl:?05,?len:?1534,?ident:?59824,R:?0,?DF:?1,?MF:?0,?offset:?0,?ttl:?60,?chksum:?0xfe47 ?[UDP??]?sport:?46703,?dport:?250,?size:?1514,?chksum:?0x0000 ?[VxLan]?debug_flag:?0,?vlan_tag:?0,?payload_type:?0,?version:?1,?tunnel_id:?1878597,?tos:?0,?tof:?0 ?[IPv4?]?192.168.104.235?->?10.182.83.13 ?proto:?17,?ver:?04,?ihl:?05,?len:?1498,?ident:?55469,R:?0,?DF:?1,?MF:?0,?offset:?0,?ttl:?64,?chksum:?0xd50e ?[UDP??]?sport:?36687,?dport:?5001,?size:?1478,?chksum:?0xa0aa ?[Time?]?17:32:07.130854???Point:?`output` ?[ETHER]?24:4c:07:33:0e:02?->?00:04:37:28:00:65,?eth_type:?0x0800 ?[IPv4?]?100.105.59.3?->?100.105.59.9 ?proto:?17,?ver:?04,?ihl:?05,?len:?1534,?ident:?59824,R:?0,?DF:?1,?MF:?0,?offset:?0,?ttl:?60,?chksum:?0x0000 ?[UDP??]?sport:?46703,?dport:?250,?size:?1514,?chksum:?0x0000 ?[VxLan]?debug_flag:?0,?vlan_tag:?0,?payload_type:?0,?version:?1,?tunnel_id:?2125861,?tos:?0,?tof:?0 ?[IPv4?]?192.168.104.235?->?10.182.83.13 ?proto:?17,?ver:?04,?ihl:?05,?len:?1498,?ident:?55469,R:?0,?DF:?1,?MF:?0,?offset:?0,?ttl:?64,?chksum:?0xd50e ?[UDP??]?sport:?36687,?dport:?5001,?size:?1478,?chksum:?0xa0aa
確認數據包通過 VGW 后,開始統計抓包信息:
ECS A 通過 iPerf 打 UDP 流量:iperf -c 10.182.83.13 -u -b 600m
ECS B 通過 iPerf 接收:iperf -u -s
在實例內部抓包。
ECS?A:sudo?tcpdump?-w?~/client.pcap?-n?-i?eth0?src?host?192.168.104.25?and?src?port?1234 ECS?B:sudo?tcpdump?-w?~/server.pcap?-n?-i?eth0?src?host?192.168.104.25?and?src?port?1234
在兩個 NC eth0 處抓包。
NC?1:sudo?houyi-tcpdump?-w?/apsara/i-6we6pnh19n2q7srkgomd.pcap?-nnK?-i?eth0 ?udp?and?src?inner_port?1234?and?dst?inner_host?10.182.83.13 NC?2:sudo?houyi-tcpdump?-B?4096?-w?/apsara/i-6we53i9h3ducbju5rmuw.pap?-nn?-i?eth0? udp?-K?and?src?inner_host?192.168.104.235?and?src?inner_port?1234
在 ASW 和 LSW 部署流統。
100.105.59.3:46728?->?10.141.166.253:250
注意:由于目的端包外殼自動封裝了目的 NC 1 IP,所以 VGW 端數據包的報文格式為:100.105.59.3:46728 -> 100.105.59.9:250。
根據抓包結果分析。
?ECS A 丟包/發包:171/510203
?NC 1 eth0 發包:510204
?ASW 和 LSW 流統計出包:510204
?NC 2 eth0 收包:510204
?ECS B 收包:510204,capture 507442, dropped by kernel 2162
以上分析定位到實例協議棧丟包,通過調整實例內部 UDP Buffer Sizes 來調整網絡棧(Stack),默認的 UDF Buffer Size 為 212992(208 KB),您可以調整至 2097152(2 MB)。
/proc/sys/net/core/rmem_default?#默認的接收數據包內存大小 /proc/sys/net/core/rmem_max?#最大的接收數據包內存大小
調整后測試 UDP 丟包情況。