cgroup配合tc工具对进程的上下行(出口入口)速度进行限制,附测试脚本

news/2024/7/8 1:11:19

在开始之前,如果不熟悉cgroup、tc、以及ifb虚拟网卡,建议先了解一下再进行试验

注:为什么会用到ifb虚拟网卡呢,因为Linux自带的tc是一套控发不控收的框架。具体ifb详细原理,自行研究,网上资料多的很。

  1. 对出口流量限制的预配置

    //默认分类为100
    tc qdisc add dev ens32 root handle 1: htb default 100
    //指定classid为1:1的出口流量为50mbit,这里后面会和我们要限制某个进程的出口流量进行绑定
    tc class add dev ens32 parent 1:0 classid 1:1 htb rate 50mbit ceil 50mbit
    //默认出口流量为500mbit
    tc cl add dev ens32 parent 1:1 classid 1:100 htb rate 500mbit burst 20k
    //过滤classid为1:1的流量
    tc filter add dev ens32 protocol ip parent 1:0 prio 1 handle 1:1 cgroup
    
  2. 对入口流量的限制的预配置

    # 加载ifb驱动并创建ifb网卡(使用ifconfig -a 如果看到已有则无需该步骤)
    modprobe ifb numifbs=1
    # up网卡
    # ip link set dev ifb0 up
    # 清除原有的根队列(根据实际情况操作,非必要) 
    tc qdisc del dev ens32 root 2>/dev/null
    tc qdisc del dev ens32 ingress 2>/dev/null
    tc qdisc del dev ifb0 root 2>/dev/null
     
    #  将ens32的ingress流量全部重定向到 ifb0 处理
    tc qdisc add dev ens32 handle ffff: ingress
    tc filter add dev ens32 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
    
  3. 开启入口与出口流量限制

    # ens32的出向限速:ens32添加根队列,使用htb,添加1:1类,使用htb 
    tc qdisc add dev ens32 root handle 1: htb r2q 625 default 65
    tc class add dev ens32 parent 1: classid 1:1 htb rate 1000Mbit
    
    # ens32的入向限速:ifb0添加根队列,使用htb,添加1:1类,使用htb 
    tc qdisc add dev ifb0 root handle 1: htb r2q 625 default 65
    tc class add dev ifb0 parent 1: classid 1:1 htb rate 1000Mbit
    

4.开始实验验证
测试脚本,用这个
1.下载准备好的测试脚本,在服务端执行 python test.py
2.测试服务端端进程的下行。服务端进程的下行相对于客户端来说,就是在客户端上传数据然后观察服务端进程接受数据的能力。所以我们在客户端(upload)执行以下命令来测试服务端下行。

curl -H "Content-Type:multipart/form-data" -H "referer:http://192.168.9.159:1234/" -F "file=@test_rate_file.tar.gz" http://192.168.9.159:1234/

3.测试服务端进程的上行。服务端进程的上行相对于客户端来说,就是在客户端下载数据然后观察服务端进程发送数据的能力。所以我们在客户端(download)执行以上命令来测试服务端的上行。

curl -O http://192.168.9.159:8888/test_rate_file.tar.gz

总结:tc配合cgroup可以做很多事,既可以对单个进程、某个IP、某个端口还可以直接限制整个网卡的流量。值得我们研究学习。


http://lihuaxi.xjx100.cn/news/1066628.html

相关文章

【Python | 基础语法篇】01、字面量、注释、变量、数据类型及转换

目录 一、字面量 1.1 什么是字面量 1.2 常用的值类型 1.3 字符串 1.4 如何在代码中写它们 1.5 总结 二、注释 2.1 注释的作用 2.2 注释的分类 2.3 注释实战 2.4 总结 2.5 思考 三、变量 3.1 什么是变量 3.2 案例——模拟钱包 3.3 变量的特征 3.4 思考 3.5 …

欧几里得算法、扩展欧几里得算法(特解、应用、通解)

文章目录 1. 欧几里得算法(也叫辗转相除法)1.1 直接上模拟1.2 几何理解1.3 用代数方法证明 g c d ( a , b ) g c d ( b , a % b ) gcd(a, b) gcd(b, a \% b) gcd(a,b)gcd(b,a%b)1.3.1 左推右: g c d ( a , b ) g c d ( b , a % b ) gcd(a…

2023年制造业产品经理NPDP认证报名找弘博创新

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

IDEA执行main方法的时候,会编译整个项目的问题

​ 今天遇到一个奇怪的问题,执行main方法会构建整个项目,速度奇慢无比。我就执行个main方法,搞这么复杂干嘛?经过查阅网上的攻略,最终找到解决方法。 以下方法适用于idea版本 问题解决方法: 参考 https://…

【脚本笔记】EditorApplication

EditorApplication 是编辑器下的主要程序类,为我们提供丰富的方法和事件等。 静态变量 applicationContentsPath 返回你当前Unity编辑器的Data文件路径。如D:/UnityVersions/2021.3.22f1c1/Editor/Data applicationPath 返回你当前Unity编辑器的执行文件位置。如…

五种原因导致孩子易患口腔溃疡,专家为你一一支招

最近,常接到电话咨询:疫情期间,孩子宅在家,反复起“口疮”怎么办? 这里说到的“口疮”,即是一种常见的口腔黏膜疾病——口腔溃疡。口腔溃疡的发病率较高,不仅成年人可能患病,不少儿…

5.4 Javascript中的浅拷贝与深拷贝

Javascript中的浅拷贝与深拷贝 目录一、Javascript中的浅拷贝与深拷贝概述1. 浅拷贝(Shallow Copy)2. 深拷贝(Deep Copy) 二、Javascript中的浅拷贝与深拷贝概述1. 浅拷贝(Shallow Copy)a. 使用数组的浅拷贝…

Autosar通信协议栈-网络管理(NM)

文章目录 一、NM模块NM message formatControl Bit Vector二、网络状态机1. Bus Sleep Mode2. Prepare Bus Sleep Mode3. Network Modei. Repeat message stateii.Normal operation stateiii.Ready sleep StateCAN NM报文发送流程图CAN NM报文接收流程图三、工具配置参数Global…