【推荐阅读】
一,确定优化目标
优化前,首先要确定观察到的网络性能指标,要达到多少才合适?
虽然网络性能优化的整体目标,是降低网络延迟(如 RTT)和提高吞吐量(如 BPS 和 PPS),但具体到不同应用中,每个指标的优化标准可能会不同,优先级顺序也大相径庭。
NAT 网关通常需要达到或接近线性转发,也就是说, PPS 是最主要的性能目标。
对于数据库、缓存等系统,快速完成网络收发,即低延迟,是主要的性能目标。
而对于我们经常访问的 Web 服务来说,则需要同时兼顾吞吐量和延迟。
为了更客观合理地评估优化效果,我们首先应该明确优化的标准,即要对系统和应用程序进行基准测试,得到网络协议栈各层的基准性能。
Linux 网络协议栈,是我们需要掌握的核心原理。它是基于 TCP/IP 协议族的分层结构,用一张图来表示这个结构。
由于底层是其上方各层的基础,底层性能也就决定了高层性能。底层性能指标就是对应高层的极限性能。
- 首先是网络接口层和网络层,它们主要负责网络包的封装、寻址、路由,以及发送和接收。每秒可处理的网络包数 PPS,就是它们最重要的性能指标(特别是在小包的情况下)。可以用内核自带的发包工具 pktgen ,来测试 PPS 的性能。
- 再向上到传输层的 TCP 和 UDP,它们主要负责网络传输。对它们而言,吞吐量(BPS)、连接数以及延迟,就是最重要的性能指标。可以用 iperf 或 netperf ,来测试传输层的性能。不过要注意,网络包的大小,会直接影响这些指标的值。所以需要测试一系列不同大小网络包的性能。
- 最后,再往上到了应用层,最需要关注的是吞吐量(BPS)、每秒请求数以及延迟等指标。可以用 wrk、ab 等工具,来测试应用程序的性能。
测试场景要尽量模拟生产环境,这样的测试才更有价值。可以到生产环境中,录制实际的请求情况,再到测试中回放。
二,网络性能工具
建议从指标和工具两个不同维度出发,整理记忆网络相关的性能工具。
第一个维度,从网络性能指标出发,把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握。当想查看某个性能指标时,就能清楚知道,可以用哪些工具。
下图可以把它当成一个“指标工具”指南来使用
再来看第二个维度,从性能工具出发。可以更快上手使用工具,迅速找出想要观察的性能指标。特别是在工具有限的情况下,要充分利用好手头的每一个工具,用少量工具也要尽力挖掘出大量信息。
下图可以当成一个“工具指标”指南使用,需要时查表即可: