概述
相关术语
接口:interface port,接口端口,指网络物理连接器;”接口“或者”连接“指操作系统可见并且配置的网络接口端口的逻辑实例。
数据包:IP级可路由的报文
帧:一个物理网络级的报文,如以太网帧
带宽:对应网络类型的最大传输率,通常以b/s为单位测量。
吞吐量:当前两个网络端点之间的数据传输率,以b/s或者B/s为单位测量
延时:网络延时指一个报文往返端点所需的时间,或者指建立连接所需的时间(如TCP握手),不包括之后的数据传输时间
模型
网络接口
网络接口是网络连接的操作系统端点,是系统管理员可以配置和管理的抽象层。
作为网络接口的一部分,它被映射到物理网络端口;端口连接到网络上,并且通常有分离的传输和接收通道。
控制器
网络接口卡(NIC)给系统提供一个或多个网络端口并设有一个网络控制器:一个在端口与系统I/O传输通道间传输包的微处理器。控制器可作为独立的板卡提供或者内置于系统主板中。
协议栈
网络
一组由网络协议地址联系在一起的相连主机
路由管理
包的跨网络传递
协议
网络协议标准是系统与设备间通信的必要条件,通信由传输称为‘包’的报文来实现。
网络协议具有不同的性能特性,源自初始的协议设计、扩展,或者软硬件的特殊处理。IPv4和IPv6可能会由不同的内核代码路径处理,进而表现出不同的性能特性
通常系统的可调参数也能影响协议性能,如修改缓冲区大小、算法以及不同的计时器设置。
包长度
通常受限于网络接口的最大传输单元(MTU)长度,许多以太网中它设置为1500B。
以太网支持接近9000B的特大包(巨型帧),但陈旧的网络硬件和未正确配置的防火墙影响了巨型帧的接受程度
- 不支持巨型帧的陈旧硬件可能会用IP协议分段包或者返回ICMP“不能分段”错误来要求发送方减小包长度
- 为了阻止基于ICMP网络工具攻击(包括死亡之ping),设置防火墙阻塞所有ICMP包方式应对,导致阻止了有用的“不能分段”报文到达发送方,并且一旦包长度超过1500将导致网络包被静默地丢弃。
大段的缓冲被发往网络接口卡,网卡利用优化过的专用硬件将缓冲分割为较小的帧,在某种程度上缩短了1500与9000MTU之间的性能差距
延时
主机名解析延时、ping延时、连接延时,首字节延时、往返延时、以及连接生命周期;这些都是以客户机连接到服务器的延时来描述。
主机名解析延时
主机名解析为IP地址的耗时,如DNS解析( dns解析耗时);最坏情况是解析超时通常需要十几秒
ping延时
ping命令测量的ICMP echo请求到echo响应所需时间。衡量主机对之间网络跳跃的网络延时,测量的是包往返的总时间。接收端ICMP echo请求通常做中断处理并立即返回,尽可能的减少了内核代码运行的时间;发送端由于时间戳由用户层测量,包括内核上下文切换和内核代码路径时间,可能会包括少量附加的时间
连接延时
传输任何数据前建立网络连接所需要的时间。对于TCP而言是TCP握手时间,以客户段发送SYN到接收到响应的SYN-ACK的时间;TCP SYN包在队列已满的情况下会被服务器丢弃,引起客户机重传SYN,由于发生在握手阶段,连接延时包括重新传输时,会增加1s或更多
首字节延时
TTFB第一字节到达时间,从连接建立到接收到第一个字节数据所需要的时间。包括远程主机接受连接、调度提供服务的线程,并执行线程以及发送第一个字节所需的时间。
相对于ping延时和连接延时,首字节延时包括目标服务器处理时间,这可能包括当服务器过载时需要时间处理请求(TCP积压队列)以及调度服务器(CPU队列处理延时)造成的延时
往返延时
网络包往返连个端点所需的时间
连接生命周期
一个网络连接从建立到关闭所需要的时间。
缓冲
较大的缓冲可以通过在阻塞和等待确认前持续传输数据缓解高往返延时带来的影响
TCP利用缓冲以及可变的发送窗口提升吞吐量,网络套接字也保有缓冲,并且应用程序也会利用它们自己的缓冲在发送前聚集数据。外部网络组件如交换机和路由器也会利用缓冲提高它们的吞吐量,但如果包长时间在队列中,会导致被称为缓存膨胀的问题,这会引发主机中的TCP阻塞避免会限制性能,linux3.x内核解决了该问题(包括字节队列极限,CoDel队列管理,TCP微队列)
连接积压队列
TCP的积压队列会把SYN请求在用户级进程接收前列队于内核中。过多的TCP连接请求超过进程当前处理能力,积压队列会达到极限而丢弃客户机可以迟些时候再重新传输SYN包。这些包的重新传输会增加客户连接的时间。
接口协商
通过与对端自动协商,网络接口能够工作于不同的模式。
带宽:如10,100,1000,10000MB/s
双工(模式):半双工或者全双工
网络接口通常用它们的最大宽带及协议描述,如1GB/s以太网(1GbE)
必要时接口可以协商用较低的速率,如果对端不能支持更高的速率,或者不能处理连接介质的物理问题(线路故障)时。
使用率
网络接口的使用率可以用当前的吞吐量除以最大带宽来计算。
全双工需要对每个方向进行计算,一旦网络接口方向达到100%使用率就会称为瓶颈。
本地连接
本地连接会使用一个虚拟的网络接口:回送接口。
通过IP与本急通信时IP套接字的进程间通讯技巧;另外一个技巧时UNIX域套接字(UDS),它在文件系统中建立一个用于通信的文件,由于省略了TCP/IP栈的内核代码以及协议包封装的系统开销,UDS性能会更好。
对于TCP/IP套接字内核能够在握手后检测到本地连接,进而为数据传输短路TCP/IP栈以提高性能。
架构
协议
TCP
传输控制协议(TCP)是一个常用的用于建立可靠网络连接的互联网标准。
即使在高延时的网络中,利用缓冲和可变窗口,TCP也能提供高吞吐量。TCP还会利用阻塞控制以及由发送方设置的阻塞窗口,保持高速且跨越不同并变化的网络中保持合适的传输速率。
阻塞控制能避免会导致网络阻塞进而损害性能的过度发送。
TCP新能特性:
- 可变窗口:允许在收到确认前在网络上发送总和小于窗口大小的多个包,以在高延时的网络中提供高吞吐量。窗口的大小由接收方通知以表明当前它愿意接受的包的数量
- 阻塞避免:阻止发送过多数据进而导致饱和,会导致丢包而损害性能
- 缓启动:TCP阻塞控制的一部分,会以较小的阻塞窗口开始而后按一定时间内接收到的确认(ACK)逐渐增加;如果没由收到,阻塞窗口会降低
- 选择性确认(SACK):允许TCP确认非连续的包,以减少需要重传输的数量
- 快速重传输:TCP能基于重复收到的确认重传输被丢弃的包,而不是等待计时器超时。这只是往返时间的一部分而不是通常更慢的计时器。
- 快速恢复:通过重设连接而开始慢启动,以在检测到重复确认后恢复TCP性能
关于TCP性能的重要内容包括三次握手、重复确认检测、阻塞控制算法、nagle算法、延时确认、sack和fack
重复确认检测:
快速重传和快速恢复会利用重复确认检测算法。它运行于发送方,工作方式如下:
- 发送方发送一个序号为10的包
- 接收方返回一个序号为11的确认包
- 发送方发送包11、12、13
- 包11被丢弃
- 接收方发送序号为11的确认包以响应12和13,表明它仍然在等待(包11)
- 发送方收到重复的序号为11的确认包
阻塞控制:Reno 和 Tahoe
Reno:三次重复确认触发器,即阻塞窗口减半、慢启动阈值减半、快速重传和快速恢复
Tahoe:三次重复确认触发器,即快速重传、慢启动阈值减半、阻塞窗口设置为最大报文段长度(MSS)和慢启动状态
Vegas、NewReno、Hybla
这些先记一笔吧,估计后面也不会太关注了,但是没事还是可以看看拥塞控制相关的内容
Nagle算法
通过推迟小尺寸包的传输以减少网络中这些包的数量,从而使更多的数据能到达与合并。
延时ACK
该算法推迟最多500ms发送ACK,从而能合并多个ACK,其他TCP控制报文也能合并,进而减少网络中包的数量。
SACK与FACK
TCP选择性确认(SACK)算法允许接收方通知发送方收到非连续的数据块。如果缺乏这一特性,为保留顺序确认的结构,一个丢包会导致整个发送窗口被重新传输。
linux默认支持由SACK扩展而来的向前确认(FACK),FACK跟踪更多的状态并且能更好地控制网络中未完成的数据传输,并提高整体性能。
UDP
用户数据报协议是一个常用于发送网络数据报文的互联网标准
简单:简单而短小的协议头降低了计算与长度带来的系统开销
无状态:降低连接与传输控制带来的系统开销
无重新传输:
UDP并不可靠,而且数据可能会丢失或者被乱序发送。
硬件
网络硬件包括接口、控制器、交换机和路由器。
接口
物理网络接口在连接的网络上发送并接收称为帧的报文,它们处理包括传输错误在内的电器、光学或者无线信号。
接口类型基于第2层网络标准,每个类型都存在最大带宽,高带宽接口通常延时更低成本更高。
接口使用率用当前的吞吐量除以当前协商的带宽来测量,多数接口分离传输与接收通道,因此当处于全双工模式时,每个通道的使用率必须分别研究。
控制器
物理网络接口由控制器提供给系统,集成于系统板或者利用扩展卡。
控制器由微处理驱动并通过I/O传输通道接入系统,其中任意一个都可能成为网络吞吐量或者IOPS的瓶颈。
交换机、路由器
交换机提供两个接入的主机专用的通信路径,允许对多主机间的多个传输不受影响。
路由器在网络间传递数据包,并且用网络协议和路由表来确认最佳的传递路径。路由器和路由经常时设置为动态更新的,因此网路能够自动响应网络和路由器的停机以及平衡负载。这意味着在任意时点,不可能确认一个数据包的实际路径,由于多个可能的路径,数据包有可能被乱序送达,进而引起TCP性能问题。
路由器和交换机都包含微处理器,它们本身在高负载情况下会成为性能瓶颈。
其他
环境中可能包括其他物理网络设备,如集线器、网桥、中继器和调制解调器,其中任何一个都可能成为性能瓶颈的源头并且丢包。
软件
网络通信软件包括网络栈、TCP和设备驱动程序
网络栈
涉及的组件和层依赖操作系统的类型、版本、协议以及使用的接口而不同。
现代内核中网络栈时多线程的,并且传入的包能被多个CPU处理。传入的包与CPU的映射可用多个方法完成:可能基于源IP地址哈希以平均分布负载,或者基于最近处理的CPU以有效利用CPU缓存热度以及内存本地性。
linux系统中,TCP、IP以及通用网络驱动软件是内核的核心组件,而设备驱动程序是附加模块。数据包以struct sk_buff数据类型穿过这些内核组件。
新API能通过合并中断提高性能
- RSS 接收端缩放:现代NIC能支持多个队列并且计算包哈希以置入不同队列,而后依次按照直接中断由不同的CPU处理。这个哈希值可能基于IP地址以及TCP端口号,因此源自同一个连接的包能被同一个CPU处理。
- RPS 接收数据包转向:对于不支持多个队列的NIC的RSS软件实现。一个短中断服务例行程序映射传入的数据包给CPU处理,用一个类似的哈希数据包头的字段映射数据包到CPU
- PFS 接收流转向:类似RPS,不过偏向前一个处理套接字的CPU,以调高CPU缓存命中率以及内存本地性
- 加速接收数据流转向:对于支持该功能的NIC,这是RFS的硬件实现。它用流信息更新NIC以确定中断哪个CPU
- XPS 传输数据包转向:对于支持多个传输队列的NIC,这支持多个CPU传输队列
当缺乏数据包的CPU负载均衡策略时,NIC会中断同一个CPU,进而达到100%使用率并成为瓶颈。基于例如RFS实现的缓存一致性等因素而映射中断到多个CPU,能够显著提升网络性能。这也能通过irqbalancer进程实现,它能分配中断请求(IRQ)给CPU。
TCP
TCP实现的性能特征:积压队列和缓冲
突发的连接由积压队列处理:此处有两个此类队列,一个在TCP握手完成(也称为SYN积压队列)前处理未完成的连接,另一个处理等待应用程序接收(也称为侦听积压队列)的已建立的会话。
早期内核仅使用一个队列,容易受到SYN洪水攻击(DoS攻击的一种,从伪造的IP地址发送大量的SYN包到TCP侦听端口),会在TCP等待完成握手时填满积压队列,进而阻止真实的客户连接。有两个队列的情况下,第一个可以作为潜在的伪造连接的集结地,仅在连接建立后才迁移到第二个队列。第一个队列可以设置得很长以吸收海量SYN并且优化为仅存放最少的必要元数据
利用套接字的发送和接收缓冲能够提升数据吞吐量。
对于写通道,数据缓冲在TCP发送缓冲区,然后送往IP发送。尽管IP协议有能力分段数据包,TCP仍试图通过发送MSS长度的段给IP以避免这种情况。这意味着(重)发送单位对应分段单位,否则一个被丢弃的数据会导致整个分段前的数据包被重新传输。由于避免了分段和组装常规数据包,这种实现方式能够提升TCP、IP栈的效率。
发送和接收的缓冲区大小是可调的,以在每个连接上消耗更多主内存为代价,更大的尺寸能够提升吞吐性能。如果服务器需要处理更多的发送或者接收,某个缓冲区可以设置得比另一个大。
网络设备驱动
网络设备驱动通常还有一个附加的缓冲区——环形缓冲区,用于在内核与NIC间发送和接收数据包。
一个中断仅在计时器激活或者达到一定数量的包时才被发送,而不是每当有数据包到达就中断内核。这降低了内核与NIC通信的频率,允许缓冲更多的发送,从而达到更高的吞吐量,尽管会损失一些延时。
最后
以上就是糟糕秀发为你收集整理的网络性能概述的全部内容,希望文章能够帮你解决网络性能概述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复