从零拷贝视角看性能优化 | 青训营

87 阅读3分钟

这是我参与第六届青训营伴学笔记创作活动的第2天。

计算机领域的任何问题都可以通过增加一个间接的中间层来解决。

硬件基础

计算机系统由硬件和软件两部分组成。硬件包括处理器、内存、输入输出设备等,而软件则分为系统软件和应用软件。操作系统是一种重要的系统软件,负责管理计算机硬件设备、提供应用程序开发环境,并为用户提供命令和功能来使用计算机。

操作系统使用户能够与计算机进行交互,同时隐藏了底层硬件的复杂性。操作系统与应用软件之间的接口通过系统调用来实现。在计算机体系结构中,存在内核态和用户态两种模式。内核态允许执行特权指令,而用户态只能执行一般指令,这种模式切换有助于保护核心代码不受恶意程序的影响。

零拷贝

零拷贝(Zero-Copy)是一项优化技术,用于提高数据传输性能,目的是减少拷贝次数,并非一定是“零拷贝”。例如,Kafka使用零拷贝技术来实现高性能的数据传输。零拷贝技术的核心思想是直接将数据从源存储器(比如磁盘文件)传输到目标设备(比如网卡),而不需要在中间经过应用程序的内存。这样做可以减少内核态和用户态之间的上下文切换,并通过直接内存访问(DMA)技术来实现。

DMA

DMA(Direct Memory Access)是一种数据传输方式,它在主存和I/O设备之间建立了直接通路,可以在DMA控制器的控制下实现设备和主存之间的数据交换。DMA方式适用于高速设备与主存之间的大批量数据传输,减少了CPU干预的次数。

客户端请求过程

让我们来看一个典型的客户端请求内容的过程:

  1. 客户端发起请求,请求经过解析后,由用户态转换为核心态,操作系统的TCP/IP协议代码和网卡驱动程序控制网卡将请求发送到网络上。
  2. Web服务器接收请求,内核通过网卡将请求传递给Web服务器的应用程序。
  3. Web服务器处理请求,生成内容,并由内核将结果发送回内核模式。
  4. 内核通过网卡将响应传递给客户端,客户端接收并显示内容。

在这个过程中,涉及用户态和核心态之间的切换,以及数据在不同缓冲区之间的复制。而使用零拷贝技术可以减少这些复制过程和上下文切换,提高数据传输效率。

在传统的数据传输过程中,数据可能需要在内核模式和用户模式之间多次复制,增加了性能开销。而使用零拷贝技术,数据可以直接从源到目标,避免了不必要的复制,从而提高了数据传输效率。