关于tc的用法:http://pipul.org/2015/07/queueing-disciplines-for-bandwidth-management/

流控需要解决两个非常核心的问题:

  • 资源配额
  • 超发

超发和配额的区别在于,配额是分配给你能够保证你真实拥有的资源,当你需要使用就能立即能用的资源,能够完全独立支配而不受其他container的干扰。但是配额的问题在于很容易造成资源浪费或者无法应对峰值负载。因为流量是很容易具备时段性的

超发当你资源不足而别人资源冗余的时候,你能够使用别人的空闲资源

从业务方角度来看,这是一个成本控制的问题,从平台方的角度来看,这是一个提升整体的资源利用率的问题。

tc的htb队列能够很好的满足我们这些需求。

首先我们需要定义一个qdisc,来描述当前整机的带宽有多少:

 tc qdisc add dev $iface handle $ROOT_INGRESS_HANDLE: ingress
 tc class add dev $iface parent $ROOT_HTB_HANDLE: classid \
    $ROOT_HTB_CLASSID htb rate $bandwidth ceil $bandwidth

然后再设置container的带宽,并通过tc class的ceil参数来设置流控时可超发资源的阈值:

tc class add dev $iface parent $ROOT_HTB_CLASSID classid \
    $ROOT_HTB_HANDLE:$classid htb rate $bandwidth_quota ceil \
    $bandwidth_limit

tc filter add dev $iface parent $ROOT_HTB_HANDLE: protocol ip \
    handle $classid cgroup

最后只需要把classid写进net_cls子系统中的参数即可,其中classid是一个能够代表container的全局唯一的id

Leave a Comment