很多人都知道用TC命令配置流控规则,之前做过一款路由器产品,需要为每个用户配置一条流控规则:将TC规则写到SHELL脚本中,然后在C程序中调用该脚本。随着用户数越来越多,并发执行的脚本就越来越多,导致系统性能下降。
解决这个问题根本之道是不调用TC命令,因为每个TC命令就是一个小程序,并发用户太多时,肯定会导致资源紧张。所以首先想到的是直接在C程序中调用TC规则配置接口,当时找了一圈没找到线程的库可用,可行的方法是将TC命令改造成一个库文件。但当时时间紧张,业务天天催版本。所以想了一个改动最小,最稳妥的方法。
改造方法很简单,一条TC流控规则如下:tc qdisc add dev eth0 root handle 2: htb default 100,TC后面的这些参数,其实就是main函数的char *argv[]。所以我们只需要将TC后面的参数通过其它方式传递到TC中就行了。我这边改造用的是socket通信,在TC源码中增加一个socket侦听,将tc命令改造成一个服务进程一直侦听socket通信。原来调用脚本的C程序,将TC参数直接通过socket发送给TC服务。TC服务用接收到参数替换原来argv的参数,TC其它代码无需改动。
改造后原来并发上线数大导致的问题完美解决。