川哥CD1
21-08-08 13:40

浅谈写缓存。

在存储系统中,写缓存是非常重要的组件。写缓存可以有效的提升存储的写性能。本文打算就本人的实践经验来谈谈写缓存如何提升写性能,以及写缓存组件开发过程中需要注意的一些问题。

写缓存的优化效果之一:缩短IO路径。写IO的数据先写入缓存,然后再写盘。将本来很长的IO路径,一分为二,原本需要写盘再返回的IO,直接在写入缓存以后就返回了。表现就是IO的响应时间极大的缩短。缩短IO路径这一特性,对于写的带宽不大的情况,效果明显。如果写带宽很大,很快就能把缓存写满的情况,还有优化效果吗?下面继续来分析下。

写缓存的优化效果之二:合并IO。对于多次写重叠位置或者相同位置的IO,便可以把多次IO合并为一次IO。减少IO次数,增加IO的大小对于有效利用底层磁盘或者SSD的带宽助益甚大。

写缓存优化效果之三:排序IO。将写IO写入缓存,按照偏移顺序排序。写缓存的IO异步刷盘的时候,按照顺序写入磁盘或者SSD。特别是对于磁盘来讲,顺序写的性能是要远高于随机写的。SSD顺序写和随机写虽然差距不像磁盘那么大,但顺序写依然性能更好。

写缓存优化效果之四:增加并发性。举个例子,假如上层线程是以单线程方式写入缓存。写缓存异步写的时候可以用多线程来并发刷盘。如此就把单线程变成了多线程,可以明显的提升写盘的吞吐量。

以上列举了写缓存的一些优化效果。那么写缓存一定是万能药吗?在极端情况下有没有可能反而起负优化效果呢?从以上列举的几个优势来看,只要应用在写数据的时候直接满足这几个条件,比如多线程、顺序以及大块写。这种情况下,从IO吞吐量的角度来讲已经可以达到底层磁盘存储的吞吐量上限。那么写缓存仅剩下一个缩短优IO路径的效果,不仅需要占用大量内存,还要做一次内存拷贝到缓存。这时候从整体上来看,加了写缓存实际上是起了负优化效果了。不过这种极端情况一般情况是不容易发生的。整体上来讲写缓存的还是非常有意义的。

下面来讲讲写缓存的一些注意事项。暂时能想到的主要有以下一些:1)尽量减少内存拷贝。由于有写缓存就会涉及到IO的合并和拆分,这个过程中会涉及到内存的拷贝,需要注意。2)刷盘的时机。当缓存累积到一定量、可以从容量以及IO个数来设定阈值,超过阈值便触发刷盘。另外如果一定时间内缓存量不足以触发刷盘,还需要设定一个时间阈值,超过超时时间,也要触发刷盘。3)读IO需要先读缓存再读底层磁盘。这时候一个读IO可能会被拆分为多个小的读IO。这种情况需要考虑,多个小的读IO是否开销更大,或者是不拆分,一次读开销更小。