前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在CVM上模拟VPC网络故障原理笔记

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

原创
作者头像
AIOPS
发布2023-09-30 21:06:03
2040
发布2023-09-30 21:06:03
举报
文章被收录于专栏:高可用高可用

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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Overview
  • 命令行下故障注入操作
    • 延迟注入示例
      • 注入步骤
      • 注入结果
    • 丢包注入示例
      • 注入命令
      • 注入结果
  • 关键概念说明
    • TC简介
      • netem简介
        • QDISC
          • CLASS
            • FILTER
              • 操作原理
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com