问题的来源是这样的。
我们的服务有大概20G的索引文件(大概两百多个文件),现在的加载方式是使用mmap(该命令之后会有专门的一篇文章介绍)。使用这个命令的好处就是初始化速度非常快,但是也带来了一些问题。比如第一次查询某个词的时候速度就会特别慢,这当然和mmap只建映射却不拷贝有关。为了解决该问题,领导让我思考一下如何能快速的把20G的文件加载进来。
我是这么考虑的。首先一个一个文件读取是最简单的方案。毫无疑问,这种方案的瓶颈在于IO。如果要减小io,自然想到去压缩,但是解压过程是个费cpu的操作,那么是否可以并行呢?有点眉目了:0)
该方案的架构如下图所示:
选择的压缩方式是xz,其原因是xz的压缩率相对于gzip更高,而且解压速度和gzip相当(xz的压缩速度确实慢…)。
代码写出来了,两种方案的效果如何呢?
1. 首先压缩率为1/6(不同格式应有不同);
2. 方案二的速度在8线程的情况下较方案一提高了66%;
3. 但是如果重复加载,方案一的速度会很快,因为大部分已经在内存中了,操作系统并没有释放它们
4. 如果还有别的服务在该机器上,那么方案一的速度会很慢,因为不再是顺序读io了
回到原先的问题,首先不管哪个方案都可以结果第一次查询慢的问题。方案一的问题在于第一次启动的时候较慢,同时增加cpu也不能够改善性能。方案二需要额外做不少工作(如需要生成压缩文件,代码中加入解压的逻辑)。我们初步决定使用方案二。