PostgreSQL內存配置記錄


PostgreSQL內存配置,參考了其他人的總結,再加上自己的一些體會,做個記錄。

 

postgresql的內存分配主要由shared_buffers、temp_buffers、work_mem、maintenance_work_mem參數控制。

 

1.shared_buffers

又可以叫做共享緩沖區,postgresql對數據操作時都要先將數據從磁盤讀取到內存中,然后進行更新,最后再將數據寫回磁盤。shared_buffers的功能就是用於存放從磁盤讀取的數據。根據文檔參數的設置范圍一般在25%~40%之間。windows與linux對內存的管理方式不同,在linux中需要注意共享段大小的設置(kernel.shmmax)。

 

在系統(OS)中,記得設置 kernel.shmmax的值(/etc/sysctl.conf)

kernel.shmmax決定了進程可調用的最大共享內存數量。簡單的計 算方法是

kernel.shmmax=postgres shared_buffers + 32 MB

 

2.temp_buffers

稱之為臨時緩沖區,用於數據庫會話訪問臨時表數據,系統默認值為8M。可以在單獨的session中對該參數進行設置,尤其是需要訪問比較大的臨時表時,將會有顯著的性能提升。

 

 

3.work_mem

可以稱之為工作內存或者操作內存2~4M。其負責內部的sorthash操作,合適的work_mem大小能夠保證這些操作在內存中進行。定義太小的話,sort或者hash操作將需要與硬盤進行swap,這樣會極大的降低系統的性能;太大的話致使在能夠在內存中完成的操作數量減少,其他的部分需要與磁盤進行swap操作,增加IO降低性能。系統提供的默認值是1M,在實際的生產環境中,要對系統監控數據進行分析,作出最好的選擇。

 

大致有兩種方式:估計方法與計算方法。

第一種是可以根據業務量的大小和類型,一般語句運行時間,來粗略的估計一下。

第二種方式是通過對數據庫的監控,數據采集,然后計算其大小。總之合適的大小對系統的性能至關重要。

在實際的維護中可以通過explain analyze分析語句的work_mem大小是否合適。在語句中設置work_mem參數的大小可以充分利用內存,提高語句的執行效率。

 

對於work_mem內存分配時還要考慮數據庫的並發情況,max_connections決定了系統的最大的並發連接數。不論如何調整work_mem都要考慮max_connections*work_mem+shared_buffers+temp_buffers+maintenance_work_mem+操作系統所需內存不能夠超過整個的RAM大小,這是非常重要的。

 

work_mem參數對系統的性能是如此的重要,讓其實時的適應數據庫的運行狀況顯的不太可能,但是可以通過對數據庫運行周期的監控,總結相應的數據,然后定制一個專用的腳本,專門用來修改work_mem的大小,使其階段性的更加適應系統的狀況,不失為一種好的方法。

 

4.maintenance_work_mem

稱之為維護工作內存,主要是針對數據庫的維護操作或者語句。盡量的將這些操作在內存中進行。主要針對VACUUM,CREATE INDEX,REINDEX等操作。在對整個數據庫進行VACUUM或者較大的index進行重建時,適當的調整該參數非常必要。

 

通常maintenance_work_mem超過1G時候並沒有 什么實際的效能增加(如果內存夠, 設定在1G足以)

 

5.OLAP系統中,這些配置又不一樣

temp_buffers設置大一點,分析系統中可能用到大的臨時表。

work_mem可以設置更大一點,適應大量的排序和hash。

 

其他的待總結。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM