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

在开始之前,如果不熟悉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、某个端口还可以直接限制整个网卡的流量。值得我们研究学习。

在Linux系统中,控制组(Control Groups, Cgroups)是一种内核机制,用于动态地组织和限制容器内的资源使用,包括CPU。为了限制某个进程或一组进程的CPU使用,你可以利用cgroups的特性来进行设置。以下是基本步骤: 1. **创建cgroup**: 首先,你需要为需要限制CPU的进程创建一个新的cgroup,通常会在`/sys/fs/cgroup/cpu`目录下。例如,你可以创建一个名为`my_cpus`的新目录。 ```bash sudo mkdir /sys/fs/cgroup/cpu/my_cpus ``` 2. **将进程添加到cgroup**: 然后,使用`cpuset`工具将目标进程移动到这个新的cgroup里。 ```bash echo `pgrep my_process` > /sys/fs/cgroup/cpu/my_cpus/tasks ``` 这里的`my_process`替换为你要限制进程ID。 3. **配置限制**: 对于CPU使用量的限制,你需要在`/sys/fs/cgroup/cpu/my_cpus/cpu.shares`文件中设置每个进程的相对权重(shares值)。数值越高,该进程获得的CPU时间比例越大。默认情况下,新创建的进程权重为1024。 4. **应用限制**: 一旦设置好,这些更改就会立即生效。如果你想临时调整限制,可以使用`renice`命令改变进程的优先级。 5. **查看当前状态**: 可以使用`cat /proc/self/cgroup`命令检查进程所在的cgroups,以及相应的资源限制。 注意,如果你的进程属于一个包含多个进程的组,如一个守护进程管理着其他子进程,你需要对整个组进行限制,而不是单个进程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值