1: Postgresql Shared Buffer Cache
postgresql.conf --> shared_buffers
pg默認配置申請 1000 個 shared buffers, 每個 8k .
postgresql 并不直接修改硬盤上的數據,需要的數據被讀到 shared buffer cache
中,后臺程序修改這些塊,最后刷新到硬盤上。
后臺程序刷新數據到硬盤的操作其實是請求系統內核來完成對硬盤的修改操作,而
內核對于硬盤的操作其實是先到 kernel disk buffer cache 中的。
2: 多大是太大
將所有的內存都給 shared_buffers 將導致沒有內存來運行程序。
unix 管理內存使用 swap, 當沒有內存可用的時候,內核會將長時間不用的內存
挪到 swap 去,這個叫:swap pageout,當你再次使用它的時候內核又會將其挪
回來,這個叫:swap pagein,這個操作有很大的不好,因為它會導致你的程序
掛起直到操作完成。
3: cache size 的影響
4: 正確的 Shared Buffer Cache 大小
(1) 它應該足夠大來應付通常的表訪問操作。
(2) 它應該足夠小來避免 swap pagein 的發生。
5:Sort Memory Batch Size
postgresql.conf --> sort_mem
當對一個大表或記錄集進行排序時,pg將對它們進行部分排序,中間數據結果會
被放在臨時文件中。當所有的行都被排序完了后,這些臨時文件會被合起來進行
再次排序。增加 batch 的大小可以減少臨時文件并且加快排序的速度。如果
sort batch 太大將導致 pagein 。這種情況下,較少的 sort batch 和更多的臨
時文件將會使排序更快。這個主要是對 order by, create index, merge join.
6: Cache Size and Sort Size
cache size 和 sort size 都影響內存的使用。 記住, cache size 是在
postmaster 啟動的時候就申請好的,sort size 的改變是依賴于執行多少個排序。
通常,cache size 比 sort size 更有效果。
一開始調整, 如果你只有一些大的session而有更多的小session:
10% of RAM for cache size
2-4% of RAM for sort size
還有一個很有價值的參數: effective_cache_size。 優化器用這個參數來預估
內核的硬盤 buffer cache. 當內核有 unified buffer cache (統一緩沖), 這個
值將是沒被使用的內存的平均值,因為這種內核會使用所有沒有使用的內存來作
最近硬盤訪問的緩存的;當內核用 fixed-sized disk buffer cache 時,這個參
數應該設成一樣的,通常是內存的 10%.
7: Disk Locality (硬盤分區的物理分布位置)
分布在頭上的數據的讀取很快,連續分布的塊的讀取比不連貫的快。
8:多個硬盤
設計你的數據庫文件如何在硬盤上分布。有點復雜........
9: 硬盤的緩存
關掉的好,要不突然停電就慘了。當然,你的硬盤有備用電源就不用關了。
hdparm -W0, sysctl hw.ata.wc = 0
10:SCSI vs. IDE
當然是 scsi 好了。
11: 文件系統格式
推薦 BSD 的 UFS/FFS, Linux 就比較慘了,雖然有很多中文件系統,但沒有一個
適合的。
12: 多個 CPU
當然好了。但如果只有一個連接,則有點浪費。
13:Ceckpoints
postgresql.conf --> checkpoint_segments = 3
如果發現太頻繁了,加大。
14: 結論
幸運的是,postgresql不需要太多的調整。很多參數都會被優化器自動調整的。
Cache size 和 sort size 是管理員需要調整的以便更好的使用內存。硬盤訪問
可以同交叉分布數據到不同的硬盤上來改善性能,當然,還有scsi 。
_________________
^^^^^^^^^^^^^^^^^^^^^^^^^^
============
== 個人觀點 ==
== 權作廢話 ==
============
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV