iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux高级流量控制tc使用
  • 542
分享到

Linux高级流量控制tc使用

2024-04-02 19:04:59 542人浏览 泡泡鱼
摘要

在做MHA测试的时候,有一个重要的环节就是测试MHA Manager节点和Master节点的网络情况,如果产生了抖动,那么MHA本身提供了一个参数secondary_check来保证,但是如果你的部署

在做MHA测试的时候,有一个重要的环节就是测试MHA Manager节点和Master节点的网络情况,如果产生了抖动,那么MHA本身提供了一个参数secondary_check来保证,但是如果你的部署环境中是一主一从的话,这个参数就不会起作用了,因为latest slave和oldest slave是同一个库,简单来说,连不上就是连不上了,至于切还是不切,这个还不好说。我们测试的场景下,有时候切,有时候不切。所以我们原本测试的MHA0.57版本就降级为了0.56,仔细测试发现,其实也存在这样的问题,综合再三,我们就把secondary_check给取消了,直接在MHA的代码里调整了超时次数的配置(默认是4次)。

接下来的问题来了,如果做更深入的测试,我们势必需要完整的模拟网络的抖动情况,这个时候传统的service network stop ; sleep xxx; service network start的方式就会受限了。潜在的一个原因就是重启服务以后,VIP就没有了。

但是基本能够模拟出MHA的场景,保证在指定的时间范围内出现抖动而不会误切。

所以经过全方位的测试,我们心里有底了,那些方面该怎么调整,那些细节需要继续深究,都有了一些心得和体会。

但是网络的测试其实感觉还是不够彻底,毕竟真实的网络抖动不会网卡不可用,而是网络超时,丢包等等。

所以如果能够尽可能模拟出网络问题,配合MHA来联调测试,就能够基本模拟出真实的问题场景了。所以tc这个方案就进入了我的视线。

linux的网络流控,控发不控收 , 所以只能对产生瓶颈网卡处的发包速率进行控制 , 流量控制过程分二种(以下内容参考自https://www.ibm.com/developerworks/cn/linux/1412_xiehy_tc/index.html

  1. 队列控制 即 QOS, 瓶颈处的发送队列的规则控制,常见的有 SFQ PRio

  2. 流量控制 即带宽控制 , 队列的排队整形, 一般为 TBF HTB

    Linux 流量控制算法分二种:

  3. 无类算法 用于树叶级无分支的队列,例如:SFQ

  4. 分类算法 用于多分支的队列,例如:PRIO TBF HTB

而涉及到的流控算法SFQ和TBF都是需要简单了解的。

SFQ(Stochastic Fairness Queueing 随机公平队列 ) 是公平队列算法家族中的一个简单实现 . 它的精确性不如其它的方法 , 但实现了高度的公平 , 需要的计算量亦很少 .

其中SFQ 只会发生在数据发生拥堵 , 产生等待队列的网卡上,出口网卡若无等待队列 ,SFQ 也不起作用 ...

令牌桶过滤器 (TBF) 是一个简单的队列规定 : 只允许以不超过事先设定的速率到来的数据包通过 , 但可能允许短暂突发流量朝过设定值 .

首先简单模拟网络超时100ms

使用如下的命令,网卡的情况具体对待,修改配置即可。

# tc qdisc add dev eth2 root netem delay 100ms

如果在本机ping测试。延时还是很低的。0.0x级别。

[root@oel642 ~]# ping 192.168.253.129

PING 192.168.253.129 (192.168.253.129) 56(84) bytes of data.

64 bytes from 192.168.253.129: icmp_seq=1 ttl=64 time=0.011 ms

64 bytes from 192.168.253.129: icmp_seq=2 ttl=64 time=0.044 ms

64 bytes from 192.168.253.129: icmp_seq=3 ttl=64 time=0.051 ms

而如果设置了超时选项,就会很均匀的产生指定的延时。

[root@oel643 ~]# ping 192.168.253.129

PING 192.168.253.129 (192.168.253.129) 56(84) bytes of data.

64 bytes from 192.168.253.129: icmp_seq=1 ttl=64 time=202 ms

64 bytes from 192.168.253.129: icmp_seq=2 ttl=64 time=101ms

64 bytes from 192.168.253.129: icmp_seq=3 ttl=64 time=101ms

64 bytes from 192.168.253.129: icmp_seq=4 ttl=64 time=101ms

64 bytes from 192.168.253.129: icmp_seq=5 ttl=64 time=100 ms

取消tc的设置,可以使用

tc qdisc del dev eth2 root netem

如下的方式会产生一个范围的延时,比如默认延时100毫秒,上下浮动10毫秒。

[root@oel642 ~]# tc qdisc add dev eth2 root netem delay 100ms 10ms

ping的结果如下:

64 bytes from 192.168.253.129: icmp_seq=278 ttl=64 time=98.3 ms

64 bytes from 192.168.253.129: icmp_seq=279 ttl=64 time=99.1 ms

64 bytes from 192.168.253.129: icmp_seq=280 ttl=64 time=93.4 ms

64 bytes from 192.168.253.129: icmp_seq=281 ttl=64 time=95.5 ms

还有几类网络情况需要考虑,比如丢包。在流量劫持的场景中,丢包率是一个需要重点关注的场景。

我们可以玩得大一些,丢包率10%,那是比较严重的问题了。

[root@oel642 ~]# tc qdisc add dev eth2 root netem loss 10%

ping的结果如下,可以看到小结的部分,丢包率是基本在10%的基本范围内,目前是8%。

64 bytes from 192.168.253.129: icmp_seq=421 ttl=64 time=0.486 ms

64 bytes from 192.168.253.129: icmp_seq=422 ttl=64 time=0.413 ms

64 bytes from 192.168.253.129: icmp_seq=423 ttl=64 time=0.616 ms

^C

--- 192.168.253.129 ping statistics ---

426 packets transmitted, 390 received, 8% packet loss, time 425724ms

rtt min/avg/max/mdev = 0.144/64.257/120.621/49.069 ms

如果数据包有重复的情况下,该如何处理。比如重复包的比例,我们设置为50%。

>tc qdisc add dev eth2 root netem duplicate 50%

使用ping的结果如下:

PING 192.168.253.128 (192.168.253.128) 56(84) bytes of data.

64 bytes from 192.168.253.128: icmp_seq=1 ttl=64 time=0.402 ms

64 bytes from 192.168.253.128: icmp_seq=1 ttl=64 time=0.409 ms (DUP!)

64 bytes from 192.168.253.128: icmp_seq=2 ttl=64 time=0.788 ms

64 bytes from 192.168.253.128: icmp_seq=3 ttl=64 time=0.887 ms

64 bytes from 192.168.253.128: icmp_seq=4 ttl=64 time=0.721 ms

64 bytes from 192.168.253.128: icmp_seq=4 ttl=64 time=0.757 ms (DUP!)

64 bytes from 192.168.253.128: icmp_seq=5 ttl=64 time=1.33 ms

比如产生坏包的情况。

tc qdisc add dev eth2 root netem corrupt 50%

ping的结果如下:

64 bytes from 192.168.253.128: icmp_seq=51 ttl=64 time=0.468 ms

64 bytes from 192.168.253.128: icmp_seq=52 ttl=64 time=0.822 ms

wrong data byte #23 should be 0x17 but was 0x15

#16 10 11 12 13 14 15 16 15 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f

#48 30 31 32 33 34 35 36 37

64 bytes from 192.168.253.128: icmp_seq=53 ttl=64 time=1.71 ms

wrong data byte #53 should be 0x35 but was 0x37

#16 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f

#48 30 31 32 33 34 37 36 37

64 bytes from 192.168.253.128: icmp_seq=54 ttl=64 time=0.000 ms

64 bytes from 192.168.253.128: icmp_seq=56 ttl=64 time=0.000 ms

如果包是乱序的,我们可以加入随机性,25%的包立即发送,其他的包延时10毫秒,系数为50%

[root@oel641 ~]# tc qdisc change dev eth2 root netem delay 10ms reorder 25% 50%

ping的结果如下所示:

64 bytes from 192.168.253.128: icmp_seq=200 ttl=64 time=1.24 ms

64 bytes from 192.168.253.128: icmp_seq=201 ttl=64 time=0.587 ms

64 bytes from 192.168.253.128: icmp_seq=202 ttl=64 time=1.01 ms

64 bytes from 192.168.253.128: icmp_seq=203 ttl=64 time=0.790 ms

64 bytes from 192.168.253.128: icmp_seq=204 ttl=64 time=0.998 ms

64 bytes from 192.168.253.128: icmp_seq=205 ttl=64 time=0.285 ms

64 bytes from 192.168.253.128: icmp_seq=206 ttl=64 time=0.882 ms

如果更复杂的场景呢,比如我们可以考虑加入流量的限制,网速控制在256k,最大延迟为50ms

[root@oel641 ~]# tc qdisc add dev eth2 root handle 1:0 netem delay 100ms

[root@oel641 ~]# tc qdisc add dev eth2 parent 1:1 handle 10: tbf rate 256kbit burst 10000 latency 50ms

速率 256kbit 突发传输 10k 最大延迟 50ms

如果不做流量控制,默认的情况下,传输可以达到90M美妙。

[root@oel642 ~]# scp 192.168.253.128:~/Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz .

Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz 100% 93MB 92.9MB/s 00:01

而如果设置了流量控制的场景,就绝对保持在一个指定范围内。

[root@oel642 ~]# scp 192.168.253.128:~/Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz .

Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz 0% 208KB 16.8KB/s 1:34:05 ETA

当然上面的场景都需要在测试环境先模拟一下,要不出现意料之外的问题就得不偿失了。

--结束END--

本文标题: Linux高级流量控制tc使用

本文链接: http://www.lsjlt.com/news/45203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP 控制流宝典:从基础到高级
    基础控制流 ASP.NET 提供了基本的控制流结构,例如条件语句和循环,用于控制程序流。 条件语句 if-else 语句:用于根据条件执行或跳过代码块。示例: if (condition) { // 执行代码块 } else ...
    99+
    2024-02-16
    ASP.NET 控制流 if-else 循环 条件跳转 异常处理
  • Linux系统中流量控制的具体应用实例
    这篇文章主要介绍“Linux系统中流量控制的具体应用实例”,在日常操作中,相信很多人在Linux系统中流量控制的具体应用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统中流量控制的具体应用实例...
    99+
    2023-06-16
  • JavaSemaphore实现高并发场景下的流量控制
    目录前言Semaphore介绍代码演示补充独占锁与共享锁公平锁与非公平锁可重入锁前言 在java开发的工作中是否会出现这样的场景,你需要实现一些异步运行的任务,该任务可能存在消耗大量...
    99+
    2024-04-02
  • 如何使用Go语言和Redis做流量控制
    如何使用Go语言和Redis做流量控制引言在一个高并发的网络应用中,流量控制是非常重要的一个环节。为了保证系统的稳定和可靠性,我们需要对流量进行限制和管理。本文将介绍如何使用Go语言和Redis来实现流量控制,并提供具体的代码示例。背景在分...
    99+
    2023-10-28
    Go语言 redis 流量控制
  • 怎么用手机控制云服务器使用流量
    首先,让我们了解云服务器是什么。云服务器是一种基于互联网的计算服务,可以在任何地方、任何时间为用户提供计算能力。相较于传统的数据中心,云服务器具有以下几个优势: 节省成本:相较于传统的数据中心,云服务器不需要建设物理机房,可以采用租用的...
    99+
    2023-10-27
    用手 流量 服务器
  • Linux流量监控工具怎么用
    这篇文章主要为大家展示了“Linux流量监控工具怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux流量监控工具怎么用”这篇文章吧。一、iftop是什么?iftop是类似于top的实时...
    99+
    2023-06-13
  • Java高并发下的流量控制方法是什么
    今天小编给大家分享一下Java高并发下的流量控制方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。这个时候如果不做任何...
    99+
    2023-06-16
  • 如何控制腾讯云服务器的流量使用
    1. 使用流量监控工具 腾讯云提供了流量监控工具,可以帮助你实时监控服务器的流量使用情况。你可以通过腾讯云控制台或者 API 来获取流量使用的详细信息。通过监控工具,你可以及时了解服务器的流量消耗情况,以便做出相应的调整。 2. 设置流量...
    99+
    2023-10-27
    腾讯 流量 服务器
  • linux中如何使用shell的awk流程控制语句
    小编给大家分享一下linux中如何使用shell的awk流程控制语句,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.条件判断语句(if)代码如下:if(表达式)...
    99+
    2023-06-13
  • 怎么用手机控制腾讯云服务器使用流量
    首先,在选择腾讯云服务器时,我们需要选择一个适合自己业务的云服务器。不同的业务需要的云服务器配置也会有所不同。例如,如果你的业务是在线游戏,那么可能需要一个高性能的服务器,而如果你的业务是在社交媒体,那么可能需要一个更适合处理高并发的服务器...
    99+
    2023-10-28
    腾讯 用手 流量
  • 流量控制在Golang中的应用技巧
    流量控制在Golang中的应用技巧 随着网络应用的发展,流量控制变得越来越重要。在Go语言中,通过一些技巧,我们可以有效地进行流量控制,保障系统的稳定性和性能。本文将介绍在Golang...
    99+
    2024-03-06
    技巧 golang 流控制 go语言
  • MVC中WebGrid控件的高级使用
    WebGrid控件是ASP.NET MVC中用于显示和编辑数据的强大工具。除了基本的显示和分页功能之外,WebGrid还提供了一些高...
    99+
    2023-09-20
    MVC
  • Java Semaphore怎么实现高并发场景下的流量控制
    这篇文章主要介绍“Java Semaphore怎么实现高并发场景下的流量控制”,在日常操作中,相信很多人在Java Semaphore怎么实现高并发场景下的流量控制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-22
  • golang流程控制语句怎么使用
    本文小编为大家详细介绍“golang流程控制语句怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang流程控制语句怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。流程控制语句:1、if语句,由...
    99+
    2023-07-04
  • 云服务器远程控制设备使用手机流量上网
    1. 了解云服务器远程控制 云服务器是一种基于云计算技术的虚拟服务器,可以通过互联网进行远程访问和管理。远程控制设备使用手机流量上网,可以通过云服务器来实现。 2. 设置云服务器 首先,你需要拥有一台云服务器,并确保其已经正确设置和配置。...
    99+
    2023-10-28
    控制设备 流量 服务器
  • PHP流程控制语句怎么使用
    在PHP中,流程控制语句用于根据不同的条件来执行不同的代码块。下面是一些常用的流程控制语句的使用方法:1. if语句:用于判断一个条...
    99+
    2023-09-05
    PHP
  • 云服务器怎么远程控制设备使用手机流量
    如果您使用云服务器来远程控制设备使用手机流量,需要以下步骤: 下载云服务提供商提供的远程控制工具。例如,Netscreen 或Sleiphon VPN。 下载并打开所需的应用程序,例如Cloud Authenticator。 在您使用设...
    99+
    2023-10-27
    控制设备 流量 服务器
  • shell流程控制语句的具体使用
    目录前言一、if - else 语句案例需求描述二、case语句三、while 语句四、until语句五、for语句for 语法写法一for 语法写法二for 语法写法三无...
    99+
    2023-05-19
    shell 流程控制语句
  • shell 流程控制语句的具体使用
    目录前言一、if - else 语句案例需求描述二、case语句三、while 语句四、until语句五、for语句for 语法写法一for 语法写法二for 语法写法三无限for循环六、select 语句八、...
    99+
    2023-05-12
    shell 流程控制语句
  • Golang使用panic控制程序错误流程
    目录1.panic是什么2.panic有什么用3.defer…recover1.panic是什么 panic() 是一个内建的函数 2.panic有什么用 作用:可以使...
    99+
    2023-05-17
    Golang异常处理 Golang panic
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作