PostgreSQLのパフォーマンスを向上する

以前行った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百万個を越える鍵を最初に一気にロードする必要がある。
  • データベース中のインデックスを削除しておいてロードする。 全部がロードし終えたらインデックスを設定する。
  • 最後にVACCUM ANALYZEをかける
最初からイニシャライズしている場合はVACCUM ANALYZEで高速化されるか どうかはわからない。しかし、やるのがお約束である。


キーワード: PostgreSQL パフォーマンス 速度 向上

目次へ

すずきひろのぶ hironobu at h2np dot net 更新日: