Movatterモバイル変換
[0]ホーム
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 shmallkernel.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」なので特別大規模な環境でなければデフォルトで問題なし。以上
[8]ページ先頭