利用系統快取提高PostgreSQL操作效率

發表於2016-11-03

環境介紹:

OS:Centos 6.4 64bit
Database:PostgreSQL9.4
Memory:2G
CPU:1核

下載安裝:

pgfoundry下載pgfincore-v1.1.1.tar.gz,,將原始碼解壓到資料庫原始碼下的contrib下。不要在其github上下載,目前應該有一些bug,最新版本為1.1.1,1.1.2在我試用的時候發現大部分函式無法使用。

其次在我編譯時一直出現如下錯誤:

所以在此我修改了一下Makefile檔案,內容如下:

現在進行make,即可:

實驗記錄:

1、安裝:

2、準備工作:記錄比較使用pgfincore前後的效能差,使用外掛pg_stat_statments記錄每條sql的使用時間。
其次將shared_buffer改為16mb,減少其對pgfincore的影響。

3、建立表testmem,分別在使用和不適用pgfincore情況下進行select, update, delete的操作,並對比執行時間,在這裡為了更好的去作比較,建立三張表testmem1,testmem2,testmem3,分別進行三種操作進行對比。並插入相同的資料。

三種操作效能對比:

使用pgfincore前:通過查詢表pg_stat_statments檢視三種操作時間:

使用pgfincore後:通過查詢表pg_stat_statments檢視三種操作時間(重啟機器後,重新建庫,重新建表、插資料):

明顯看出當執行select時速度提升明顯,其他的時間提升並不明顯,這是因為資料還需要進行IO操作,所以在這裡速度提升應該僅僅是讀入的時間節省掉了。

上面這個實驗驗證了willneed會將小部分新加入的資料載入到cache中,能夠快速的定位查詢,但是當插入資料量較大時,就不會及時的寫入到cache中了。

總結:pgfincore目前適用於資料量非常大、更新不頻繁、更新量較小的表去載入到快取中,有助於提高應用效率。

外掛函式介紹:

這裡會對函式進行介紹,並對所有函式進行操作實驗。

1、pgsysconf:
這個函式輸出OS block的大小(os_page_size),OS中剩餘的page數(os_pages_free)和OS擁有的page總數(os_total_pages)。

2、pgsysconf_pretty:
這個函式和上面的一樣,僅僅是輸出更易懂些。

3、pgfadvise_willneed:

這個函式是
輸出檔名(relpath),OS block大小(os_page_size),物件佔用系統page數(rel_os_pages),OS剩餘的page數(os_pages_free)。

4、pgfadvise_dontneed:

這個函式對當前物件設定dontneed標記。dontneed標記的意思就是當作業系統需要釋放記憶體時優先釋放標記為dontneed的pages。輸出的意義和上面一致,就不多做介紹了。

5、pgfadvise_NORMAL、pgfadvise_SEQUENTIAL、pgfadvise_RANDOM:

和pgfadvise_dontneed大同小異,分別將物件標記為normal、sequential、random,意思按照字面意思理解就可以了。

其實pgfadvise是一個單獨的函式,引數是relname,fork,action,含義分別為物件名、檔案分支名以及行為id,上面的3、4、5函式都是輸入不同引數而設定的函式,其中willneed、dontneed、normal、sequential、random的值分別是10、20、30、40、50,且預設fork為main,即表檔案。

這裡的pgfadvise主要呼叫了Linux下的函式posix_fadvise,標記值也是posix_fadvise所需要的。

6、pgfincore:

這個函式是是提供物件在作業系統快取中的資訊的。

它分為三個函式,引數分別為(relname, fork, getdatabit),(relname, getdatabit),(relname),三個引數意思為物件名,程式名(這個地方預設是main),是否要顯示databit(很長,注意顯示),第一個函式需要全部輸入,第二個函式預設fork為main,第三個函式預設fork為main,getdatabit為false。

它輸出的是檔案位置及名稱(relpath),檔案順序(segment),OS page或block大小(os_page_size),物件佔用系統快取需要的頁面個數(rel_os_pages),物件已經佔用快取頁面個數(pages_mem),在快取中連續的頁面組的個數(group_mem),OS剩餘的page數(os_pages_free),載入資訊的點陣圖(databit)。

7、pgfadvise_loader:

這個函式可以對頁面快取直接進行兩方面的作用。因此,它能通過頁面的點陣圖在快取中來對頁面進行載入或解除安裝。

它分為兩個函式和上邊的類似,就是設定預設值,的輸入引數是(relname, fork, segment, load, unload, databit)和(relname, segment, load, unload, databit),分別是物件名,檔案分支名,檔案序號,是否載入,是否解除安裝,點陣圖資訊。第二個函式預設fork為main。

它輸出的是物理檔名及path(relpath),OS page或block大小(os_page_size), OS中剩餘的page數(os_pages_free),載入的page數(pages_load),解除安裝的page數(pages_unload)。

相關文章