后端进阶8.24日课程笔记(下) | 青训营

104 阅读2分钟

此处延续(上)的内容
C.sendtile + gather

  • 利用 Linux 内核的 sendfile 函数,直接在内核空间完成数据从文件到 Socket 的复制,不需要先从内核空间复制到用户空间
  • 配合 gather 函数,可以同时写多个不连续的缓冲区到 Socket,减少缓冲区拷贝次数
  • 优点:避免了用户空间到内核空间的多次数据拷贝,大大提高了数据传输效率;减少了缓冲区拷贝次数,降低了 CPU 和内存的消耗;节省了用户态和内核态之间的多次切换,减少了上下文切换的开销。
  • 缺点:需要操作系统和内核支持 sendfile 和 gather,增加了一定的开发难度;仅适用于文件到网络的场景,其他场景无法使用;如果有大量小文件,gather 就无法发挥优势;需要程序员自己保证缓冲区的正确性,编程复杂度较高

D.splice

  • splice可以在内核空间直接进行数据管道间的拷贝,无需将数据复制到用户空间
  • 支持零拷贝地在文件描述符、管道、socket 等之间直接传输数据。
  • 调用简单,不需要复杂的缓冲区管理。
  • 优点:避免了用户态和内核态之间的数据复制,减少了上下文切换,提高了效率;可以在毫无CPU消耗的情况下移动大量数据,减轻CPU和内存开销;简化了数据传输,不需要像sendfile那样管理缓冲区;支持各种场景下的零拷贝数据传输。
  • 缺点:需要内核支持splice,旧内核版本可能无法使用; 只能在内核空间操作,无法利用用户空间的数据处理;不够灵活,无法精确控制缓冲区和数据大小;如果数据源和目的不连续,效率不高;

总结如下:

image (2).png

3.GO语言中的实现

4。零拷贝的应用

小标题:Kafka vs RocketMQ如何通过零拷贝技术提升吞吐率&实现百万级并发

Kafka 发送消息的过程类似,生产和消费的联系,通过broker联系;性能优化点在于顺序读写,页缓存技术,mmap,sendfile。

RocketMQ发送消息的过程也类似生产和消费,通过broker联系;性能优化在于mmap。