2017年1月11日水曜日

Postgresチューニングパラメータ(主なもの)

Postgresのチューニングパラメータの備忘録。(9.3ベースの設定ファイル)
postgres.confで設定される。
多くのPostgresのチューニングパラメータは、一昔前のPCを意識したような設定値であり、
最近のPCスペックにあった設定をしておいたほうがいい。


■メモリ関連
☆shared_buffers = 2048MB            # min 128kB
                    # (change requires restart)
    表領域をキャッシュする領域。
    たとえば、SELECTを実行するときに、この領域にデータがあれば
    ディスクアクセスせずここのデータを読み書きする。
    ディスクアクセス回数を減らすことができれば、処理が速くなる。
   
    OSキャッシュとの兼ね合いもあるので、あまり大きくすることは推奨されない。
    実メモリの25%がいいといわれている。
   
    また、指定方法は古いバージョンではバッファ指定だったが、
    最近のバージョンでは、バッファ指定できないようだ。
    GB、MB、kBの単位で設定するようにする。


☆work_mem = 1MB                # min 64kB
 Postgresが処理に使うワーキングメモリ。
 (実メモリ-shared_buffers)/max_connectionsを超えるとスワップするので注意。
 

☆maintenance_work_mem = 16MB        # min 1MB
 バキュームなどのメンテナンス処理に使われるワーキングメモリ。
 少なすぎると、バキュームされないことがあるという人もいるが詳細不明。



■コネクション関連
☆max_connections = 300
 work_memとの関係に注意。
 work_memは接続ごとに発生するので、work_mem*max_connectionsのメモリを確保しておかないと、スワップ発生の危険性がある。
 (実メモリ-shared_buffers)/max_connectionsを超えるとだめ。

☆tcp_keepalives_idle = 60        # TCP_KEEPIDLE, in seconds;
                    # 0 selects the system default
 コネクションを完全に接続するまでの待ち時間。
 デフォルトが大きいので、確実な値を設定しておくのがベター。
                   
tcp_keepalives_interval = 5        # TCP_KEEPINTVL, in seconds;
                    # 0 selects the system default


■BackGround Writer
 BackGround Writerは、CheckPointが発生するまでに、
 ディスク書き込みを少しでもしておくことで負荷の分散を計るもの。
 負荷の分散が目的であり、処理量を減らすものではない。
 
 アプリケーションで画面を表示するなどの場合、極端に遅いタイミングがあっては困るが
 チェックポイントの書き込み量が多いときには、処理が極端に遅くなる可能性がある。
 そういった場合に、BackGroundWriterによって、チェックポイントの書き込みが減るように
 少しずつ書き込みをおこない、チェックポイント処理を軽減して、極端な処理落ちを防ぐことができる。(処理を分散するだけで、処理量を減らすものではない。)
 
 逆に、大量データ処理の場合などは、負荷の分散よりも最終処理時間が大事なので、
 チェックポイントに任せておいても問題ないと思われる。
 (1回にたくさん書き込みしたほうがディスクアクセスを減らせるため)
 その場合、チェックポイントとバキュームの発生タイミングなどのチューニングがむしろ重要だと考えられる。
 
 
☆bgwriter_delay = 5000ms            # 10-10000ms between rounds
 BackGroundWriterの実行間隔。

☆bgwriter_lru_maxpages = 1000        # 0-1000 max buffers written/round
 BackGroundWriterが書込むサイズの最大値。
 1バッファは8KB。
 0にすると、BackGroundWriterを発生させない。

☆bgwriter_lru_multiplier = 10.0        # 0-10.0 multipler on buffers scanned/round
 最近の周期で書き込んだ平均とこの値が掛け合わされて、BackGroundWriterが書込むサイズの最大値とする。なお、ここで算出した最大値とbgwriter_lru_maxpagesの小さいほうが採用される。


■WAL
☆wal_buffers = 64MB            # min 32kB, -1 sets based on shared_buffers
                    # (change requires restart)
    WAL=いわゆるトランザクションログをバッファリングしておく領域。
    基本的には、コミットのときに、WALログファイルに書き込まれる。
    その他、WALバッファがあふれたとき、Checkpoint、Vacuum実行時、WALライター実行時などにWALログファイルに書き込まれる。

 多くの更新を実行するトランザクションがある場合は、WAL_Buffersは大きい目に設定しておいたほうが
 ディスク書き込みを減らすことができる。

 デフォルトの-1で、SharedBufferの1/32を割り当てる。
 ただし、64KBから16MBの範囲内であり、それより大きい値を設定する場合は変えたほうがいい。
 8.1まではバッファ指定だが、それ以降は、サイズ指定する。


☆wal_writer_delay = 200ms        # 1-10000 milliseconds
 WAL Writerの実行周期。