NMAP与sendFile--网络编程中IQ性能优化利器

   一、概述:

      本文通过传统IO、nmap、sendFile三种方法数据读写的原理分析说明nmap、sendFile的优势。

  二、传统IO数据读写

  • 工作原理图:

  • 方案说明:
  1.      传统IO使用3次状态切换,4次copy(其中两次DMA COPY,两次CPU COPY);
  2.      DMA: direct memory access 直接内存拷贝(不使用CPU).

  三、NMAP 优化

  • 工作原理图:
  • 方案说明
  1. 使用3次状态切换,3次copy(其中2次DMA COPY,1次CPU COPY);
  2. mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户控件的拷贝次数。

   四、sendFile优化

   4.1Linux 2.1 版本

  • 工作原理图:

       

  • 方案说明:
  1. 使用2次状态切换,3次copy(其中2次DMA COPY,1次CPU COPY);
  2. 数据根本不经过用户态,直接从内核缓冲区进入到 Socket Buffer,同时,由于和用户态完全无关,就减少了一次上下文切换。
  • 适用场景:

     mmap 适合小数据量读写,

   4.2Linux 2.4 版本 

  • 工作原理图:

   

  • 方案说明:
  1. 使用2次状态切换,2次copy(DMA COPY);
  2. 避免了从内核缓冲区拷贝到 Socket buffer 的操作,直接拷贝到协议栈,从而再一次减少了数据拷贝(这里其实有 一次cpu 拷贝 kernel buffer -> socket buffer 但是,拷贝的信息很少,比如 lenght , offset , 消耗低,可以忽略)。
  • 适用场景:

      sendFile 适合大文件传输。

小结:

      平时我们说零拷贝,是从操作系统的角度来说的。因为内核缓冲区之间,没有数据是重复的(只有 kernel buffer 有一份数据)。 零拷贝不仅仅带来更少的数据复制,还能带来其他的性能优势,例如更少的上下文切换,更少的 CPU 缓存伪共享以及无 CPU 校验和计算。

发布了20 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/heijunwei/article/details/105448587