如何在linux下使用tc优雅的实现网络限流

author author     2022-12-21     539

关键词:

1. Linux 下的流量控制原理

通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作:

  • 增加延时
  • 丢包
  • 重新排列
  • 重复、损坏
  • 速率控制 在 qdisc-class-filter 结构下,对流量进行控制需要进行三个步骤:
  • 创建 qdisc 队列 上面提到 Linux 是通过包的排队进行流量的控制,那么首先得有一个队列。
  • 创建 class 分类 class 实际上,就是划分流量策略分类。比如划分两档流量限速 10MBps、20MBbs。
  • 创建 filter 过滤 虽然创建了 class 分类,但是并没有将任何的 IP、Port 绑定到 class 上,此时并不会有控制作用。还需要创建 filter 将指定的 IP、Port 绑定到 class 上,才能使流量控制 class 生效于资源。

TC 是 Linux 下提供的流量控制工具,也是 Cilium/eBPF 等网络组件的核心基础设施之一。

2. 限制指定 IP、Port 对本机的访问速度

2.1 查看网卡

ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 1.1.1.1 netmask 255.255.254.0 broadcast 1.1.1.1
inet6 1::1:1:1:1 prefixlen 64 scopeid 0x20<link>
ether 1:1:1:1:1:1 txqueuelen 1000 (Ethernet)
RX packets 2980910 bytes 2662352343 (2.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1475969 bytes 122254809 (116.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

2.2 配置 qdisc-class-filter

  • 创建 qdisc 根队列
tc qdisc add dev eth0 root handle 1: htb default 1
  • 创建第一级 class 绑定所有带宽资源 注意这里的单位是 6 MBps,也就是 48 Mbps。
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 6MBps burst 15k
  • 创建子分类 class 可以创建多个子分类,对资源的流量进行精细化管理。
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 6MBps ceil 10MBps burst 15k

这里 ceil 设置的是上限,正常情况下限速为 6MBps,但网络空闲时,可以达到 10 MBps。

  • 创建过滤器 filter,限制 IP
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 1.2.3.3 flowid 1:10

这里对 1.2.3.4 进行限制带宽为 1:10,也就是 6MBps。当然,你也可以直接给网段 1.2.0.0/16 加 class 策略。

2.3 查看并清理配置

  • 查看 class 配置
tc class show dev eth0

class htb 1:10 parent 1:1 leaf 10: prio 0 rate 48Mbit ceil 80Mbit burst 15Kb cburst 1600b
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 15Kb cburst 1590b
  • 查看 filter 配置
tc filter show dev eth0

filter parent 1: protocol ip pref 1 u32 chain 0
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw
match 01020303/ffffffff at 16
  • 清理全部配置
tc qdisc del dev eth0 root

3. 限制本机对指定 IP、Port 的访问速度

由于排队规则主要是基于出口方向,不能对入口方向的流量(Ingress)进行限制。因此,我们需要将流量重定向到 ifb 设备上,再对 ifb 的出口流量(Egress)进行限制,以最终达到控制的目的。

3.1 启用虚拟网卡

  • 将在 ifb 设备
modprobe ifb numifbs=1
  • 启用 ifb0 虚拟设备
ip link set dev ifb0 up

3.2 配置 qdisc-class-filter

  • 添加 qdisc
tc qdisc add dev eth0 handle ffff: ingress
  • 重定向网卡流量到 ifb0
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
  • 添加 class 和 filter
tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 6Mbps
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 6Mbps
tc filter add dev ifb0 parent 1:0 protocol ip prio 16 u32 match ip dst 1.2.3.4 flowid 1:10

3.3 查看并清理配置

  • 下面是限速本机对指定 IP 访问的监控图 


    如何在

进入的流量被限制在 6 MBps 以下,而出去的流量不被限制。

  • 查看 class 配置
tc class show dev ifb0

class htb 1:10 parent 1:1 prio 0 rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b
  • 查看 filter 配置
tc filter show dev ifb0

filter parent 1: protocol ip pref 16 u32 chain 0
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw
match 01020304/ffffffff at 16
  • 清理全部配置
tc qdisc del dev eth0 ingress
tc qdisc del dev ifb0 root
modprobe -r ifb

4. 参考

https://arthurchiao.art/blog/lartc-qdisc-zh/ https://serverfault.com/questions/350023/tc-ingress-policing-and-ifb-mirroring

链接:​https://url.hi-linux.com/UBhb0​

(版权归原作者所有,侵删)


linux下使用tc模拟网络延迟和丢包

...联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用Linux2.6(或以上)版本内核的很多发行版Linux都开启了该内核功能,比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等等。t 查看详情

linux环境下模拟延时和丢包实现--tc(代码片段)

前言在性能测试过程中,我们还需要模拟网络异常的情况下,是否会出现一些异常数据。最常见的就是写库操作,比如说我们下单的场景,如果出现网络异常的时候是否会出现数据对不上这种情况。如我们JMeter发... 查看详情

优雅解决分布式限流(代码片段)

...ter-web、starter-aop、starter-data-redis 的依赖即可,习惯了使用 commons-lang3 和&n 查看详情

使用集群自动缩放器时如何在不停机的情况下实现节点的优雅终止?

】使用集群自动缩放器时如何在不停机的情况下实现节点的优雅终止?【英文标题】:Howtoimplementgracefulterminationofnodeswithoutservicedowntimewhenusingclusterauto-scaler?【发布时间】:2019-10-0610:55:27【问题描述】:我已经使用EKS设置了K8S集群... 查看详情

springboot-优雅的实现流控

文章目录概述限流算法计数器限流漏桶算法令牌桶算法V1.0V2.0自定义注解+AOP实现接口限流搞依赖搞自定义限流注解搞AOP用上验证源码概述限流简言之就是当请求达到一定的并发数或速率,就对服务进行等待、排队、降级、... 查看详情

使用guavaretryer优雅的实现接口重试机制

转载自:使用Guavaretrying优雅的实现接口重调机制Guavaretrying:基于guava的重试组件实际项目中,为了考虑网络抖动,加锁并发冲突等场景,我们经常需要对异常操作进行重试。优雅的重试其实就是将业务处理逻辑和重试逻辑分离... 查看详情

如何优雅地使用windowstotalcommander

...。第一点:你能快速跳转到需要访问的文件夹吗?你知道如何用“分色”功能让特定文件醒目吗?你知道工具栏如何自定义吗?你遇到批量重命名的问题能不能通过TC解决?你了解TC大部分功能吗?你对于比较常用的几个插件有... 查看详情

如何优雅地使用windows

  备注1:有很多朋友评论说太复杂、不优雅。我是这样认为的,题主提出的要求是:Windows系统也能有不错的用户体验、流畅、稳定、高效。  我根据我自己的使用习惯、使用需要、使用偏好,这四点都是完全符合的。用户... 查看详情

如何捕获kill信号,优雅的结束multiprocessing所有进程

参考技术A多数人可能会回答kill-9pid,这是一种在多数情况下正确的做法。不过本文打算阐述使用kill-9带来的一些问题,并给出另一种标准的kill方式。标准中断信号在Linux信号机制中,存在多种进程中断信号(Linux信号列表)。 ... 查看详情

在windows中如何将本地文件放入linux系统指定目录

...dows系统中存放的文件传到Linux系统中的指定目录,请问该如何处理?此外,在我本机也安装了Oracle10i,想通过启动在Linux系统中的进程预先写好的进程调用本机Oracle数据可,并对数据可进行操作,请问该如何处理?谢谢!谢谢!... 查看详情

如何在linux上优雅地写代码-linux生存指南

...入式、单片机文章与参考资料:大叔的嵌入式小站:​​如何在Linux上优雅地写代码​​1.抛弃man,使用tldr优雅地阅读手册1.1 TooLong;Didn’tReadlinux一切都在命令行下操作,有着丰富的命令行工具。但是当你对命令不熟(再优... 查看详情

springboot在k8s下实现优雅停机

...OST127.0.0.1:50000/private-url/shutdown。生产环境中当然不会直接使用Pod部署应用,而是使用Deployment部署应用。以下只是样例:注意:在命令行里执行:应用日志:最后,后台发消息:springboot优雅停机,即可拿到源码。 查看详情

如何在linux下连接校园网啊

如图为在Windows下连接校园网成功的形式,验证客户端为安腾网络,可是没有Linux版本的,我的Linux发行版本为fedora17,怎么样在Linux下实现连接校园网啊,急求!!可以使用桥方式连接;可以使用NAT方式连接;  在第一种情... 查看详情

如何优雅地运用位运算实现产品需求?(代码片段)

如何优雅地运用位运算实现产品需求?在开始正文之前,我们先来说一下Linux的系统权限设计。在Linux系统中,为了保证文件的安全,对文件所有者、同组用户、其他用户的访问权限进行了分别管理。其中,文件所有者,即建立... 查看详情

mvi架构封装:快速优雅地实现网络请求(代码片段)

...xff0c;异常捕获等一些问题。我们这次一起来看下MVI架构下如何对网络请求进行封装,以及相对于MVVM架构有什么优势本文主要包括以下内容MVVM架构下的网络请求封装与问题MVI架构下封装网络请求MVI架构与Flow结合实现网络请求M... 查看详情

C/C++ Linux,如何在不使用 IP 的情况下在网络上查找邻居(仅限 MAC)

】C/C++Linux,如何在不使用IP的情况下在网络上查找邻居(仅限MAC)【英文标题】:C/C++Linux,HowtofindneighborsonanetworkWithoutUsingIP(MACOnly)【发布时间】:2014-01-1316:35:22【问题描述】:在一个小型网络中,比如说20个节点或更少,我的程... 查看详情

如何优雅的实现“查看更多”(代码片段)

开始前大家做一些文本简介展示需求时可能会遇到文本过长的场景,这时视觉同学可能会要求设置最大行数并在末尾展示"查看更多"(后面简称MoreText)。废话不多说,先看下要求实现的效果(图为实现后的Dem... 查看详情

如何优雅地使用minicom(代码片段)

minicom简介安装minicom是linux下一款常用的串口调试工具。ubuntu环境下,使用如下命令安装sudoapt-getinstallminicom配置使用前需要进行配置,执行sudominicom-s可打开minicom并进入配置模式,使用方向键,选择需要配置的项目,如Serialportsetu... 查看详情