参照官方手册和自己在pg上做的实验,记录下pg(FREEBSD)的参数调优过程:
1. postgresql.conf是pg的主要配置文件.
调优主要分几个方面:
优化db,从表结构,sql语句,分表,分区,分库,物理设备,网络设备....进行优化,从量变到质变
表结构方面:
从http://www.pgsqldb.org 看到一个关于散列算法来优化索引的文章.给了我启发.
过程:
1 有一个列的定义很长,比如char(200),又或者是text类型,等等等.那里面肯定要存储
2 很长的字符串,可能是url,可能是地址,可能是.....
3 那么,select 此字段的时候,就要花费很多磁盘io.因为:字段长度大,读取的文件系统的块就多,那么磁盘的读取速度就慢.系统的响应时间就长.效率就慢, filesystem的block大小现在要改的话,没人肯冒着系统崩溃的危险来做这个事情,那么只能从字段的长度上着手.字段的内容又不可以更改,那能不能转换一下呢?一下就想到md5, 在往字段里存入内容之前.(这里是生成一个唯一性索引)做一个散列运算,即用md5函数.
create unique index "index_name" on urls using btree(md5(url));
那么最终存入的内容就是比较短小的md5值.索引的大小减少2/3.
(省了很多内存啊!)
postgresql 里头 md5()函数的定义,它返回的是 text 类型,是用hex转码后的文本流,其宽度是 32 bytes,也是很大. 要是转换为2进制的格式,其大小还会小很多那以后读取的时候,加一个md5和decode再转换回来就ok.
这种做法,典型的以cpu换io.可以一试!
内存:
在sysctl.conf中增加:(2G内存)
kern.ipc.shmall=1*1024*1024*1024/4096
//内存是分页的,以页为单位;每页大小为4K
//取物理内存的一半大小 再 除以4K
//共享内存总大小...单位:页 注:4K每页
kern.ipc.shmmax=1*1024*1024*1024//共享内存能使用的最大量...单位:bytes
//和上个选项大小一样,只是单位不同
kern.ipc.semmap=4096
//定义共享内存段大小...单位:bytes
内核:
把共享内存装载到 RAM 里,避免他们被交换到交换分区中:
sysctl 设置 kern.ipc.shm_use_phys=1
原文:
http://blog.chinaunix.net/u2/74570/showart_1849692.html