昨天开发有个需求要对一个进程进行带宽限制,学习了cgroup+tc
大概流程如下
先说tc
tc大致流程如下 root也就是qdisc---分类也就是root下面会有很多的分类我们叫他class,这里面定义规则,也就是带宽限制为多少----filter 这里面指定用到哪个分类
cgroup
理解为容器,做系统资源控制的
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