diff --git a/source/tools/detect/net_diag/rtrace/image/tcp-delay.png b/source/tools/detect/net_diag/rtrace/image/tcp-delay.png new file mode 100644 index 0000000000000000000000000000000000000000..4fdac38272d55fc652b44570a5cca462342e22d9 Binary files /dev/null and b/source/tools/detect/net_diag/rtrace/image/tcp-delay.png differ diff --git a/source/tools/detect/net_diag/rtrace/rtrace-delay/README.md b/source/tools/detect/net_diag/rtrace/rtrace-delay/README.md index 5b7921c4b2444416e96192851bd279aea8d99b1f..2679de1f772ea592df91013db78c81d9132185c8 100644 --- a/source/tools/detect/net_diag/rtrace/rtrace-delay/README.md +++ b/source/tools/detect/net_diag/rtrace/rtrace-delay/README.md @@ -38,6 +38,20 @@ rtrace-delay是一款基于eBPF的网络抖动诊断工具,目前icmp(ping ### tcp抖动诊断原理 +下图是tcp的数据报文和ack报文路径,黑色箭头是数据报文路径,红色箭头是ack报文路径。 + +发送端报文路径包括:报文发送路径及ack报文接收路径。 + +* 报文发送路径是:tcp_sendmsg->dev_hard_start_xmit->驱动; +* ack报文接收路径是:驱动->__netif_receive_skb_core->tcp_ack; + +接收端报文路径包括:报文接收路径及ack报文发送路径。 + +* 报文接收路径包括:驱动->__netif_receive_skb_core->tcp_queue_rcv->tcp_cleanup_rbuf; +* ack报文发送路径是:__tcp_transmit_skb->驱动->__netif_receive_skb_core->驱动; + +![tcp抖动诊断默认打点路径](../image/tcp-delay.png) + ## 使用说明 使用流程: @@ -153,3 +167,56 @@ params = ["basic"] ### tcp抖动诊断 +#### 步骤一 + +运行`sysak rtrace-delay --gen ./config`生成toml配置文件到config目录下。这里我们主要关注`./config/ping-sender.toml`和`./config/ping-receiver.toml`两个配置文件。 + +#### 步骤二: + +根据需求修改配置文件 + +#### 步骤三 + +* 诊断syn报文发送端路径,命令是`sysak rtrace-delay --config ./config/syn-sender.toml --delay 0 --latency 1000`,下面是样例输出; + +```shell +FUNCTION DELAY: 11.160.62.52:57580 - 100.67.130.98:80 + + (0,0)__ip_queue_xmit+0 (0,1)tcp_rcv_state_process+0 + ↓ ↑ + 48us 39us + ↓ ↑ + (0,0)dev_hard_start_xmit+0 →27662us→ (0,1)__netif_receive_skb_core+0 +``` + +* 诊断tcp数据报文发送端路径,命令是`sysak rtrace-delay --config ./config/tcp-sender.toml --delay 0 --latency 1000`,下面是样例输出; + +```shell +FUNCTION DELAY: 127.0.0.1:36360 - 127.0.0.1:30197 + + (0,20)tcp_sendmsg+0 + ↓ + 18us + ↓ + (0,20)__ip_queue_xmit+0 (0,20)tcp_ack+0 + ↓ ↑ + 12us 6us + ↓ ↑ + (0,20)dev_hard_start_xmit+0 →2342us→ (0,20)__netif_receive_skb_core+0 +``` + +* 诊断tcp数据报文接收端路径,`sysak rtrace-delay --config ./config/tcp-receiver.toml --delay 0 --latency 1000`,下面是样例输出; + +```shell +FUNCTION DELAY: 127.0.0.1:36362 - 127.0.0.1:30197 + +(0,21)__netif_receive_skb_core+0 (0,21)tcp_cleanup_rbuf+0 + ↓ ↑ + 5us 28us + ↓ ↑ + (0,21)tcp_rcv_established+0 (0,21)dev_hard_start_xmit+0 + ↓ ↑ + 6us 6us + ↓ ↑ + (0,21)tcp_queue_rcv+0 →14us→ (0,21)__ip_queue_xmit+0 +``` \ No newline at end of file diff --git a/source/tools/detect/net_diag/rtrace/rtrace-delay/src/gen.rs b/source/tools/detect/net_diag/rtrace/rtrace-delay/src/gen.rs index 21b9b64232facdc267d4bd2cd8e62719d102942b..b4e7ea549760159f63eecd25a6b73a3b9f13fbd3 100644 --- a/source/tools/detect/net_diag/rtrace/rtrace-delay/src/gen.rs +++ b/source/tools/detect/net_diag/rtrace/rtrace-delay/src/gen.rs @@ -96,19 +96,135 @@ params = ["basic"] } fn gen_config_syn_sender(path: &mut PathBuf) -> Result<()> { + let text = r#" +[basic] +debug = false +duration = 0 +protocol = "tcp-syn" +recv = false + +[[filter]] +pid = 0 +dst = "0.0.0.0:0" +src = "0.0.0.0:0" + +[[function]] +name = "__ip_queue_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "dev_hard_start_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "__netif_receive_skb_core" +enable = true +params = ["basic"] + +[[function]] +name = "tcp_rcv_state_process" +enable = true +params = ["basic"] + "#; path.push("syn-sender.toml"); + gen_config_common(path, &text)?; path.pop(); Ok(()) } fn gen_config_tcp_receiver(path: &mut PathBuf) -> Result<()> { + let text = r#" + [basic] +debug = false +duration = 0 +protocol = "tcp" +recv = true + +[[filter]] +pid = 0 +dst = "0.0.0.0:0" +src = "0.0.0.0:0" + +[[function]] +name = "__ip_queue_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "dev_hard_start_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "__netif_receive_skb_core" +enable = true +params = ["basic"] + +[[function]] +name = "tcp_rcv_established" +enable = true +params = ["basic"] + +[[function]] +name = "tcp_queue_rcv" +enable = true +params = ["basic"] + +[[function]] +name = "tcp_cleanup_rbuf" +enable = true +params = ["basic"] + "#; path.push("tcp-receiver.toml"); + gen_config_common(path, &text)?; path.pop(); Ok(()) } fn gen_config_tcp_sender(path: &mut PathBuf) -> Result<()> { + let text = r#" + # sudo RUST_BACKTRACE=1 cargo run -- --config /work/rtrace_parser/delay_send.toml --delay + +[basic] +debug = false +duration = 0 +protocol = "tcp" +recv = false + +[[filter]] +pid = 0 +dst = "0.0.0.0:0" +src = "0.0.0.0:0" + +[[function]] +name = "tcp_sendmsg" +enable = true +params = ["basic"] + +[[function]] +name = "__ip_queue_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "dev_hard_start_xmit" +enable = true +params = ["basic"] + +[[function]] +name = "__netif_receive_skb_core" +enable = true +params = ["basic"] + +[[function]] +name = "tcp_ack" +enable = true +params = ["basic"] + "#; path.push("tcp-sender.toml"); + gen_config_common(path, &text)?; path.pop(); Ok(()) }