PPXu

关于页缓存技术提高中间件读写性能的应用

2019-03-17

页缓存

在计算机系统中,页面缓存(有时也称为磁盘缓存)是用于源自诸如硬盘驱动器(HDD)或固态驱动器(SSD)的辅助存储设备的页面的透明缓存。操作系统将页面缓存保留在主存储器(RAM,内存)的其他未使用部分中,从而更快地访问缓存页面的内容和达到整体性能改进。页面缓存在具有分页内存管理的内核中实现,并且对应用程序大多是透明的。通常是由操作系统将所有未直接分配给应用程序的物理内存用于页面缓存。

以linux系统为例,linux中页缓存的本质就是对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同进程之间的数据共享。

因此,linux中页缓存的引入主要是为了解决两类重要的问题:

1.磁盘读写速度较慢(ms 级别);

2.实现不同进程之间或者同一进程的前后不同部分之间对于数据的共享;

在虚拟内存机制出现以前,操作系统使用块缓存机制,但是在虚拟内存出现以后操作系统管理IO的粒度更大,因此采用了页缓存机制。此后,和后备存储的数据交互普遍以页为单位。页缓存是基于页的、面向文件的一种缓存机制。

简单来讲,页缓存就是一种副本技术,为加速磁盘读写而在内存中保留的一份磁盘数据的副本,又称为磁盘缓存、文件系统缓存、操作系统缓存等。

---- [Page Cache(From Wikipedia)](https://en.wikipedia.org/wiki/Page_cache)

页缓存在RocketMQ的应用

刷盘策略


作为一款纯 Java 语言开发的消息引擎,RocketMQ 自主研发的存储组件,依赖 Page Cache 进行加速和堆积,意味着它的性能会受到 JVM、 GC、内核、Linux 内存管理机制、文件 IO 等因素的影响。Rocketmq中的所有消息都是持久化到硬盘的,但会使用系统PageCache加速访问,消息的落地方式是先写PageCache后刷盘,可以保证内存与磁盘都有一份数据,访问时,可以直接从内存读取。如图所示,一条消息从客户端发送出,到最终落盘持久化。

---- [RocketMQ相关总结](/2018/11/18/RocketMQ-Summary/#刷盘策略)

Kafka的高性能写入

页缓存技术 + 磁盘顺序写

同RocketMQ的持久化操作的设计类似,Kafka每次接收到数据都会往磁盘上去写,而为了保证数据写入性能,Kafka也是基于操作系统的页缓存来实现文件写入的。

在消息生产端写入消息时,其实是直接写入到OS Cache(Page Cache)中,也就是说仅仅是写入到内存中,而接下来由操作系统自己决定什么时候把os cache里的数据真的刷入磁盘文件中。

另外,还有关键的一点,就是kafka写数据的方式是顺序写入,也就是说,仅仅将数据追加到文件的末尾,而不是在文件的随机位置来修改数据。

---- [Kafka如何实现每秒上百万的超高并发写入?](http://developer.51cto.com/art/201903/592916.htm)

Elastic Search 准实时搜索

Elasticsearch和磁盘之间有一层称为FileSystem Cache的系统缓存(OS Cache),正是由于这层cache的存在才使得es能够拥有更快搜索响应能力。

我们都知道一个index是由若干个segment组成,随着每个segment的不断增长,我们索引一条数据后可能要经过分钟级别的延迟才能被搜索,为什么有种这么大的延迟,这里面的瓶颈点主要在磁盘。

持久化一个segment需要fsync操作用来确保segment能够物理的被写入磁盘以真正的避免数据丢失,但是fsync操作比较耗时,所以它不能在每索引一条数据后就执行一次,如果那样索引和搜索的延迟都会非常之大。

所以这里需要一个更轻量级的处理方式,从而保证搜索的延迟更小。这就需要用到上面提到的FileSystem Cache,所以在es中新增的document会被收集到indexing buffer区后被重写成一个segment然后直接写入filesystem cache中,这个操作是非常轻量级的,相对耗时较少,之后经过一定的间隔或外部触发后才会被flush到磁盘上,这个操作非常耗时。但只要sengment文件被写入cache后,这个sengment就可以打开和查询,从而确保在短时间内就可以搜到,而不用执行一个full commit也就是fsync操作,这是一个非常轻量级的处理方式而且是可以高频次的被执行,而不会破坏es的性能。

---- [Elastic Search的近实时搜索](https://www.elastic.co/guide/cn/elasticsearch/guide/current/near-real-time.html)

框架的设计思想,本质大同

由一个页缓存技术的利用可以看出,多个中间件在处理数据高性能读写问题方面的思想基本大同。

扫描二维码,分享此文章