以前行ったPostgreSQLのパフォーマンスを改善するための内容を忘れないように書いておく。
| 大量にメモリを搭載しろ 2.6系カーネルにしろ |
とにかく限界まで大量にメモリを搭載させること。 それとLinuxのカーネルを2.6系にアップデートすること。大量のメモリ があれば、Linuxカーネルのブロックデバイスのバッファ処理部分にモロに効く。 カーネルは2.6系では、ブロックデバイスのバッファ処理やメモリ、あるいは スレッドの効率が良くなっているので、カーネルを2.6系にした方が良い。 |
| 自分でコンパイルしろ | たとえばDebian packageをそのままもってくるとi486用のコードで 実行されることになる。自分の使っているマシン上でコンパイルすると CPU別に最適化してくれるので、数%から10数%程度の高速化が期待 できる。 |
| HDDのDMAは使えているか? |
IDEのハードディスクを接続していてDMAが使えない状態だと極端に遅くなるの
は当然である。が、しかし、たまに「LinuxのHDDアクセスは遅い」と騒いでい
るのを見かけるので、一応、書いておく。
$ sudo hdparm -mcd /dev/hda /dev/hda: multcount = 16 (on) I/O support = 1 (32-bit) using_dma = 1 (on)using_dmaがonになっていれば良い。なっていなければ $ sudo hdparm -d 1 -c 1 -m 16 /dev/hda /dev/hda: setting 32-bit I/O support flag to 1 setting multcount to 16 setting using_dma to 1 (on) multcount = 16 (on) I/O support = 1 (32-bit) using_dma = 1 (on) |
| たくさん接続できるようにする |
たくさん接続できるようにpostgresql.confの中にあるmax_conenctionsの値を変更する。
-- default -- #max_connections = 64 -- example -- max_connections = 256一つのマシンでPostgreSQLを動かすような場合は、たくさんの接続がある = たくさんプロセスが走り始める、ということになってしまう。その点は注意し た方が良い。それからコネクションの最大値は普通は1プロセスの最大 ファイルオープン数(1024)以下だ。 |
| カーネルのパラメータによるパフォーマンス改善 |
Shared Memoryのサイズを大きくする。Linuxのデフォルト値が32MByteなので、それを大きくする。Linuxのページサイズの倍数(4096か8192)で割り切れる数にすると良い。
たとえば64MB分を取るなら1024 * 1024 * 64と計算する。
# echo 67108864 > /proc/sys/kernel/shmall # echo 67108864 > /proc/sys/kernel/shmmaxマシンがPostgreSQL専用であれば、シェアードメモリに供給するためのメモリ サイズを大量に取れる。だがしかしサイズをどうすべきかは使い方により変わ るので、一意には決められない。そこを、どんぶり勘定でメモリの1/4を割り 当てるとしたら次のようになる。
% cat /proc/meminfo | awk '/Mem: / { printf "%d\n", $2/4 }'
値が出る
# echo 値 > /proc/sys/kernel/shmall
# echo 値 > /proc/sys/kernel/shmmax
|
| 高速なDB初期化 |
たとえば他のサイトに同じ内容のデータベースを構築しようとした場合、
最初に大量の初期化データをロードする場合がある。
業務システムではあまりないかも知れないが、たとえば新しい公開鍵サーバを構築
しようとすると、2百万個を越える鍵を最初に一気にロードする必要がある。
|
キーワード: PostgreSQL パフォーマンス 速度 向上
目次へ
すずきひろのぶ hironobu at h2np dot net 更新日: