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,网络,服务器)