前言

经过对Linux CPU、内存、I/O的性能指标了解后,我们今天再来看Linux另外一个重要的模块-网络的性能指标。
网络是一种把不同计算机或网络设备连接到一起的技术,它本质上是一种进程间的通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行。
同样,先简单了解下Linux网络的工作过程,这样才能帮助我们更好地理解网络的性能指标。

Linux网络是如何工作的

说到网络,离不开网络模型。我们熟知的有OSI七层网络模型,以及实际更实用的四层模型,即TCP/IP网络模型。TCP/IP把网络互联的框架分为应用层、传输层、网络层、网络接口层,各层分工如下:

  • 应用层:负责和面向用户的应用程序协同工作,相关协议包括HTTP、FTP、DNS等
  • 传输层:负责端到端的通信,相关协议包括TCP、UDP等
  • 网络层:负责网络包的封装、寻址和路由,相关协议包括IP、ICMP等
  • 网络接口层:负责网络包在物理网络中的传输,比如MAC寻址、错误侦测以及通过网卡传输网络帧等,相关协议包括ARP等

Linux内核中的网络栈,也类似于TCP/IP的四层结构,如下为Linux通用IP网络栈的示意图
image.png
从上到下看这个网络栈,可以发现:

  • 最上层的应用程序,需要通过系统调用,来跟套接字接口(Socket)进行交互
  • 套接字下面,分别是传输层(红色)、网络层(橙色)、网络接口层(蓝色)
  • igb、bnx为网卡驱动程序
  • 最底层是物理网卡设备

网卡是发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中。而在网络发送、接收过程中,内核通过中断跟网卡进程交互。对于中断在CPU一文中已介绍过,网卡硬中断处理硬件事件,即做网卡数据读取或发送,而软中断会处理内存中的网络数据,按照网络协议栈,一层一层的解析(从物理层到应用层),直到把数据送到应用程序。

下图为网络包的发送和接收处理过程,左半部分表示接收流程,右半部分为发送过程,箭头为处理路径
image.png
其中

  • DMA为直接存储器访问(Direct Memory Access),可以实现将硬件(如网卡)的数据直接搬到内存中(反之亦可),而不需要依赖CPU的大量中断来完成
  • 环状是网卡收发网络包时,通过DMA方式交互的环形缓冲区

了解完网络的基本工作过程后,我们来看Linux常见网络性能指标

Linux网络性能指标

对于网络性能优化的目标,总的来说就是降低网络延迟(RTT),提高吞吐量(BPS、PPS)。
而对应于性能指标,总的来说,我们通常用带宽、吞吐量、延时、PPS等指标衡量网络的性能

  • 带宽:表示链路的最大传输速率,单位通常为b/s(比特/秒)
  • 吞吐量:表示单位时间内成功传输的数据量,单位通常为b/s或者B/s(字节/秒)。吞吐量受带宽限制,而吞吐量/带宽,就是该网络的使用率
  • 延时:表示从网络请求发出后,直到收到响应所需的时间延迟。在不同场景中,这一指标可能会有不同的含义,比如可以TCP三次握手延时(即建立连接所需时间)、一个数据包往返所需时间(RTT)
  • PPS:是Packet Per Second(包/秒)的缩小,表示以网络包为单位的传输速率。PPS通常用来评估网络的转发能力,比如硬件交换机

除此之外,如丢包率(丢包百分比)、并发连接数(TCP连接数量)、重传率(重新传输的网络包比例)等也是常用的性能指标。

从网络模型分层的视角看,其实底层是其上方各层的基础,底层性能也决定了高层性能。接下来我们从下到上,来理解每层的性能指标有哪些

  • 网络接口层、网络层:主要负责网络包的封装、寻址、路由、发送和接口,每秒可处理的网络包数(PPS),就是它们最重要的性能指标(特别是在小包的情况下)
  • 传输层:主要负责网络传输,吞吐量(BPS)、连接数以及延迟,就是最重要的性能指标
  • 应用层:更需要关注吞吐量(BPS)、QPS以及延迟等指标

总结

本文主要讲了Linux网络常见性能指标,通过以下脑图可以有个整体上的认识 理解Linux网络性能指标 - 图3

参考链接