本文來自:http://blog.csdn.net/lengzijian/article/details/8252270
這不想過多講解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/