TC中filter过多对性能的影响测试

最近测试了下tc filter很多的时候对性能造成的影响,这里写下测试的过程。大家可以注意下排在优先级最后的192.168.56.133有多惨。。。

测试环境:
虚拟机A:一个网卡enp0s9,IP为192.168.56.200
虚拟机B:一个网卡enp0s9,上面绑定了三个IP:192.168.56.131、192.168.56.132、192.168.56.133
网络都在同一个子网里。

测试内容为虚拟机A从虚拟机B scp一个1GB的文件,但是走的IP不同。每个IP都设置tc进行流控,默认的流控会开的很大,但是对于192.168.56.132会设置上万条filter。优先级上,192.168.56.131最高,然后是192.168.56.132,最后是192.168.56.133。

设置测试环境:

tc qdisc add dev eth1 root handle 1: htb r2q 1
tc class add dev enp0s9 parent 1: classid 1:1 htb rate 500mbit ceil 1000mbit
tc class add dev enp0s9 parent 1: classid 1:2 htb rate 500mbit ceil 1000mbit
tc class add dev enp0s9 parent 1: classid 1:3 htb rate 500mbit ceil 1000mbit

tc filter add dev enp0s9 parent 1: protocol ip prio 16 u32 match ip dst 192.168.56.131 flowid 1:1
tc filter add dev enp0s9 parent 1: protocol ip prio 100 u32 match ip dst 192.168.56.132 flowid 1:2
tc filter add dev enp0s9 parent 1: protocol ip prio 400 u32 match ip dst 192.168.56.133 flowid 1:3

通过while不停的增加192.168.56.132的filter:

while [ 1 -eq 1 ];
do
    tc filter add dev enp0s9 parent 1: protocol ip prio 100 u32 match ip dst 192.168.56.132 flowid 1:2
done

然后会发现192.168.56.131、192.168.56.132的速度可以到27~30M每秒,但是192.168.56.133只有10几M每秒。

[root@dev tmp]# scp root@192.168.56.133:/root/data.txt .
root@192.168.56.133's password: 
data.txt        4%   51MB  14.5MB/s   01:03 ETA^CKilled by signal 2.

调整133的优先级做测试,可以很明显看到速率的改变(原因下面会的解释):

[root@dev tmp]# tc filter add dev enp0s9 parent 1: protocol ip prio 10 u32 match ip dst 192.168.56.133 flowid 1:3
[root@dev tmp]# scp root@192.168.56.133:/root/data.txt .
root@192.168.56.133's password: 
data.txt        10%  106MB  27.1MB/s   00:33 ETA^CKilled by signal 2.
[root@dev tmp]# tc filter delete dev enp0s9 parent 1:  protocol ip prio 10
[root@dev tmp]# tc filter add dev enp0s9 parent 1: protocol ip prio 440 u32 match ip dst 192.168.56.133 flowid 1:3
[root@dev tmp]# scp root@192.168.56.133:/root/data.txt .
root@192.168.56.133's password: 
data.txt        5%   54MB  13.6MB/s   01:09 ETA^CKilled by signal 2.

根据上面的实验可以看出,在filter很多的时候会的对包的发送速度有影响,进而会影响带宽。原因是为啥呢?http://lartc.org/howto/lartc.adv-filter.hashing.html这个链接里讲了,filter是通过一个chain链接,查找的时候按照优先级和order顺序查找下来,所以对于优先级很低的filter,CPU会遍历前面所有的filter后才会找到它,因此此时会对速率有影响。我们通过tc filter -s show dev XXX 可以看到hit和success的个数,在我们的例子里大量的都是没有命中的。

注意,很多人在学习tc的时候会以为filter走的是hash,实际上在filter中确实有一个hash,但是用处和这里不一样。可以参见http://linux-tc-notes.sourceforge.net/tc/doc/cls_u32.txt

那这个问题如何避免呢?http://lartc.org/howto/lartc.adv-filter.hashing.html这个链接里给出了方法,大家可以参考下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*