Skip to content

Latest commit

 

History

History
170 lines (86 loc) · 11.9 KB

网络性能篇2.md

File metadata and controls

170 lines (86 loc) · 11.9 KB

36 | 套路篇:怎么评估系统的网络性能?

网络基准测试

Linux网络基于TCP/IP协议栈,而不同协议层的行为显然不同,那么,在测试之前,就应该知道要评估的网络性能,究竟属于协议栈的哪一层。

各协议层的性能测试

转发性能

网络接口层和网络层:主要负责网络包的封装、寻址。由于以及发送和接收,在这两个网络协议层中,每秒可处理的网络包数PPS,就是最重要的性能指标,特别是64B小包的处理能力

可以使用hping3作为测试网络包处理能力的性能工具 pktgen:他支持更丰富的自定义选项,方便根据实际需要构造所需网络包,从而更加准确的测试出目标服务器的性能

其中pktgen作为内核线程来运行,并不会直接找到pktgen命令。需要加载pktgen内核模块后,再通过/proc文件系统来交互,下面就是pktgen启动的两个内核线程和?/proc文件系统的交互文件

pktgen在每个CPU上启动一个内核线程,并可以通过/proc/net/pktgen下面的同名文件,跟这些线程交互,而pgctrl则主要用来控制测试的开启和停止

如果 modprobe 命令执行失败,说明你的内核没有配置 CONFIG_NET_PKTGEN 选项。这就需要你配置 pktgen 内核模块(即 CONFIG_NET_PKTGEN=m)后,重新编译内核,才可以使用

Params:测试选项 Current:测试进度 Result:测试结果,包含测试所用时间、网络包数量和分片,PPS、吞吐量以及错误数

TCP/UDP性能

使用iperf或者netperf工具,目前iperf最新版本是iperf3

其中iperf分为服务端和客户端

稍等一会后,测试结束,回到目标服务器,查看iperf报告: 最后的SUM行就是测试的胡总结果,包括测试时间、数据传输量以及带宽等,按照发送和接收,分为sender和receiver两行

HTTP性能

常用的有ab、webbench等 下面是ab的使用示例

$ ab -c 1000 -n 10000 http://192.168.0.30/

应用负载性能

`

-c表示并发连接数1000,-t表示线程数为2

$ wrk -c 1000 -t 2 http://192.168.0.30/ `

wrk最大的优势:内置了LuaJIT,可以用来实现复杂场景的性能测试,wrk在调用Lua脚本时,将HTTP请求分为三个阶段,即setup,running、done。

37 | 案例篇:DNS 解析时快时慢,我该怎么办?

案例 1:DNS 解析失败

案例 2:DNS 解析不稳定

  1. 两个命令的使用场景:nslookup -debug、time nslookup。

  2. 理解性能分析的思路:性能分析和优化要做到可视化,可量化。比如DNS查询慢,多少延迟算慢?有什么命令可以观察指标?又有什么命令可以观察DNS解析的过程?

以前个人DNS排查顺序都是这三把斧:

  1. 检查本地hosts:cat /etc/hosts

2.检查resolv.conf文件:cat /etc/resolv.conf。在redhat7/centos7上修改resolv.conf里的DNS地址后,重启启网络服务发现DNS地址消失了,那么检查下网卡配置文件。

  1. 检查网卡配置文件: cat /etc/sysconfig/network-scripts/ifcfg-<网卡名称>,看下里头有没DNS配置信息,没有的话补上去。

DNS 是互联网中最基础的一项服务,提供了域名和 IP 地址间映射关系的查询服务。

很多应用程序在最初开发时,并没考虑 DNS 解析的问题,后续出现问题后,排查好几天才能发现,其实是 DNS 解析慢导致的。

试想,假如一个 Web 服务的接口,每次都需要 1s 时间来等待 DNS 解析,那么,无论你怎么优化应用程序的内在逻辑,对用户来说,这个接口的响应都太慢,因为响应时间总是会大于 1 秒的。

所以,在应用程序的开发过程中,我们必须考虑到 DNS 解析可能带来的性能问题,掌握常见的优化方法。

这里,我总结了几种常见的 DNS 优化方法。

对 DNS 解析的结果进行缓存。缓存是最有效的方法,但要注意,一旦缓存过期,还是要去 DNS 服务器重新获取新记录。不过,这对大部分应用程序来说都是可接受的。

对 DNS 解析的结果进行预取。这是浏览器等 Web 应用中最常用的方法,也就是说,不等用户点击页面上的超链接,浏览器就会在后台自动解析域名,并把结果缓存起来。使用 HTTPDNS 取代常规的 DNS 解析。这是很多移动应用会选择的方法,特别是如今域名劫持普遍存在,使用 HTTP 协议绕过链路中的 DNS 服务器,就可以避免域名劫持的问题。

基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。

38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?

tcpdump 和 Wireshark 就是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器。

tcpdump 仅支持命令行格式使用,常用在服务器中抓取和分析网络包。Wireshark 除了可以抓包外,还提供了强大的图形界面和汇总分析工具,在分析复杂的网络情景时,尤为简单和实用。

TCP 三次握手和四次挥手的流程,基本是这样的:

当你发现针对相同的网络服务,使用 IP 地址快而换成域名却慢很多时,就要想到,有可能是 DNS 在捣鬼。

DNS 的解析,不仅包括从域名解析出 IP 地址的 A 记录请求,还包括性能工具帮你,“聪明”地从 IP 地址反查域名的 PTR 请求。

实际上,根据 IP 地址反查域名、根据端口号反查协议名称,是很多网络工具默认的行为,而这往往会导致性能工具的工作缓慢。

所以,通常,网络性能工具都会提供一个选项(比如 -n 或者 -nn),来禁止名称解析。

在工作中,当你碰到网络性能问题时,不要忘记 tcpdump 和 Wireshark 这两个大杀器。你可以用它们抓取实际传输的网络包,再排查是否有潜在的性能问题。

39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?

DDoS 简介

DDoS 的前身是 DoS(Denail of Service),即拒绝服务攻击,指利用大量的合理请求,来占用过多的目标资源,从而使目标服务无法响应正常请求。

DDoS(Distributed Denial of Service) 则是在 DoS 的基础上,采用了分布式架构,利用多台主机同时攻击目标主机。

这样,即使目标服务部署了网络防御设备,面对大量网络请求时,还是无力应对。比如,目前已知的最大流量攻击,正是去年 Github 遭受的 DDoS 攻击,其峰值流量已经达到了 1.35Tbps,PPS 更是超过了 1.2 亿(126.9 million)。从攻击的原理上来看,DDoS 可以分为下面几种类型。

第一种,耗尽带宽。无论是服务器还是路由器、交换机等网络设备,带宽都有固定的上限。带宽耗尽后,就会发生网络拥堵,从而无法传输其他正常的网络报文。

第二种,耗尽操作系统的资源。网络服务的正常运行,都需要一定的系统资源,像是 CPU、内存等物理资源,以及连接表等软件资源。一旦资源耗尽,系统就不能处理其他正常的网络连接。第三种,消耗应用程序的运行资源。应用程序的运行,通常还需要跟其他的资源或系统交互。如果应用程序一直忙于处理无效请求,也会导致正常请求的处理变慢,甚至得不到响应。比如,构造大量不同的域名来攻击 DNS 服务器,就会导致 DNS 服务器不停执行迭代查询,并更新缓存。这会极大地消耗 DNS 服务器的资源,使 DNS 的响应变慢。无论是哪一种类型的 DDoS,危害都是巨大的。

在 Linux 服务器中,你可以通过内核调优、DPDK、XDP 等多种方法,来增大服务器的抗攻击能力,降低 DDoS 对正常服务的影响。而在应用程序中,你可以利用各级缓存、 WAF、CDN 等方式,缓解 DDoS 对应用程序的影响。

40 | 案例篇:网络请求延迟变大了,我该怎么办?

网络延迟

网络延迟——网络数据传输所用的时间。

除了网络延迟外,另一个常用的指标是应用程序延迟,它是指,从应用程序接收到请求,再到发回响应,全程所用的时间。通常,应用程序延迟也指的是往返延迟,是网络数据传输时间加上数据处理时间的和。

41 | 案例篇:如何优化 NAT 性能?(上)

另一个可能导致网络延迟的因素,即网络地址转换(Network Address Translation),缩写为 NAT。

NAT 原理

NAT 技术可以重写 IP 数据包的源 IP 或者目的 IP,被普遍地用来解决公网 IP 地址短缺的问题。它的主要原理就是,网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,自然也就为局域网中的机器提供了安全隔离。

SNAT 和 DNAT 的过程,就如下图所示:

iptables 与 NAT

Linux 内核提供的 Netfilter 框架,允许对网络数据包进行修改(比如 NAT)和过滤(比如防火墙)。在这个基础上,iptables、ip6tables、ebtables 等工具,又提供了更易用的命令行接口,以便系统管理员配置和管理 NAT、防火墙的规则。

SNAT

DNAT

NAT 技术能够重写 IP 数据包的源 IP 或目的 IP,所以普遍用来解决公网 IP 地址短缺的问题。它可以让网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的作用。

iptalbes的三个表

  • filter 这个表主要用于过滤包的,是系统预设的表,这个表也是阿铭用的最多的。内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。

  • nat 主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。该表阿铭用的不多,但有时候会用到。

  • mangle 这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面。

42 | 案例篇:如何优化 NAT 性能?(下)

NAT 技术能够重写 IP 数据包的源 IP 或目的 IP,所以普遍用来解决公网 IP 地址短缺的问题。

它可以让网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的作用。Linux 中的 NAT ,基于内核的连接跟踪模块实现。

所以,它维护每个连接状态的同时,也对网络性能有一定影响。

由于 NAT 基于 Linux 内核的连接跟踪机制来实现。所以,在分析 NAT 性能问题时,我们可以先从 conntrack 角度来分析,比如用 systemtap、perf 等,分析内核中 conntrack 的行文;然后,通过调整 netfilter 内核选项的参数,来进行优化。

其实,Linux 这种通过连接跟踪机制实现的 NAT,也常被称为有状态的 NAT,而维护状态,也带来了很高的性能成本。所以,除了调整内核行为外,在不需要状态跟踪的场景下(比如只需要按预定的 IP 和端口进行映射,而不需要动态映射),我们也可以使用无状态的 NAT (比如用 tc 或基于 DPDK 开发),来进一步提升性能。