这不想过多讲解pgfincore的安装和使用,只想记录下使用心得,如果读者向读到更多内容,请查看一下内容:
use posix_fadvise pre-cache frequency data
http://blog.163.com/digoal@126/blog/static/163877040201062944945126/
a powerful upgrade from pgfincore 1.0
http://blog.163.com/digoal@126/blog/static/1638770402011630102117658/
实际使用
http://blog.163.com/digoal@126/blog/static/163877040201221382150858/
就像德哥说的一样,当数据库启动时,数据库是冷数据,开始的每一次查询都要到磁盘去读取,然后写入数据库缓存。如果当数据库启动时,就有大量的数据库访问,可能造成数据库堵死。
这时,我们就需要一种工具能够直接把磁盘内容刷到内存,而内存又不占用pg的buffer,pgfincore刚好做到这这一点,它不依赖于pg配置文件中对buffer的限制,因为它使用的内存是OS内存。
看了很多人的文章,据说是使用该工具,使整个系统的性能提高了几十倍,包括在德哥的blog中写道,查询速度从12.96毫秒降到0.45毫秒。
看到这里可能会心花怒放,恨不得赶快把这工具应用于自己的系统当中,我也是这样;
在我的系统中遇见一个问题,语句的查询速度优化后也停留在50ms左右(需求问题),本以为问题能够得到解决,但是后来才发现,我误解了其中的很多道理。
至今一直不理解这样的问题,把所有数据写到内存中,有没有类似的索引查询,还是在内存中顺序查找?
在我的系统中,我把表和索引都通过pgfadvise_willneed函数,添加到内存当中,但是执行效率没有任何提升。
也许是我哪里用错的缘故,后来想了想,可能我的语句中大部分是>=和 <=这类操作导致的。
于是我自己建了一张表,只有一个id和一个日期,其中有100万数据;
当不建索引时,首次查询时间为460ms,当用pgfincore时,首次查询耗时182ms。
当建立索引,首次查询11ms,当用pgfincore时,同样11ms。
这里先留空,等有空测试多进程
首先用pgbench压了下数据库
使用和不适用pgfincore时,查询速度都是11ms左右。
后来想了想原因,可能是数据库本身缓存的信息,所以用重启数据库的方式继续测了一遍:
不用pgfincore时,查询速度是38ms;
使用pgfincore时,查询速度是11ms;
这进一步印证的我的猜想。
可以说明一点,pgfincore并不是所有情况下都会提高数据库读性能,目前,我所理解的是:当数据库重启时,或者数据库内存中还没有大量缓存数据时,用pgfincore可以提高几倍的性能。希望不要盲目使用。
还有一点pgfincore写入内存并非永久写入,如果读写频率较大,os内存也是会被替换掉的。(所以某些场景反而不适合用pgfincore)
如果想要永久写入内存请参考德哥文章:把文件永久cache到内存的工具filecache
http://blog.163.com/digoal@126/blog/static/16387704020122198214650/