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。其負責內部的sort和hash操作,合適的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。
其他的待總結。