
Linux内核从2.2开始提供TC(Traffic Control)去控制Linux内核的流量,一般系统都是自带tc工具。
TC控制流程:
这里使用paping而不是ping,按照原作者说法是为了防止在防火墙开启的状态下可以ping通,但无法进行tcp连接的问题。
网络延迟:
tc qdisc add dev eth0 root netem delay 300ms
网络丢包:
tc qdisc add dev eth0 root netem loss 7% 25% #代表丢掉7%的包,但是成功率只有25%
tc qdisc add dev eth0 root netem loss 7% #只设置7%是代表随机丢掉7%的包
网络数据异常:
tc qdisc add dev eth0 root netem corrupt 10% # 10%的数据包损坏,不是没传过去,而是传过去不对。
网络数据重复:
tc qdisc add dev eth0 root netem duplicate 1% #随机产生1%的包重复
网络数据包乱序:
tc qdisc add dev eth0 root netem delay 10ms reorder 25% 50% #有25%的数据包(50%相关)会被立即发送,其他的延迟10秒
关闭网络异常模拟:
tc qdisc del dev eth0 root netem
监控网卡:
tc qdisc add dev eth0 root netem
其余命令:
tc qdisc change dev eth0 root netem duplicate 1%
tc qdisc replace dev eth0 root netem duplicate 1%
tc是要在client端设置的,因为只能控制数据发出,它模拟的是异常的数据到达Server后如何被处理,前提是数据在到达Server的时候已经异常了。
至于server端的控制,需要使用iptables。
参考文档:
https://honeypps.com/chaos/how-to-simulate-network-fault/
https://www.haxi.cc/archives/Linux%E6%A8%A1%E6%8B%9F%E5%A4%8D%E6%9D%82%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E4%BC%A0%E8%BE%93-netem%E5%92%8Ctc.html
TC的安装TC是Linux自带的模块,一般情况下不需要另行安装,可以用 man tc 查看tc 相关命令细节,tc 要求内核 2.4.18 以上
[plain] view plain copy
##注意:64位机器上,先执行下面命令
ln -s /usr/lib64/tc /usr/lib/tc
TC原理介绍
Linux *** 作系统中的流量控制器 TC(Traffic Control) 用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。TC 模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定,另一类是分类队列规定。无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。
无类队列规定是对进入网络设备(网卡)的数据流不加区分统一对待的队列规定。使用无类队列规定形成的队列能够接收数据包以及重新编排、延迟或丢弃数据包。这类队列规定形成的队列可以对整个网络设备(网卡)的流量进行整形,但不能细分各种情况。常用的无类队列规定主要有 pfifo_fast(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(前向随机丢包)等等。这类队列规定使用的流量整形手段主要是排序、限速和丢包。
分类队列规定是对进入网络设备的数据包根据不同的需求以分类的方式区分对待的队列规定。数据包进入一个分类的队列后,它就需要被送到某一个类中,也就是说需要对数据包做分类处理。对数据包进行分类的工具是过滤器,过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的类进行排队。每个子类都可以再次使用它们的过滤器进行进一步的分类。直到不需要进一步分类时,数据包才进入该类包含的队列排队。除了能够包含其他队列规定之外,绝大多数分类的队列规定还能够对流量进行整形。这对于需要同时进行调度(如使用SFQ)和流量控制的场合非常有用。
Cgroup是control group的缩写,是Linux内核提供的一种用于限制,记录,隔离进程组所使用物理资源(cpu,memory,io等)的机制。
cgroup提供了一系列的功能用于对Linux系统资源进行管理和限制,主要功能包括如下
1:限制进程组可以使用的资源数量,例如进程组对内存的使用上限。
2:进程组的执行优先级限制。
3:记录进程组所使用的资源数量,例如进程组所使用的cpu时间。
4:进程组隔离的能力。
在cgroup中有一些基本定义或概念
1:Task,理解为系统中需要被控制的进程。
2:Subsystem,可以被控制的资源系统,例如cpu,IO,内存等。
3:Cgroup,按照某种控制标准而划分而成的控制族。
4:hierarchy,Cgroup可以组织成树状结构,子节点继承父节点的控制标准。
在系统中创建新的hierarchy时,系统中的所有任务都属于该层级的默认cgroup(root group)的成员。
一个子系统只能附加到一个层级上。
一个层级可以附加多个子系统。
一个任务可以是cgroup的成员,但这些cgroup必须在不同的hierarchy中。
任务创建的子任务(进程),子进程自动成为父进程cgroup的成员。
关系图如下:
blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset -- 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices -- 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer -- 这个子系统挂起或者恢复 cgroup 中的任务。
memory -- 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
ns -- 名称空间子系统。
Linux系统中最多可以建12棵cgroup层级树(每棵树关联一个子系统),也可以最少建一颗cgroup层级树(关联所有12个控制子系统)
可以通过mount命令完成
1.挂载一颗和所有subsystem关联的cgroup树到/sys/fs/cgroup
mount -t cgroup
xxx /sys/fs/cgroup
2.挂载一颗和cpuset
subsystem关联的cgroup树到/sys/fs/cgroup/cpuset
mkdir
/sys/fs/cgroup/cpuset
mount -t cgroup -o
cpuset xxx /sys/fs/cgroup/cpuset
3.挂载一颗与cpu和cpuacct
subsystem关联的cgroup树到/sys/fs/cgroup/cpu,cpuacct
mkdir
/sys/fs/cgroup/cpu,cpuacct
mount -t cgroup -o
cpu,cpuacct xxx /sys/fs/cgroup/cpu,cpuacct
4.挂载一棵cgroup树,但不关联任何subsystem
mkdir
/sys/fs/cgroup/systemd
mount -t cgroup -o
none,name=systemd xxx /sys/fs/cgroup/system
通过mount可以查看到cgroup的默认挂载点
每个目录下,其中的文件描述了如何对资源进行限制。
在每个进程的/proc/$pid/cgroup文件中,描述了进程于cgroup的关系:
第一列描述cgroup的树ID(该ID可以在/proc/cgroups中一一对应);第二列描述绑定的所有子系统;第三列描述进程在cgroup中的路径。
当我们对某个任务需要进行限制时,不推荐直接在cgroup的各个子系统的root下修改配置,而是在对应的层级下建立单独的控制节点。
例如如下,在cpu目录下建立我们自己的子目录:
进入我们创建的子目录后,会看到系统已经创建好了资源控制文件,此时只需要修改这些配置文件满足要求既可以。
要控制我们的进程,只需要将进程ID添加到tasks配置文件中即可以。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)