在CVM上模拟VPC网络故障原理笔记

2023-09-30 21:06:03 浏览数 (1)

Overview

日常在给客户做稳定性治理时,像实例级别的不可用、主从切换、重启、性能等维度的场景做的比较多,随着治理的深入,大家慢慢把目光专项应用程序更不可控的场景:网络数据包异常。

调研腾讯云混沌平台的cvm故障注入,大概原理是通过tc用户态工具,结合netem内核模块,来模拟网络的延迟、丢包、重复、损坏和乱序等问题。用来验证用户程序在网络故障的情况下,可靠程度。

此前没有接触这一块,决定梳理下他们在命令行下,是怎么完成流量注入、工作流程流程、关键原理,概念等

命令行下故障注入操作

延迟注入示例

注入步骤

代码语言:javascript复制
tc qdisc del dev eth0 root ## 清理eth0规则
tc qdisc add dev eth0 root handle 1: prio ## 添加classful qdisc:prio
tc qdisc add dev eth0 parent 1:3 netem delay 200ms ## 注入延迟500ms故障
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 10.100.4.17 flowid 1:3 ## 使用u32分类器,限制发往10.100.4.17的数据报文,发生延迟

注入结果

代码语言:javascript复制
64 bytes from 10.100.4.17: icmp_seq=0 ttl=64 time=204.997 ms
64 bytes from 10.100.4.17: icmp_seq=1 ttl=64 time=200.882 ms
64 bytes from 10.100.4.17: icmp_seq=2 ttl=64 time=212.912 ms
64 bytes from 10.100.4.17: icmp_seq=3 ttl=64 time=207.659 ms
64 bytes from 10.100.4.17: icmp_seq=4 ttl=64 time=205.736 ms
64 bytes from 10.100.4.17: icmp_seq=5 ttl=64 time=203.994 ms^C
--- 10.100.4.17 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss

丢包注入示例

注入命令

代码语言:javascript复制
tc qdisc del dev eth0 root ## 清理eth0规则
tc qdisc add dev eth0 root handle 1: prio ## 添加classful qdisc:prio
tc qdisc add dev eth0 parent 1:3 netem loss 10% ## 注入丢包10%故障
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 10.100.0.0/16 flowid 1:3 ## 使用u32分类器,限制发往10.100.0.0/16段的数据报文,发生丢包

注入结果

代码语言:javascript复制
PING 10.100.4.17 (10.100.4.17): 56 data bytes
64 bytes from 10.100.4.17: icmp_seq=1 ttl=64 time=0.302 ms
64 bytes from 10.100.4.17: icmp_seq=2 ttl=64 time=0.173 ms
64 bytes from 10.100.4.17: icmp_seq=3 ttl=64 time=0.171 ms
64 bytes from 10.100.4.17: icmp_seq=4 ttl=64 time=0.180 ms
64 bytes from 10.100.4.17: icmp_seq=5 ttl=64 time=0.160 ms
64 bytes from 10.100.4.17: icmp_seq=6 ttl=64 time=0.173 ms
64 bytes from 10.100.4.17: icmp_seq=7 ttl=64 time=0.186 ms
64 bytes from 10.100.4.17: icmp_seq=8 ttl=64 time=0.183 ms
64 bytes from 10.100.4.17: icmp_seq=9 ttl=64 time=0.180 ms^C
--- ai-dance.com ping statistics ---
10 packets transmitted, 9 packets received, 10.0% packet loss

关键概念说明

TC简介

Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:

netem简介

netem是linux内核提供的Network emulation服务,可以用来模拟广域网下的延迟、丢包、重复、损坏和乱序等问题,以便测试和调试网络应用程序和协议。

2.6版本后的linux发行版都已经在内核中启用了netem

QDISC

Queueing discipline的简称,工作在内核和网卡驱动之间,内核会给每个网卡配置QDISC;当内核要通过网卡向外发送数据包时,报文会先在对应网卡的QDISC排队;紧接着内核会从这个QDISC获取尽可能多的报文,给对应网卡驱动。

默认的QDISC是pfifo,仅是一个先进先出的队列,对数据包不做任何处理。当网卡不能马上处理数据包时,pfifo这个队列规则,暂时先存储数据包。

CLASS

某些QDISC可以包含类,而类可以进一步包含其它qdisc。报文按照一定规则在不同的class入队/出队,最终流向根QDISC对应的网卡驱动。

其中CLASS又分为classful qdisc和classless qdisc,classful qdisc可以包含其它qdisc。

FILTER

classful qdisc拥有FILTER,用来决定数据包该进入哪个qdisc。当一个数据包进入了包含子class的class,那么这个数据包需要被分类。有很多方法可以实施分类,FILTER只是其中一种。从属于这个class的所有filter都会被调用,匹配到一个后,数据包就进队到对应的class。

FILTER是QDISC的一部分,不是单独主体。

操作原理

CLASS组成一个树,每个CLASS只有一个父节点。一个CLASS可以有多个子节点。有些QDISC可以动态添加class(CBQ, HTB),有些(PRIO)在创建时,就一定确定了子节点的数量。

允许动态添加自节点的class,可以有0个或多个子class来接收入队流量。

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞