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」なので特別大規模な環境でなければデフォルトで問題なし。







以上 
inserted by FC2 system