PostgreSQL Hardware Performance Tuning
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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 。