インフラエンジニアXの備忘

とある企業のシステム部門のインフラエンジニアです。忘れっぽい自分のメモ書きとしてこのブログを使用します。

OpenVZ コンテナでのpostgresqlのshared_buffer設定ではまる。。

Proxmox配下で動かしているOpenVZコンテナに検証環境用DBがあってpostgresを動かしているのですが
そのshared_bufferの設定でちょいはまりしたのでメモ。


とりあえず、shared_bufferについてはデフォルトの設定で動作させていて

shared_buffers = 32MB


と設定していた。
今回、postgresの共有メモリを増加した
場合の検証をしたくて、この値を256MBにした。


実際はもっと詳細に数値を検討し、設定する必要があるが、今回は取り急ぎの確認をしたかったので
この値に特に意味はなし。


きちんとした計算方式は以下の参考ページにすごく細かく記載されている。
あとで見ないと…。
Stray Penguin - Linux Memo (PostgreSQL-5)
PostgreSQLのチューニング事例 - Qiita


実際にshared_bufferを変更する際に、kernelに割当てられている共有メモリの上限を超えると
postgresql起動時にエラーが発生して起動できないため

# cat /proc/sys/kernel/shmmax
33554432


ここで確認できる32MBの上限を増やします。

# cp -p /etc/sysctl.conf /etc/sysctl.conf.back バックアップファイルを取得
# echo "kernel.shmmax = 335544320" >> /etc/sysctl.conf sysctl.confにshmmaxを320MBにするように設定を追加。
# sysctl -p 設定を反映する。
# cat /proc/sys/kernel/shmmax
335544320


では、kernelの共有メモリの上限も変更したのでpostgresqlを再起動しますかと
再起動したところ…。

2015-04-16 17:13:03 JST DB: PID:20878 FATAL:  could not create shared memory segment: Cannot allocate memory
2015-04-16 17:13:03 JST DB: PID:20878 DETAIL:  Failed system call was shmget(key=5432001, size=289128448, 03600).
2015-04-16 17:13:03 JST DB: PID:20878 HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space, or exceeded your kernel's SHMALL parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMALL.  To reduce the request size (currently 289128448 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
        The PostgreSQL documentation contains more information about shared memory configuration


いやいや、shmmaxもshmallも256MB以上を設定しておりますゾ。
なんでやー。。


といろいろ確認してみたところ、vzの設定ファイルにXXXX.confに共有ページ設定があるんですが
そちらが上限84MBになっていたというオチでした…。


Postgresql and shared memory - OpenVZ Linux Containers Wiki


SHMPAGES・・・特定のコンテナプロセスに割り当てられる共用メモリの合計

# UBC parameters (in form of barrier:limit)
KMEMSIZE="1951399936:2147483648"
LOCKEDPAGES="524288"
PRIVVMPAGES="unlimited"
SHMPAGES="21504:21504" 21504 * 4 / 1024 でメモリのMBとなる。
   |
   |
   |


で、ProxmoxのUBCのタブで確認しても84MBとなっていることを確認できたので
ではそちらを修正。

# vzctl set CTID --shmpages 81920 --save
UB limits were set successfully
CT configuration saved to /etc/pve/openvz/CTID.conf


Proxmoxの画面上で確認しても320MBの共有メモリが割当られていることを確認。
で再起動してみたら問題なしでしたー。
これでpostgresqlの共有メモリを256MBにした場合の検証ができるー。


ああ、でも反対に、confの設定をこのままにして
kernel.shmmaxの値を32MBに戻したらどうなるんだろう。
あとでやってみよう。


OpenVZ徹底入門 バーチャルデータセンター構築完全ガイド (DVD付)

OpenVZ徹底入門 バーチャルデータセンター構築完全ガイド (DVD付)