TC是Linux自带的模块,一般情况下不需要另行安装的,可以直接用“ man tc ”查看tc 相关命令细节,tc 要求内核 2.4.18 以上;
注意:64位机器上,或许需要先执行下面命令,做个软链接:
ln -s /usr/lib64/tc /usr/lib/tc
Linux 操作系统中的流量控制器 TC(Traffic Control) 用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。TC 模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定,另一类是分类队列规定。无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。
无类队列规定是对进入网络设备(网卡)的数据流不加区分统一对待的队列规定。使用无类队列规定形成的队列能够接收数据包以及重新编排、延迟或丢弃数据包。这类队列规定形成的队列可以对整个网络设备(网卡)的流量进行整形,但不能细分各种情况。常用的无类队列规定主要有 pfifo_fast(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(前向随机丢包)等等。这类队列规定使用的流量整形手段主要是排序、限速和丢包。
高并发情况,先将用户进入排队队列,用一个线程循环处理从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,库存减1,写数据库,将用户入结果队列。其实这个bug导致的原因在于我在filter中,对body数据重新包装了,主要是要在filter中过滤body中的数据,因此加了一个包装器,如果没有这个包装器,编码应该是没有问题的,filter中的包装器代码如下:。因为管程是互斥进入的, 所以当一个进程试图进入一个已被占用的 管程时它应当在管程的入口处等待, 因而在管程的入口处应当有一 个进程等待队列, 称作入口等待队列. 在管程内部, 可以说明和使用一种用于进程等待的队列变量, 称作 条件型变量: 在进程进入管程时和离开管程时, 分别应当执行如下的操作: 进入管程: 申请管程的互斥权. 离开管程: 如果紧急等待队列非空, 则唤醒第一个等待者, 否则释放 管程的互斥权.。
Linux流量控制的基本原理如下图所示:
接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输入多路分配器(Input De-Multiplexing)进行判断选择。如果接收包的目的地是本主机,那么将该包送给上层处理,否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们传送到输出接口(Output Interface)。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。
一、流量控制方式
流量控制包括一下几种方式:SHAPING、SCHEDULING、POLICING、DROPPING;
SHAPING(限制)
当流量被限制时,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。SHAPING(限制)只适用于向外的流量。
SCHEDULING(调度)
通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适用于向外的流量。