自分用メモ。なので詳細すっとばし&詳しい説明は抜きで。
postgres のパフォーマンスチューニング in FreeBSD。
postgres は共有メモリを使うので、postgres.conf で max connectionとshared_buffersをどかっと増やすと起動しなくなります。
そのため、OSのkernelで利用できる値を設定してあげる必要があります。
# ipcs -M
shminfo:
shmmax: 167772160 (max shared memory segment size)
shmmin: 1 (min shared memory segment size)
shmmni: 192 (max number of shared memory identifiers)
shmseg: 1024 (max shared memory segments per process)
shmall: 40960 (max amount of shared memory in pages)
とあるサーバの例。
現状、shmmax: 167772160 とあるので、 16772160/1024/1024 = 160MBになっています。
メモリを2GBつんだサーバなので、768MB程度に増やせたら楽ですね。
と、いうわけでkernel compileします。
念のため、ファイル名を変更してコンパイルします。
# cd /usr/src/sys/i386/conf
# cp GENERIC CUSTOM
# vi CUSTOM
options SHMMAXPGS=196608 <- 追加
options SHMSEG=1024 <- 追加
# cd /usr/src
# make clean
# make buildworld
# make buildkernel kernconf=CUSTOM
# make installkernel kernconf=CUSTOM
# make installworld
# shutdown -r now
196560の値ですが、こんな計算式で求めました。
SHMMAX=(SMMAXPGS*PAGE_SIZE+1)
PAGE_SIZEは4096、SHMMAXは最終的に768MBにしたいので以下のように計算。
SHMMAX=768*1024*1024
SHMMAX=805306368
805306368=(SMMAXPGS*4096+1)
805306367=SMMAXPGS*4096
805306367/4096=SMMAXPGS
196608=SMMAXPGS
です。
kernelがコンパイル・インストールされて再起動したら、 ipcs -M でサイズを確認。
後は、postgres.conf でバッファとコネクション増やしてベンチ取りましょう。
他にもsocket数やその辺りのチューンは基本って事で割愛。