昨天开发有个需求要对一个进程进行带宽限制,学习了cgroup+tc


大概流程如下


先说tc

tc大致流程如下 root也就是qdisc---分类也就是root下面会有很多的分类我们叫他class,这里面定义规则,也就是带宽限制为多少----filter 这里面指定用到哪个分类 


cgroup

理解为容器,做系统资源控制的


  1. yum install libcgroup

2. mount -t cgroup net_cls -o net_cls /cgroup/net_cls/



#!/bin/bash

#这个脚本是tc与cgroup结合来限制一个进程的流量


#注意:执行这个脚本之前请先确定这台机器之前是没有部署tc流量控制的,

#或者之前部署的流量控制已经不用了。

#这个脚本会先清空之前部署的流量控制,然后执行脚本中的命令。


#这个脚本需要传入两个参数

#参数一是设备标记,就是这个进程出去的网卡是哪一个

#参数二是流量限制的大小,单位Mbps,就是M/s


#执行这个脚本之前应该先对cgroup进行配置,配置过程如下:

#1.确保cgroup是开启的

#2.给子系统net_cls添加一个层级group,操作如下:

#       cd /cgroup/net_cls/

#       mkdir group

#3.将队列的classid写到group层的net_cls.classid文件中,如下操作:

#       cd /cgroup/net_cls/group

#       echo 0x00010002>net_cls.classid

#       这里的0x00010002就表示classid为1:2

#       如果想换成1:3,可以这样:echo 0x00010003>net_cls.classid

#       这里的classid就是下面分类的classid

#4.将进程放到cgroup中,这里以mysql导入为例:

#       cgexec -g net_cls:group mysqlimport --lock-tables=false -C -h ip -P 3306 -u root -pmima --default-character-set=utf8 -f -r --local inputtest  --fiel

ds-optionally-enclosed-by="\"" --fields-terminated-by=',' --lines-terminated-by="\r\n" test.csv


if [ $# -lt 2 ] ; then

        echo "Parameter error"

        echo "./trffic_limit_cgroup.sh dev limit"

        exit

fi


DEV=$1

limit=$2


tc qdisc del dev $DEV root


tc qdisc add dev $DEV root handle 1: htb

tc class add dev $DEV parent 1: classid 1: htb rate 1000mbit ceil 1000mbit

tc class add dev $DEV parent 1: classid 1:2 htb rate ${limit}mbit


tc filter add dev $DEV protocol ip parent 1:0 prio 1 handle 1:2 cgroup




如何进行测试


安装iperf 网络质量测试

http://linux.chinaunix.net/techdoc/system/2008/07/03/1014733.shtml


使用iperf分为服务端和测试端

服务端iperf -s 

在客户端上执行dstat 再开一个界面执行 cgexec -g net_cls:group iperf -c ip