KOPS - Linux
type: channel
link: https://www.kops.cc/tag/Linux/
items: TC(Traffic Control)命令—linux自带高级流控
items: Linux模拟复杂网络环境下的传输（netem和tc）
items: 性能调优攻略【转】

TC(Traffic Control)命令—linux自带高级流控
type: item
date: 2019-12-03T11:08:00+00:00
description: tc命令——linux基于ip进行流量限制原理部分参考多方文档进行整理，本文主要目的是记录几个限速的实例来进行直观认识和学习（git限速1、2）。参考：http://blog.csdn.net/zhongbeida_xue/article/details/54613750http://www.cnblogs.com/endsock/archive/2011/12/09/2281519.htmlhttp://blog.163.com/ninja_wk/blog/static/989155620084280154811/http://www.chinaunix.net/jh/4/16110.htmlhttps://my.oschina.net/u/3497124/blog/1632937http://blog.csdn.net/qinyushuang/article/details/46611709一、tc原理Linux操作系统中的流量控制器TC（Traffic Control）用于Linux内核的流量控制，主要是通过在输出端口处建立一个队列来实现流量控制。 接收包从输入接口进来后，经过流量限制丢弃不符合规定的数据包，由输入多路分配器进行判断选择：如果接收包的目的主机是本主机，那么将该包送给上层处理，否则需要进行转发，将接收包交到转发块（Forwarding Block）处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包，通过查看路由表，决定所处理包的下一跳。然后，对包进行排列以便将它们送到输出接口。一般只能限制网卡发送的数据包，不能限制网卡接收的数据包，所以可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。二、规则2.1 流量控制方式流量控制包括以下几种方式：SHAPING(限制)： 当流量被限制，它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽，这样可以平滑突发数据流量，使网络更为稳定。shaping（限制）只适用于向外的流量。SCHEDULING(调度)： 通过调度数据包的传输，可以在带宽范围内，按优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。POLICING(策略)： SHAPING用于处理向外的流量，而POLICIING(策略)用于处理接收到的数据。DROPPING(丢弃)： 如果流量超过某个设定的带宽，就丢弃数据包，不管是向内还是向外。2.2 流量控制处理对象流量的处理由三种对象控制，它们是：qdisc（排队规则）class（类别）filter（过滤器）2.2.1 qdisc（排队规则）QDisc(排队规则)是queueing discipline的简写，它是理解流量控制(traffic control)的基础。无论何时，内核如果需要通过某个网络接口发送数据包，它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后，内核会尽可能多地从qdisc里面取出数据包，把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理，数据包采用先入先出的方式通过队列。不过，它会保存网络接口一时无法处理的数据包。 qdisc的类别如下：CLASSLESS QDisc(不可分类QDisc)[p|b]fifo： 使用最简单的qdisc，纯粹的先进先出。只有一个参数：limit，用来设置队列的长度,pfifo是以数据包的个数为单位；bfifo是以字节数为单位。pfifo_fast： 在编译内核时，如果打开了高级路由器(Advanced Router)编译选项，pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面，使用先进先出规则。而三个波段(band)的优先级也不相同，band 0的优先级最高，band 2的最低。如果band0里面有数据包，系统就不会处理band 1里面的数据包，band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。red： red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC，当带宽的占用接近于规定的带宽时，系统会随机地丢弃一些数据包。它非常适合高带宽应用。sfq： sfq是Stochastic Fairness Queueing的简写。它按照会话(session--对应于每个TCP连接或者UDP流)为流量进行排序，然后循环发送每个会话的数据包。tbf： tbf是Token Bucket Filter的简写，适合于把流速降低到某个值。不可分类qdisc配置： 如果没有可分类QDisc，不可分类QDisc只能附属于设备的根。…

Linux模拟复杂网络环境下的传输（netem和tc）
type: item
date: 2019-12-03T10:59:00+00:00
description: 在进行网络服务的测试时，有时需要模拟一些异常的网络情况，例如网络延时长、丢包、网络地址连接不通等。在Linux下，可以通过tc工具来模拟各种网络情况；通过iptables禁止访问某个网络地址。一、netem与tc介绍netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中，模拟出复杂的互联网传输性能，诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能，比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等等。tc 是 Linux 系统中的一个工具，全名为traffic control（流量控制）。tc 可以用来控制 netem 的工作模式，也就是说，想要使用 netem ，则需要内核开启了 netem，而且安装了 tc工具。tc控制的是发包动作，不能控制收包动作。它直接对物理接口生效，如果控制了物理的eth0，那么逻辑网卡（比如eth0:1）也会受到影响，反之则不行，控制逻辑网卡是无效的。二、模拟延迟传输将 eth0 网卡的传输设置为延迟100毫秒发送。$ tc qdisc add dev eth0 root netem delay 100ms真实的情况下，延迟值不会这么精确，会有一定的波动，下面命令模拟带有波动性的延迟值：$ tc qdisc add dev eth0 root netem delay 100ms 10ms该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms （90 ~ 110 ms 之间的任意值）发送。由于各个包的延迟值不通，也会在一定程度上打乱发包的次序。还可以更进一步加强这种波动的随机性，将 eth0 网卡的传输设置为 100ms ，同时，大约有30%的包会延迟 ± 10ms 发送：$ tc qdisc add dev eth0 root netem delay 100ms 10ms 30%三、模拟网络丢包将 eth0 网卡的传输设置为随机丢掉 1% 的数据包。$ tc qdisc add dev eth0 root netem loss 1%也可以设置丢包的成功率，将 eth0 网卡的传输设置为随机丢掉 1% 的数据包，成功率为30% ：$ tc qdisc add dev eth0 root netem loss 1% 30%四、模拟包重复将 eth0 网卡的传输设置为随机产生 1% 的重复数据包。$ tc qdisc add dev eth0 root netem duplicate 1%五、模拟数据包损坏将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包。 (内核版本需在2.6.16以上）$ tc qdisc add dev eth0 root netem corrupt 0.2%六、模拟数据包乱序将 eth0 网卡的传输设置为:有25%的数据包（50%相关）会被立即发送，其他的延迟10秒。$ tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%七、一个实例step1：使用ifconfig命令查看你的网卡信息，如:eth0step2：将网卡加入监控列表$ sudo tc qdisc add dev eth0 root netemstep3：# 设置丢包率 $ sudo tc qdisc change dev eth0 root netem loss 0.5% # 设置重发 $ sudo tc qdisc change dev eth0 root netem duplicate 1% # 设置发乱序包 $ sudo tc qdisc change dev eth0 root netem gap 5 delay 10ms如果想让网络恢复正常，只需要删除监控，或将设置的值相应归0即可。例如，设置延时$ sudo tc qdisc add dev eth0 root netem delay 4s取消延时$ sudo tc qdisc del dev eth0 root netem delay 4s八、禁止访问一个IP如果要禁止访问一个IP，不使用tc，而是用iptables。iptalbes可以简单理解为linux下的防火墙，控制网络访问。1、禁止访问10.237.0.1$ iptables -A OUTPUT -d 10.237.0.1 -j REJECT2、查看规则$ iptables -L OUTPUT -nChain OUTPUT (policy ACCEPT)target prot opt source destinatio…

性能调优攻略【转】
type: item
date: 2016-05-31T10:18:00+00:00
description: 关于性能优化这是一个比较大的话题，在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点，今天，想从一些技术细节上谈谈性能优化，主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识，并不一定全对，希望大家指正和补充。在开始这篇文章之前，大家可以移步去看一下酷壳以前发表的《代码优化概要》，这篇文章基本上告诉你——要进行优化，先得找到性能瓶颈！ 但是在讲如何定位系统性能瓶劲之前，请让我讲一下系统性能的定义和测试，因为没有这两件事，后面的定位和优化无从谈起。一、系统性能定义让我们先来说说如何什么是系统性能。这个定义非常关键，如果我们不清楚什么是系统性能，那么我们将无法定位之。我见过很多朋友会觉得这很容易，但是仔细一问，其实他们并没有一个比较系统的方法，所以，在这里我想告诉大家如何系统地来定位性能。 总体来说，系统性能就是两个事： Throughput，吞吐量。也就是每秒钟可以处理的请求数，任务数。 Latency，系统延迟。也就是系统在处理一个请求或一个任务时的延迟。 一般来说，一个系统的性能受到这两个条件的约束，缺一不可。比如，我的系统可以顶得住一百万的并发，但是系统的延迟是2分钟以上，那么，这个一百万的负载毫无意义。系统延迟很短，但是吞吐量很低，同样没有意义。所以，一个好的系统的性能测试必然受到这两个条件的同时作用。 有经验的朋友一定知道，这两个东西的一些关系： Throughput越大，Latency会越差。因为请求量过大，系统太繁忙，所以响应速度自然会低。 Latency越好，能支持的Throughput就会越高。因为Latency短说明处理速度快，于是就可以处理更多的请求。 二、系统性能测试经过上述的说明，我们知道要测试系统的性能，需要我们收集系统的Throughput和Latency这两个值。 首先，需要定义Latency这个值，比如说，对于网站系统响应时间必需是5秒以内（对于某些实时系统可能需要定义的更短，比如5ms以内，这个更根据不同的业务来定义） 其次，开发性能测试工具，一个工具用来制造高强度的Throughput，另一个工具用来测量Latency。对于第一个工具，你可以参考一下“十个免费的Web压力测试工具”，关于如何测量Latency，你可以在代码中测量，但是这样会影响程序的执行，而且只能测试到程序内部的Latency，真正的Latency是整个系统都算上，包括操作系统和网络的延时，你可以使用Wireshark来抓网络包来测量。这两个工具具体怎么做，这个还请大家自己思考去了。 最后，开始性能测试。你需要不断地提升测试的Throughput，然后观察系统的负载情况，如果系统顶得住，那就观察Latency的值。这样，你就可以找到系统的最大负载，并且你可以知道系统的响应延时是多少。 再多说一些， 关于Latency，如果吞吐量很少，这个值估计会非常稳定，当吞吐量越来越大时，系统的Latency会出现非常剧烈的抖动，所以，我们在测量Latency的时候，我们需要注意到Latency的分布，也就是说，有百分之几的在我们允许的范围，有百分之几的超出了，有百分之几的完全不可接受。也许，平均下来的Latency达标了，但是其中仅有50%的达到了我们可接受的范围。那也没有意义。 关于性能测试，我们还需要定义一个时间段。比如：在某个吞吐量上持续15分钟。因为当负载到达的时候，系统会变得不稳定，当过了一两分钟后，系统才会稳定。另外，也有可能是，你的系统在这个负载下前几分钟还表现正常，然后就不稳定了，甚至垮了。所以，需要这么一段时间。这个值，我们叫做峰值极限。 性能测试还需要做Soak Test，也就是在某个吞吐量下，系统可以持续跑一周甚至更长。这个值，我们叫做系统的正常运行的负载极限。 性能测试有很多很复要的东西，比如：burst test等。 这里不能一一详述，这里只说了一些和性能调优相关的东西。总之，性能测试是一细活和累活。三、定位性能瓶颈有了上面的铺垫，我们就可以测试到到系统的性能了，再调优之前，我们先来说说如何找到性能的瓶颈。我见过很多朋友会觉得这很容易，但是仔细一问，其实他们并没有一个比较系统的方法。3.1）查看操作系统负载首先，当我们系统有问题的时候，我们不要急于去调查我们代码，这个毫无意义。我们首要需要看的是操作系统的报告。看看操作系统的CPU利用率，看看内存使用率，看看操作系统的IO，还有网络的IO，网络链接数，等等。Windows下的perfmon是一个很不错的工具，Linux下也有很多相关的命令和工具，比如：SystemTap，LatencyTOP，vmstat, sar, iostat, top, tcpdump等等 。通过观察这些数据，我们就可以知道我们的软…