PostgreSQLスキルアップノート(自己啓発のための個人サイト)
PostgreSQL用カーネル関連の設定(Linux)「共有メモリ/セマフォ」
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ PostgreSQL用カーネル関連の設定(Linux)「共有メモリ/セマフォ」
■■■■
■■■■
■■■■ 2013/01/17
■■■■ 使用環境: (CentOS6.2)
(C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【マニュアル】
カーネル関連の設定→●[マニュアル]
【参考記事】
Let's Postgres PostgreSQLの導入と初期設定→●[記事]
誰でも簡単!PostgreSQLのインストールと初期設定(インストール編)→●[記事]
マニュアルに記載されているカーネルリソース関連と本書対象
・共有メモリ/セマフォ ★←本ページ対象
・リソースの制限
・ Linuxのメモリオーバーコミット
【その他】
・カーネルパラメータ設定ファイル /etc/sysctl.conf
・カーネルパラメータ確認方法
sysctl -a
または
/proc/sys/kernelの各ファイルをcatで参照
■1■ 共有メモリ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【参考】予備知識 共有メモリ関連メモ
|<-------------shmmni セグメントの最大数------------>|
セグメント1 セグメント2 ・・・ セグメントn
┌──────┐┌──────┐ ┌──────┐
│ ││ │ │ │
│ ││ │ │ │
│ ││ │ │ │
└──────┘└──────┘ └──────┘
<---shmmax--->|
単位Byte
|<-------------shmall 最大ページ数 ----------------->|
shmmni ( 4096) セグメントの最大数(上記の場合nの最大)
shmmax (68719476736) 1個のセグメントの最大サイズ(Byte)
shmall ( 4294967296) 最大ページ数(上記共有メモリ全体のページ数)
※カッコ内は今回の環境でデフォルト設定されていた値
マニュアルで重要とされているのはまずshmmax、次にshmall
以上の項目を中心に以下マニュアルと実機のデフォルト確認、値の変更をした。
1.最大セグメントサイズ「shmmax」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
共有メモリの最大セグメントサイズはカーネル関連で最も重要な項目
とされている。
----マニュアル--------------------------------------------
共有メモリに関する一番重要なパラメータは、共有メモリセグメン
トの最大サイズのバイト数SHMMAXです
----------------------------------------------------------
Linux関連の説明として以下の記載あり。
----マニュアル--------------------------------------------
デフォルトの最大セグメントサイズは32メガバイトで、
非常に小規模なPostgreSQLインストレーションのみに適しています。
----------------------------------------------------------
【□】 sysctl -a | grep shmmax
kernel.shmmax = 68719476736 (単位:バイト)
以上、OSデフォルトの設定は64GB。
マニュアルの記述のような32MBという小さな設定ではなかった。
したがって今回使用したOS環境ではデフォルトでも十分大きく、変更は不要だった。
2.セグメントの最大数「shmmni」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 sysctl -a | grep shmmni
kernel.shmmni = 4096 (単位:個)
・・・このまま
3.ページあたりサイズ(の把握)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
値を設定したり変更するような項目ではない。
変更するとしたら、「大規模ページ」(Hugepage)の採用で対応することになる。
ここではその検討はしないで、他のカーネルパラメータの設定のために必要な
1ページあたりのサイズの把握だけがが目的。
----マニュアル---------------------------------------------
"大規模ページ"を持つ通常ではないカーネル設定を除き、
1ページはほとんど常に4096バイトです。
(検証にはgetconf PAGE_SIZEを使用してください。)
-----------------------------------------------------------
マニュアルに記載のあるとおり、getconfコマンドを使用してみる。
【□】 getconf PAGE_SIZE
4096
・・・メモリ1ページは4096バイトであることが確認できた。
【参考】マニュアルにある「大規模ページ」とは?
「Hugepage」のこと。
通常の1ページ4KBの環境ではページエントリが増え効率的でないが
Hugepageを使用すると1ページが2MB(例)などといった単位の大きさになり効率的。
32bitでも64Bitでも実装可。
redhatのホワイトペーパー→●[記事]
この中の3ページに「ヒュージページ」と「トランスペアレントヒュージページ」の記載あり。
OracleのマニュアルやOracleMasterExpertでも、HugememカーネルとHugepage
を組み合わせて32bit環境でも大きなSGAを確保する方法が紹介されている。
一度本番で使おうとした記憶があるが結局使わなかった・・。
こちらはOracleの情報→●[マニュアル]
・・・Hugepage(Transparent Hugepage)は使うべきなのか否か??
ここではその検討はしないで、とにかく今の環境は「4KB/ページ」という把握のみして次項へ進む
Hugepageの検討は別のところで。
4.共有メモリの最大総サイズ「shmall」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
----マニュアル---------------------------------------------
デフォルトの最大総サイズは2097152ページです。
"大規模ページ"を持つ通常ではないカーネル設定を除き、1ページ
はほとんど常に4096バイトです。
(検証にはgetconf PAGE_SIZEを使用してください。)
これによりデフォルトの上限は8ギガバイトになります。
たいていは十分ですが、常に十分というわけではありません。
-----------------------------------------------------------
【□】 sysctl -a | grep shmall
kernel.shmall = 4294967296 (単位:ページ)
この環境は1ページ4096Bなので
以上より4294967296×4096B=16384GB
が上限となる。
十分なサイズとなっているので変更しない。
■2■ セマフォ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【参考】予備知識 セマフォ関連メモ
|<----------------------------semmni--------------------------------->|
セマフォセットの最大数
セマフォセット1 セマフォセット2 セマフォセットn
┌─────────┐┌─────────┐ ┌─────────┐
│ ││ │ │ │
│セマ セマ セマ・・││セマ セマ セマ・・│・・・│セマ セマ セマ・・│
│フォ フォ フォ ││フォ フォ フォ │ │フォ フォ フォ │
│ ││ │ │ │
└─────────┘└─────────┘ └─────────┘
|<-----semmsl------>|
セットごとのセマフォ最大数
|<----------------------------semmns--------------------------------->|
セマフォの最大数
【□】 sysctl -a|grep sem
デフォルト設定値
kernel.sem = 250 32000 32 128
左から順に semmsl semmns semopm semmni
semmsl セットごとのセマフォの最大数
semmns システム全体のセマフォの最大数
semopm ひとつのセマフォ獲得後に可能な操作の最大数
semmni セマフォセットの最大数
1.セットごとのセマフォの最大数 「semmsl」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回環境のデフォルト
semmsl semmns semopm semmni
kernel.sem = 250★ 32000 32 128
マニュアルより 最低条件
最低 17
上記の17個めのセマフォを考慮すると最低設定要件は1セット17
デフォルトで問題なし。
2.システム全体のセマフォの最大数 「semmns」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回環境のデフォルト
semmsl semmns semopm semmni
kernel.sem = 250 32000★ 32 128
マニュアルより 最低条件
ceil((max_connections + autovacuum_max_workers + 4) / 16) * 17 + 他のアプリケーション用の空間
以下はマニュアルより解釈した内容
・単位は「セマフォ数」なので、セット数×16 としたいところだが、
1セットにつき1個余分に(=17番目のセマフォ)をもっている。(マニュアル)
したがって上記のようになる。
これに他のアプリケーション用のものを加味して求める。
3.ひとつのセマフォ獲得後に可能な操作の最大数「semopm」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回環境のデフォルト
semmsl semmns semopm semmni
kernel.sem = 250 32000 32★ 128
マニュアルではSEMOPMは特に触れていない。
デフォルトの32のままとする。
ちなみに、oracleの場合は「32では不足する可能性あり」とされており、
必ず100に変更していた・・・
★semopmはとりええずデフォルトのまま。今後必要そうなら値は変更
4.セマフォセットの最大数「semmni」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
今回環境のデフォルト
semmsl semmns semopm semmni
kernel.sem = 250 32000 32 128★
マニュアルより 最低条件
ceil((max_connections + autovacuum_max_workers + 4) / 16)
以下はマニュアルより解釈した内容
・セマフォは基本的には1接続あたり1個を使用。
・この他にautovacuumのワーカなどを加味すると上記のような式になる。
・値の単位がセマフォの数ではなくセマフォのセット。
PostgreSQLではセマフォ16個を1セットとして扱っているので「16」で割る。
・・今回の環境は「128」なので特別大規模な環境でなければデフォルトで問題なし。
以上