linux tc 性能
tl; dr:您可以轻松复制慢速的网络状况,从而更轻松地对其进行性能测试。
智能手机使必须在移动情况下进行连接的移动网站和应用程序变得更加普遍。 为这类客户提供服务还有很多价值,近年来,我们已经进入了几乎每个公司都必须制定移动战略的阶段。 现在,在这个领域中有许多挑战需要克服,但我要简要谈的是性能测试。
绩效方法
在确定性能问题时,许多人使用不同的方法,但是几乎所有人都涉及迭代改进的概念。 首先,您要设置性能目标,例如处理多个并发连接或页面加载的延迟限制。 然后,您将执行一个测试,告诉您是否满足此要求。 也许这会使用诸如Apache Bench或jmeter之类的东西来对系统进行负载测试。 然后,您可以优化和调整设置和代码,直到达到目标为止。
当然,某些网络连接可能非常差-当您的可怜用户在2G的威尔士乡村卡住时,在1Gbit连接上测试网站页面加载时间的现实程度如何? 同时,在手机上复制慢速连接可能会非常耗时。 您真正想要的是一个命令来减慢常规网络连接的速度,以便您可以重现问题,而不会带来太多麻烦。
用tc复制慢速网络
毫无疑问,我之前成功使用过的其他方法之一是linux命令行程序tc ,它代表流量控制 。 这使您可以采用常规的网络接口并引入额外的延迟或减少可用带宽。 我不会介绍如何配置tc的完整细节,但是如果您需要完整的细节,它的手册页会有所帮助。 我的目的不是写关于使用tc的完整教程,而是介绍如何在计算机上添加一些规则以模拟简单问题的基础知识。 在tc中,每个单独的规则都称为队列规则或qdisc 。
清单规则
如果您想随时查看所有qdiscs,则可以使用ls命令。 这是lo接口的示例:
tc -s qdisc ls dev lo
我会承认它非常神秘,但是您可以将tc的参数读为“列出设备lo上的所有qdiscs”。 这些示例中每个示例的共同组成部分是指定设备。 最初它是空的,但是一旦添加了一些规则,您将看到条目,接下来我们将做。 我正在使用lo –所有这些示例的回溯设备,但您可能要使用eth0,wlan0或要测试的合适设备。
限制带宽
首先,我们为回送设备替换一个新的排队规则。
tc qdisc add dev lo handle 1: root htb
如果我想添加一个将lo限制为仅100kbps的qdisc,则可以使用rate命令:
tc class add dev lo parent 1: classid 1:11 htb rate 100kbps
我们可以将此命令分解为不同的部分,以期使它变得不太钝。 class add告诉tc我们正在添加一个新类 ,这是一门排队的树。 dev lo指定我们正在使用回送设备。 现在,由于tc旨在允许构建复杂的过滤器,因此这些类实际上可以形成一棵树并被识别,这就是父1:1类ID 1:11所指的。 htb是层次令牌桶 ,它是控制网络设备上出站流量的一种简单方法。 最后, 速率100kbps设置了我们希望流量达到的最大速率。 您在这里应该小心,因为tc接受100kbps和100kBps,这取决于您要千字节还是千位。
延迟介绍
如果我想添加一个将300ms的延迟引入lo的qdisc,则可以使用delay命令:
tc qdisc add dev lo parent 1:11 netem delay 300ms
分解此命令,我们看到这次是添加qdisc而不是类,因此我们使用qdisc add 。 我们再次使用环回作为设备,因此我们使用dev lo 。 我们通过使用parent 1:11将前一个类指定为树中的父类 。 如果回头看前面的命令,您会看到我们使用classid 1:11来设置其标识符,这就是1:11所指的内容。 然后延迟300毫秒,告诉tc增加300毫秒的延迟。
限制端口
当然,您可能会有其他连接通过同一网络设备进行通信,并将它们全部限制为3G并不能进行可靠的速度测试。 因此,我们将添加一个过滤器 ,以确保这些规则仅适用于端口8080。过滤器是一种限制,它仅允许qdisc在某些条件下应用。
tc filter add dev lo protocol ip prio 1 u32 match ip dport 8080 0xffff flowid 1:11
如您现在所熟悉的,我们正在使用filter add添加一个过滤器,并使用dev lo指定要应用于的设备。 协议ip遵循其提示:指定ip协议。 prio 1指定此过滤器的优先级。 属性可让您确定哪个类获得了额外的带宽(如果可用)以及它是否遵循您指定的规则。
u32指的是我们使用的过滤规则的类型。 match ip dport 8080告诉tc将端口8080视为传入请求的目的地。 0xffff是一个位掩码,可强制u32过滤器查看整个标头。 如果您有多个qdiscs,则tc需要知道要使用哪些规则,因此flowid 1:11指定了我们之前在“限制带宽”部分中用作父类的标识符。
我知道这有点令人吃惊,但能够通过端口进行限制很方便。
恢复正常
完成基准测试后,您显然希望将其恢复正常。 为了删除刚在接口lo上施加的限制,可以使用del命令。
tc qdisc del dev lo root
结束语
这种方法对于测试您所做的特定更改是否确实有效而无需耗时的步骤或在真实设备上进行复制非常有用。 一旦确信自己的优化已经奏效,那么您仍然应该在真实的硬件上进行测试以确保这一点。 实际的慢速网络与您刚刚对自己的网络设备所做的更改之间存在各种差异,您应确保自己在野外而不是在实验室中验证所做的更改。
感谢John Oliver指出了该技术,并与Perry Lorier一起审阅了此博客文章的早期草稿。
翻译自: https://www.javacodegeeks.com/2013/08/performance-tests-for-slow-networks-with-tc.html
linux tc 性能