介紹
pg資料庫在不同的業務場景下,參數最好也需要進行針對的調整。預設值是在確定資源消耗最小的情況下,pg都能夠運作起來,不會導緻任何緻命性的威脅。而實際中,預設的參數需要進行優化來達到性能的最大化,本文介紹一些常用的參數配置。
參數
pg資料庫預設安裝完後在data目錄會有一個postgresql.conf檔案,這個裡面有非常多的參數來配置資料庫。
shared_buffers
PostgreSQL既使用自身的緩沖區,也使用核心緩沖IO。這意味着資料會在記憶體中存儲兩次,首先是存入PostgreSQL緩沖區,然後是核心緩沖區。這被稱為雙重緩沖區處理。對大多數作業系統來說,這個參數是最有效的用于調優的參數。此參數的作用是設定PostgreSQL中用于緩存的專用記憶體量。
shared_buffers的預設值設定得非常低,因為某些機器和作業系統不支援使用更高的值。但在大多數現代裝置中,通常需要增大此參數的值才能獲得最佳性能。
建議的設定值為機器總記憶體大小的25%,但是也可以根據實際情況嘗試設定更低和更高的值。實際值取決于機器的具體配置和工作的資料量大小。舉個例子,如果工作資料集可以很容易地放入記憶體中,那麼可以增加shared_buffers的值來包含整個資料庫,以便整個工作資料集可以保留在緩存中。
在生産環境中,将shared_buffers設定為較大的值通常可以提供非常好的性能,但應當時刻注意找到平衡點。
檢視目前shared_buffers的值:
postgres=# show shared_buffers;
shared_buffers
----------------
128MB
wal_buffers
PostgreSQL将其WAL(預寫日志)記錄寫入緩沖區,然後将這些緩沖區重新整理到磁盤。由wal_buffers定義的緩沖區的預設大小為16MB,但如果有大量并發連接配接的話,則設定為一個較高的值可以提供更好的性能。
檢視目前wal_buffers的值:
postgres=# show wal_buffers;
wal_buffers
-------------
4MB
(1 行記錄)
effective_cache_size
effective_cache_size提供可用于磁盤高速緩存的記憶體量的估計值。它隻是一個建議值,而不是确切配置設定的記憶體或緩存大小。它不會實際配置設定記憶體,而是會告知優化器核心中可用的緩存量。在一個索引的代價估計中,更高的數值會使得索引掃描更可能被使用,更低的數值會使得順序掃描更可能被使用。在設定這個參數時,還應該考慮PostgreSQL的共享緩沖區以及将被用于PostgreSQL資料檔案的核心磁盤緩沖區。預設值是4GB。
檢視目前effective_cache_size的值:
postgres=# show effective_cache_size;
effective_cache_size
----------------------
4GB
(1 行記錄)
work_mem
此配置用于複合排序。記憶體中的排序比溢出到磁盤的排序快得多,設定非常高的值可能會導緻部署環境出現記憶體瓶頸,因為此參數是按使用者排序操作。如果有多個使用者嘗試執行排序操作,則系統将為所有使用者配置設定大小為work_mem *總排序操作數的空間。全局設定此參數可能會導緻記憶體使用率過高,是以強烈建議在會話級别修改此參數值。預設值為4MB。
檢視目前work_mem的值:
postgres=# show work_mem;
work_mem
----------
4MB
(1 行記錄)
maintenance_work_mem
maintenance_work_mem是用于維護任務的記憶體設定。預設值為64MB。設定較大的值對于VACUUM,RESTORE,CREATE INDEX,ADD FOREIGN KEY和ALTER TABLE等操作的性能提升效果顯著。
檢視目前maintenance_work_mem的值:
postgres=# show maintenance_work_mem;
maintenance_work_mem
----------------------
64MB
(1 行記錄)
synchronous_commit
此參數的作用為在向用戶端傳回成功狀态之前,強制送出等待WAL被寫入磁盤。這是性能和可靠性之間的權衡。如果應用程式被設計為性能比可靠性更重要,那麼關閉synchronous_commit。這意味着成功狀态與保證寫入磁盤之間會存在時間差。在伺服器崩潰的情況下,即使用戶端在送出時收到成功消息,資料也可能丢失。
檢視目前synchronous_commit的設定值:
postgres=# show synchronous_commit;
synchronous_commit
--------------------
on
(1 行記錄)
checkpoint_timeout和checkpoint_completion_target
PostgreSQL将更改寫入WAL。檢查點程序将資料重新整理到資料檔案中。發生CHECKPOINT時完成此操作。這是一項開銷很大的操作,整個過程涉及大量的磁盤讀/寫操作。使用者可以在需要時随時發出CHECKPOINT指令,或者通過PostgreSQL的參數checkpoint_timeout和checkpoint_completion_target來自動完成。
checkpoint_timeout參數用于設定WAL檢查點之間的時間。将此設定得太低會減少崩潰恢複時間,因為更多資料會寫入磁盤,但由于每個檢查點都會占用系統資源,是以也會損害性能。此參數隻能在postgresql.conf檔案中或在伺服器指令行上設定。
checkpoint_completion_target指定檢查點完成的目标,作為檢查點之間總時間的一部分。預設值是 0.5。 這個參數隻能在postgresql.conf檔案中或在伺服器指令行上設定。高頻率的檢查點可能會影響性能。
檢視目前checkpoint_timeout和checkpoint_completion_target的值:
PostgreSQL将更改寫入WAL。檢查點程序将資料重新整理到資料檔案中。發生CHECKPOINT時完成此操作。這是一項開銷很大的操作,整個過程涉及大量的磁盤讀/寫操作。使用者可以在需要時随時發出CHECKPOINT指令,或者通過PostgreSQL的參數checkpoint_timeout和checkpoint_completion_target來自動完成。
checkpoint_timeout參數用于設定WAL檢查點之間的時間。将此設定得太低會減少崩潰恢複時間,因為更多資料會寫入磁盤,但由于每個檢查點都會占用系統資源,是以也會損害性能。此參數隻能在postgresql.conf檔案中或在伺服器指令行上設定。
checkpoint_completion_target指定檢查點完成的目标,作為檢查點之間總時間的一部分。預設值是 0.5。
這個參數隻能在postgresql.conf檔案中或在伺服器指令行上設定。高頻率的檢查點可能會影響性能。
檢視目前checkpoint_timeout和checkpoint_completion_target的值:
postgres=# show checkpoint_timeout;
checkpoint_timeout
--------------------
5min
(1 行記錄)
postgres=# show checkpoint_completion_target;
checkpoint_completion_target
------------------------------
0.5
(1 行記錄)
wal_keep_segments
該參數主要是控制wal檔案的數量,對于頻繁的更改資料庫的業務場景下,wal日志短時間會非常多,對應的目錄是pg_xlog,有時候,該目錄的大小可能為幾十上百G,很快就将磁盤變滿。是以為了合理控制該目錄的大小,一般會将wal_keep_segments控制在一個合理的範圍内。因為該參數如果過小的話,會影響到資料庫的啟動或者流複制。如果過大的話,就是前面所說的,導緻wal日志非常多,占用的空間會非常大,預設系統是為0,表示資料庫不儲存任何wal日志,但是實際中還是會有少量的産生。
檢視目前的wal_keep_segments值:
postgres=# show wal_keep_segments;
wal_keep_segments
-------------------
0
(1 行記錄)
總結
當然,還要很多其他的參數,本文參考了網上的一些資料進行了整理。pg資料庫目前在中國遠沒有mysql那麼流行,但是作為oracle的最佳替代開源資料庫,pg一直在改進,相信pg相關的資料會越來越多,這也需要大家不斷去嘗試,不斷共享自己使用pg的經驗。