首页 > 其他分享 >基于 tc 指令的网速限制工具

基于 tc 指令的网速限制工具

时间:2024-04-28 20:11:56浏览次数:16  
标签:network show ifb0 网速 echo 指令 dev tc

前言


最近有一个需求,需要限制网卡速度进行一些测试。在朋友推荐下阅读了这篇文章 TC简单粗暴限制网速

经过尝试,简单有效,整理成脚本放在正文,留作参考。

正文


  1. 指令解析(chatgpt 分析)
    您提供的命令序列是用于在Linux系统中使用tc(traffic control)工具对网络流量进行管理和控制的示例。下面是每个命令的作用和一些解释:

  2. modprobe ifb numifbs=1

    • 加载ifb(Intermediate Functional Block)模块,创建一个新的ifb设备实例。numifbs=1参数表示创建一个虚拟的网络接口,用于流量控制。
  3. ip link set dev ifb0 up

    • 激活(启用)名为ifb0的网络接口。
  4. tc qdisc add dev ens18 handle ffff: ingress

    • 在网络接口ens18上添加一个ingress队列规则,处理进入的流量。
  5. tc filter add dev ens18 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

    • ens18接口上添加一个过滤器,匹配所有进入的IPv4流量并将其镜像(重定向)到ifb0设备。
  6. tc qdisc add dev ifb0 root handle 1: htb default 10

    • ifb0上添加一个根队列规则,使用HTB(Hierarchical Token Bucket)算法来管理和限制流量。
  7. tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 1Mbps

    • 添加一个限制类,将ifb0的流量限制到1Mbps。
  8. tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 1Mbps

    • 在前面创建的类1:1下添加一个子类1:10,限制率同样是1Mbps。

以下是修改类的命令,用于变更流量限制:

  1. tc class change dev ifb0 parent 1:0 classid 1:1 htb rate 2Mbps

    • 将类1:1的速率改为2Mbps。注意这里最后的单位使用的是大写的B,代表Bytes,这可能是个错误,因为通常限制速率使用的是小写的b,代表bits。
  2. tc class change dev ifb0 parent 1:1 classid 1:10 htb rate 2Mbps

    • 将子类1:10的速率改为2Mbps。同样的单位问题。
  3. tc class change dev ifb0 parent 1:0 classid 1:1 htb rate 20Mbit

    • 将类1:1的速率改为20Mbps。
  4. tc class change dev ifb0 parent 1:1 classid 1:10 htb rate 20Mbit

    • 将子类1:10的速率改为20Mbps。
  5. tc class show dev ifb0

    • 显示ifb0接口上的类信息。

最后,以下命令用于清理前面创建的队列规则:

  1. tc qdisc del dev ens18 ingress

    • 删除eth0接口上的ingress队列规则。
  2. tc qdisc del dev ifb0 root

    • 删除ifb0接口上的根队列规则。
  3. modprobe -r ifb

    • 卸载ifb模块。

请注意,使用tc进行流量控制时,确保你使用正确的流量单位非常重要。通常流量速率以bit为单位(即Mbit或Mbps),而不是Byte(即MBps)。这里的速率控制指令中的"B"应该是小写的"b",除非实际环境有特别规定使用了Bytes作为单位。

脚本:limit_net_speed.sh, 这个脚本实现了简单增删改查,但细节方面还需要打磨,还有一定局限性。

#!/bin/bash
action=$1
network_card=$2
limit=$3

function Usage()
{
    echo -e "${0} [action] [network_card] [speed_limit]"
    echo -e "------"
    echo -e "action: show/add/change/delete"
    echo -e "network_card: you network card name"
    echo -e "speed_limit: network speed limit num (Mbps), only number, default 100"
    echo -e "------"
    exit 0
}


function show_network_cards()
{
    echo -e "------ NETWORK ------\n"
    echo -e "NAME IPADDRESS"
    ip -o -4 addr show | awk '{print $2, $4}' | column -t
    echo -e "---------------------\n"
}


function show_ip_ifb_info()
{
    echo -e "------ IP IFPS ------\n"
    ip link show type ifb
    echo -e "---------------------\n"
}


function show_tc_info()
{
    echo -e "------ TC INFO ------\n"
    tc class show dev ifb0
    echo -e "---------------------\n"
}


if [[ ${action} == "show" ]];then
    echo -e "start show all info"
    show_network_cards
    show_ip_ifb_info
    show_tc_info
elif [[ ${action} == "add" ]];then
    echo -e "start add"
    if [[ ${network_card} == "" ]];then
    	echo -e "Error: network_card is None, select one from below:"
	show_network_cards
	Usage
    fi

    
    ip -o -4 addr show | grep -qw "${network_card}"
    if [[ $? == 1 ]];then
    	echo "Error:${network_card} not in below:"
	show_network_cards
	Usage
    fi

    has_ip_ifp=`ip link show type ifb`
    if [[ ${has_ip_ifp} != "" ]];then
	echo -e "ifp has exists:"
	echo ${has_ip_ifp}
	Usage
    fi


    modprobe ifb numifbs=1
    ip link set dev ifb0 up
    tc qdisc add dev ${network_card} handle ffff: ingress
    tc filter add dev ${network_card} parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
    tc qdisc add dev ifb0 root handle 1: htb default 10

    limit_speed=100
    if [[ ${limit} != "" ]];then
    	limit_speed=${limit}
    fi
    echo -e "add ${network_card} limit:${limit_speed}Mbps"
    
    tc class add dev ifb0 parent 1:0 classid 1:1 htb rate ${limit_speed}Mbit
    tc class add dev ifb0 parent 1:1 classid 1:10 htb rate ${limit_speed}Mbit

    show_ip_ifb_info
    show_tc_info

    echo "finished"
elif [[ ${action} == "change" ]];then
    echo -e "start change"
    
    if [[ ${network_card} == "" ]];then
    	echo -e "Error: network_card is None, select one from below:"
	show_network_cards
	Usage
    fi
    
    ip -o -4 addr show | grep -qw "${network_card}"
    if [[ $? == 1 ]];then
    	echo "Error:${network_card} not in below:"
	show_network_cards
	Usage
    fi
    
    has_ip_ifp=`ip link show type ifb`
    if [[ ${has_ip_ifp} == "" ]];then
	echo -e "ifp not exists:"
	Usage
    fi
    
    if [[ ${limit} == "" ]];then
    	echo -e "Error: limit is None"
	Usage
    fi

    echo -e "change ${network_card} speed:${limit}Mbps"

    tc class change dev ifb0 parent 1:0 classid 1:1 htb rate ${limit}Mbit
    tc class change dev ifb0 parent 1:1 classid 1:10 htb rate ${limit}Mbit

    show_ip_ifb_info
    show_tc_info
    echo "finished"

elif [[ ${action} == "delete" ]];then
    echo -e "start delete"
    
    if [[ ${network_card} == "" ]];then
    	echo -e "Error: network_card is None, select one from below:"
	show_network_cards
	Usage
    fi
    
    ip -o -4 addr show | grep -qw "${network_card}"
    if [[ $? == 1 ]];then
    	echo "Error:${network_card} not in below:"
	show_network_cards
	Usage
    fi
    
    has_ip_ifp=`ip link show type ifb`
    if [[ ${has_ip_ifp} == "" ]];then
	echo -e "ifp not exists:"
	Usage
    fi

    echo "delete ${network_card} speed limit"
    tc qdisc del dev ${network_card} ingress
    tc qdisc del dev ifb0 root
    modprobe -r ifb

    show_ip_ifb_info
    show_tc_info
    echo "finished"
else
    echo -e "Error:action: ${action} not supported"
    show_network_cards
    Usage
fi


参考


[1]. TC简单粗暴限制网速
[2]. chatgpt

标签:network,show,ifb0,网速,echo,指令,dev,tc
From: https://www.cnblogs.com/brian-sun/p/18164409

相关文章

  • AtCoder Beginner Contest 208 E
    E-DigitProducts点击查看代码map<int,int>f[20];voidsolve(){intn,k;cin>>n>>k;autos=to_string(n);intm=s.size();function<int(int,int,int,int)>dfs=[&](inti,intlimit,intis_num,intmul)->int{if(i......
  • Golang基于etcd实现服务注册和发现功能
    简单做个笔记registerpackagemainimport( "os" "log" "time" "syscall" "context" "os/signal" "go.etcd.io/etcd/clientv3")//ServiceRegister创建租约注册服务typeServiceRegisterstruct......
  • AtCoder Beginner Contest 351 E - Jump Distance Sum 切比雪夫距离与曼哈顿距离的转
    先说知识点。曼哈顿距离:横纵坐标距离差的绝对值的和,即|X1-X2|+|Y1-Y2|,离(0,0)点曼哈顿距离为1的点形成的是一个旋转45度后的正方形切比雪夫距离:横纵坐标距离差的绝对值的最大值,即max(|X1-X2|,|Y1-Y2|),离(0,0)点切比雪夫距离为1的点形成的是一个不旋转的正方形曼哈......
  • 『手撕Vue-CLI』添加自定义指令
    前言经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入nue--help来查看帮助信息了,但是在帮助信息中只有--version,--help这两个指令,而vue-cli中还有很多指令,例如create,serve,build等等,所以本章将继续添加自定义指令,例如create指令。添加create......
  • Intel Pentium III CPU(Coppermine, Tualatin) L2 Cache Latency, Hardware Prefetch
    这几天,偶然的机会想到了困扰自己和其他网友多年的IntelPentiumIII系列处理器缓存延迟(L2CacheLatency),以及图拉丁核心版本是否支持硬件预取(HardwarePrefetch)问题。手头的支持图拉丁核心处理器的i815主板还在正常服役中,铜矿和图拉丁核心处理器也都有,所以就专门做了这一期调查,感......
  • atcoder集
    AtCoderBeginnerContest351A-Thebottomoftheninth(签到题) Code:#include<bits/stdc++.h>usingnamespacestd;#definedebug(x)cerr<<#x<<":"<<x<<'\n';intmain(){ios::sync_w......
  • ocelot系列文章02---在.netcore项目中集成
    1、创建项目并引入安装包首先,创建2个WebApi项目,WebApi01和WebApi02,地址分别https://localhost:44313和https://localhost:44390,其中WebApi01当作网关,WebApi02当作具体的微服务Api。然后,将Ocelot的NuGet软件包安装到WebApi01项目中。注意我这里安装的是17.0.0版本,配置方面会有点......
  • The Little Match Girl
    TheLittleMatchGirlIt was a snowy winter night. A poor little girl was walking around the street selling matches.She was dressed in shabby clothes and had no shoes on."Matches! Please buy my matches!"She was very cold andhu......
  • [atcoder 349] [F - Subsequence LCM]
    SOSDP学习笔记Linkhere:代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.math.BigInteger;importjava.util.*;publicclassMain{staticintn;staticlongm;staticlong[]a;......
  • 挂载mount指令
    挂载注意事项1.一个目录、同一时间只能被一个设备挂载2.一个设备可以挂载多个目录3.如果一个目录被多个设备挂载,只能看到最后一个挂载的设备数据,其他的设备数据会被隐藏。4.工作里建议用新的文件夹,作为挂载点。mount命令参数解释-l显示系统以挂载的设备信......