我是靠谱客的博主 土豪帆布鞋,最近开发中收集的这篇文章主要介绍Kafka高性能页缓存技术 + 磁盘顺序写零拷贝技术,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

页缓存技术 + 磁盘顺序写

页缓存技术 + 磁盘顺序写主要体现在生产者生产数据这块

首先 Kafka 每次接收到数据都会往磁盘上去写,如下图所示:
在这里插入图片描述
为了保证数据写入性能,首先 Kafka 是基于操作系统的页缓存来实现文件写入的。
操作系统本身有一层缓存,叫做 Page Cache,是在内存里的缓存,我们也可以称之为 OS Cache,意思就是操作系统自己管理的缓存。
你在写入磁盘文件的时候,可以直接写入这个 OS Cache 里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把 OS Cache 里的数据真的刷入磁盘文件中。可以将磁盘文件写性能提升很多了,因为其实这里相当于是在写内存,不是在写磁盘,大家看下图:
在这里插入图片描述
另外一个就是 kafka 写数据的时候,非常关键的一点,它是以磁盘顺序写的方式来写的。仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。
普通的机械磁盘如果你要是随机写的话,确实性能极差,也就是随便找到文件的某个位置来写数据。
但是如果你是追加文件末尾按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上可以跟写内存的性能本身也是差不多的。

零拷贝技术

零拷贝技术体现在消费者消费数据这块
从 Kafka 里我们经常要消费数据,那么消费的时候实际上就是要从 Kafka 的磁盘文件里读取某条数据然后发送给下游的消费者,如下图所示:
在这里插入图片描述
假设要是 Kafka 什么优化都不做,就是很简单的从磁盘读数据发送给下游的消费者,那么大概过程如下所示:

  • 先看看要读的数据在不在 OS Cache 里,如果不在的话就从磁盘文件里读取数据后放入 OS Cache。

  • 接着从操作系统的 OS Cache 里拷贝数据到应用程序进程的缓存里,再从应用程序进程的缓存里拷贝数据到操作系统层面的 Socket 缓存里。

  • 最后从 Socket 缓存里提取数据后发送到网卡,最后发送出去给下游消费。
    在这里插入图片描述
    可以看到有两次没必要的拷贝吧!一次是从操作系统的 Cache 里拷贝到应用进程的缓存里,接着又从应用程序缓存里拷贝回操作系统的 Socket 缓存里。为了进行这两次拷贝,中间还发生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。Kafka 为了解决这个问题,在读数据的时候是引入零拷贝技术。
    直接让操作系统的 Cache 中的数据发送到网卡后传输给下游的消费者,中间跳过了两次拷贝数据的步骤,Socket 缓存中仅仅会拷贝一个描述符过去,不会拷贝数据到 Socket 缓存。

在这里插入图片描述
通过零拷贝技术,就不需要把 OS Cache 里的数据拷贝到应用缓存,再从应用缓存拷贝到 Socket 缓存了,两次拷贝都省略了,所以叫做零拷贝。对 Socket 缓存仅仅就是拷贝数据的描述符过去,然后数据就直接从 OS Cache 中发送到网卡上去了,这个过程大大的提升了数据消费时读取文件数据的性能。

而且大家会注意到,在从磁盘读数据的时候,会先看看 OS Cache 内存中是否有,如果有的话,其实读数据都是直接读内存的。
如果 Kafka 集群经过良好的调优,大家会发现大量的数据都是直接写入 OS Cache 中,然后读数据的时候也是从 OS Cache 中读。
相当于是 Kafka 完全基于内存提供数据的写和读了,所以这个整体性能会极其的高。

最后

以上就是土豪帆布鞋为你收集整理的Kafka高性能页缓存技术 + 磁盘顺序写零拷贝技术的全部内容,希望文章能够帮你解决Kafka高性能页缓存技术 + 磁盘顺序写零拷贝技术所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部