网络的性能指标
(1)可用性
- 网络不可用就是断网。
- 没有网络,那就什么也干不了
- 所以,对于网络来讲,最重要的是网络是否可以正常联通
那,如何测试可用性呢?
- 可以
ping
一下:- 这个命令其实就是向远端的机器发送ICMP的请求数据包,并等待接收对方的回复。
- 通过请求和应答返回的对比,来判断远端的机器是否联通,也就是为网络是否正常工作
(2)响应时间
- 端到端的数据一次往返所花费时间,就是响应时间
- 响应时间受很多因素的影响,比如端到端的物理距离、所经过网络以及负荷、两端主机的负荷等
(3)网络带宽容量
- 在网络的两个节点之间的最大可用带宽
- 这一指标一般是设备和网络协议决定的,比如网卡、局域网和TCP/IP的特性。如果是向网络供应商购买的带宽,那么购买的数量就是网络的带宽容量
(4)网络吞吐量
- 在某个时刻,在网络中的两个节点之间,端到端的实际传输速度
- 网络吞吐量取决于当前的网络负载情况,而是是随着时间不同而变化的
(5)网络利用率
- 网络被使用的时间占总时间的比例,一般以百分比来表示。
- 因为数据传输的突发性,所以实际中的网络利用率一般不会太高,否则的话,响应时间就不能保证了
对于网络性能要求,简单来说就是能联通、响应快、带宽高;并且在部署大流量服务时,可以优化服务器的部署,来尽量减少外部网络流量;也可以使用 CDN 来加速数据传输。
单机的网络性能
了解了网络方面性能的指标后,我们接着讨论具体的网络性能。虽然网络传输需要两端进行,但是我们必须从单机开始,来清楚的了解网络的协议栈。
网络协议其实相当复杂,而且分很多层级。操作系统内核中,最大的一个子系统或许就是网络。网络子系统有多个协议组成,其中每个协议都在更原始的协议之上工作。当用户数据通过网络协议栈传递时,数据都会被封装在该协议的数据包中。
在考虑多层协议进行交互时,我们尽量把思路简化。其实它们之间的关系很简单,就是网络协议栈的每一层都有其职责,与其他底层或者高层协议无关。
举个例子,IP层
- IP层是第三层的协议,它是通过路由器和网络发送端到端的数据报
- 它的主要目的,就是在网络中的每一段找到路由路径,从而最终能够到底数据报的接收低
- 但它不保证数据的有效性,也就是转发过程中几个数据报会重新排序
- 同时也不保证整个数据的完整性和可靠性,比如丢失的数据报那就是丢失了,IP层不会重传
那么数据的可靠性是谁保证的呢?
- 这就是需要更上层的TCP协议实现
- TCP协议通过检测数据丢失并且重传,来保证数据的可靠性,也通过序列号来保证数据的有序性
但是,这两层协议:TCP层和IP层,都只能传输原始的数据;而对于数据是否被压缩过,这些数据表示什么,是在更高层的协议(比如HTTP和应用层)上实现的
我们接着具体到网络协议的程序实现。在Unix系统中,网络协议栈大体可以分为三层,从上到下:
- 第一层是通过一系列的系统调用,实现BSD套接字的套接字层,比如sendmsg()函数
- 第二次是中间协议的程序,比如TCP/IP/UDP
- 第三层是底部的媒体访问控制层,提供对网络接口卡NIC本身的访问。
如下图所示:右边是发送端,左边是接收端。
- 从右边看起,最上层是BDS套接字,它通过一系列的API调用,比如connect等,然后是TCP的发送,再到IP的发送 ,最后到网卡的发送缓冲区,并最终通过网卡发出
- 接收端,也就是图的左边,就经过相反的顺序,逐层到达应用层
数据中心的网络性能
说完单机的网络性能,我们接着讨论端到端的互联网数据传输。
一台服务器和互联网的远端服务器进行数据传输的时候,需要经过好几层交换器和不同的网络。数据从一台服务器的网卡发出来之后,下一步就是经过机柜上面的交换器,然后是数据中心内部的网络,再进入互联网骨干网络。接收端的情况正好相反。
对于这些中间的网络构建,我们一个个讨论一下。
机柜交换器(TOR, Top Of Rack; or RSW, Rack Switch)
- 数据中心里面的服务器不是单独放置的,一般是几十台服务器组成了一个机柜,机柜上面会有机柜交换机。
- 这个机柜交换机的作用,一方面让机柜内部的服务器直接互通;另一方面,机柜交换机会有外联线路,连接到数据中心的骨干网络
数据中心网络
数据中心网络里面也分了好几层,从TOR到集群交换器(cluster switch),再到集合交换器(aggregation switch)等,最后到数据中心路由器。
上图简单展示了机柜内部的网络和POD内部网络
- TOR1是机柜交换器,负责机柜内部几十台服务器之间的数据交换。
- POD1内部网络包含很多很多机柜
注意,这个多层次结果中,一般越是上层,总的带宽越少
- 比如,服务的网卡带宽是25Gbps,即使这个机柜内有30台服务器,总带宽就是750Gbps
- 机柜交换器TOR的外部带宽有多少呢?可能只有100Gbps。这个差距就叫做带宽超订
- 同样的,POD交换器之间的带宽会继续变小。
- 之所以允许带宽超订,是因为多数的数据交换是在内部进行的,不会全部都和外部进行交换
知道这一点是必要的,因为我们做网络方面和服务部署优化的时候,需要考虑这点,不要让高层的网络带宽成为性能瓶颈。比如假设两个服务分别用不同的服务器,它们之间的数据交换如果很多的话,就尽量让它们运行在同一个机柜的服务器里面;如果不能保证同一个机柜,就尽量是同一个POD内部
互联网的网络性能
讲完了数据中心内部的网络,我们继续往外扩展,讨论互联网的网络性能。互联网上运行的是TCP/IP协议。这两个协议本身比较复杂,有很多和性能相关的特性值得仔细学习。
一个常见的性能问题是丢包
- TCP对丢包非常敏感,因为每次丢包,TCP都认为是网络发生了拥塞,因此就会降低传输速度,并且采用重传来回复,这就影响网络性能
- 实际情况中,造成丢包的原因有很多,不一定就是网络拥塞,因此我们需要进行各种测试观察来做根因分析
- 通常的丢包原因,是端对端的网络传输中的某一段发生了问题,或许是拥塞,或许是硬件问题,也或许是其他软件原因。我们需要一步步的逐层逐层的排除
- 对于网络的每段,可以用工具(比如tracerouter)来发现每一段路由,然后逐段测试
- 对于协议的每层,都可以用相关工具进行分析。
- 比如TCP层,可以用netstat观察是不是套接字缓存不够
- 对于操作系统,可以用softnet-stat,来判断CPU的查询队列
- 对网卡驱动,可以用ethtool等进行分析
内容分发网络(CDN)的性能
当今互联网几乎普遍采用内容分发网络来提高网络性能。内容分发网络,也叫CDN(Content Delivery Network 或 Content Distribution Network,CDN),是一种分布式网络,它可以有效的将web内容交付给用户。
内容分发网络的基本原理是,利用最靠近每位用户的服务器,更快、更可靠的将文件发送给终端用户,而不是每次依赖于中心服务器。靠近用户的服务器,一般叫做边缘服务器,会把请求的内容最大限度的缓存,以尽量减少延迟。
工作方式:
- 用户A通过具有特殊域名的URL来请求文件。DNS将请求重定向到性能最佳的边缘服务器,该位置通常是地理位置上最接近用户的服务器
- 如果重定向的边缘服务器A中没有文件,则边缘服务器会向源服务器请求该文件。源服务器可以是任何公开或者非公开访问的web服务器
- 源服务器将文件返回给边缘服务器
- 边缘服务器先缓存文件,并将文件返回给原始请求者。该文件将保留在边缘服务器上,这样下次这个文件就可以快速返回请求的客户。这个文件会保存到什么时候呢?时间由其HTTP标头指定的生存时间(TTL)到期为止
- 如果用户B用相同 URL 请求相同的文件,也可能定向到相同的边缘服务器。
- :如果文件的 TTL 尚未过期,则边缘服务器直接从缓存中返回文件。这样的用户体验就更快。
内容分发网络的边缘服务器会在多个地点,多个不同的网络上摆放。这些节点之间通常会相互传输内容,对用户下载行为进行最优化,并借此改善用户的下载速度,提高系统的稳定性。同时,将边缘服务器放到不同地点,也可以减少网络互连的流量,进而降低带宽成本。
内容分发网络提供商往往有很大的规模,比如几十万台服务器。对服务的客户提供所需要的节点数量会随着需求而不同。
工具
- Netperf 是一个很有用的网络性能的测量工具,主要针对基于 TCP 或 UDP 的传输。
- Netperf 有两种操作模式:批量数据传输和请求 / 应答模式,根据应用的不同,可以进行
不同模式的网络性能测试 - Netperf 测试结果所反映的,是一个端到端的系统能够以多快的速度发送数据和接收数据。
- Netperf 有两种操作模式:批量数据传输和请求 / 应答模式,根据应用的不同,可以进行
- Iperf 这个工具也以测试 TCP 和 UDP 带宽质量,比如最大 TCP 带宽,延迟抖动和数据包丢失等性能参数。
- Netstat 这一命令可以显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,提供 TCP连接列表,TCP 和 UDP 监听,进程内存管理的相关报告,一般用于检验本机各端口的网络连接情况。
- Traceroute 这一命令可以帮我们知道,数据包从我们的计算机到互联网远端的主机,是走的什么网络路径。