mlocked 共有メモリを使用した Solaris スワップの割り当て

mlocked 共有メモリを使用した Solaris スワップの割り当て

mlocked共有メモリがある場合、Solaris 10 x86スワップ割り当てがどのように機能するかを理解するのが困難です。

私は小さなプログラムを書いた。

  • 1G SHMセグメントのインポート(shmget
  • shmatプロセス( )に添付
  • 一部をロックします(mlock最初のラウンドでは何もロックせず、その後は512M、次は全体)。
  • SHM領域の最後のページを書き、最初のページを書きます。
  • 徐々にセグメント全体を作成します。
  • ロック解除(ある場合)
  • 分解して掃除してください。

swap -s各ジョブの後、値をMB単位で印刷します。

出力は次のとおりです。

  • Round 1、No mlock:(右の値は最初の読み値に基づいています)
pid:    2221    mlock size:     0
header:      alloc  resvd   used   free [+/-  alloc  resvd   used   free]
  init:        325    130    456   2873 [+/-      0      0      0      0]
shmget:        326   1154   1480   1849 [+/-      1   1024   1024  -1024]
 shmat:        326   1154   1480   1849 [+/-      1   1024   1024  -1024]
touchE:        326   1154   1480   1849 [+/-      1   1024   1024  -1024]
touchS:        326   1154   1480   1849 [+/-      1   1024   1024  -1024]
  set1:        582    898   1480   1848 [+/-    257    768   1024  -1025]
  set2:        838    642   1480   1848 [+/-    513    512   1024  -1025]
  set3:       1093    386   1480   1847 [+/-    768    256   1024  -1026]
  set4:       1350    130   1480   1847 [+/-   1025      0   1024  -1026]
   set:       1350    130   1480   1847 [+/-   1025      0   1024  -1026]
 shmdt:       1350    130   1480   1847 [+/-   1025      0   1024  -1026]
shmctl:        326    130    456   2871 [+/-      1      0      0     -2]

ここではすべてが大丈夫です。free柱は始まった時よりも最大約1G小さい。

  • 2ラウンド、mlock最初の5億1200万の共有セグメント:
 pid:    2221    mlock size:     536870912
 header:      alloc  resvd   used   free [+/-  alloc  resvd   used   free]
   init:        326    130    456   2871 [+/-      0      0      0      0]
 shmget:        326   1154   1480   1847 [+/-      0   1024   1024  -1024]
  shmat:        326   1154   1480   1847 [+/-      0   1024   1024  -1024]
  mlock:        838    642   1480   1334 [+/-    512    512   1024  -1537] <<<<
 touchE:        838    642   1480   1334 [+/-    512    512   1024  -1537]
 touchS:        838    642   1480   1334 [+/-    512    512   1024  -1537]
   set1:        838    642   1480   1334 [+/-    512    512   1024  -1537]
   set2:        838    642   1480   1334 [+/-    512    512   1024  -1537]
   set3:       1094    386   1480   1334 [+/-    768    256   1024  -1537]
   set4:       1350    130   1480   1334 [+/-   1024      0   1024  -1537]
    set:       1350    130   1480   1334 [+/-   1024      0   1024  -1537] <<<<
munlock:       1350    130   1480   1846 [+/-   1024      0   1024  -1025]
  shmdt:       1350    130   1480   1847 [+/-   1024      0   1024  -1024]
 shmctl:        326    130    456   2871 [+/-      0      0      0      0]
  • 3ラウンド、mlock全セクション:
 pid:    2221    mlock size:     1073741824
 header:      alloc  resvd   used   free [+/-  alloc  resvd   used   free]
   init:        326    130    456   2871 [+/-      0      0      0      0]
 shmget:        326   1154   1480   1847 [+/-      0   1024   1024  -1024]
  shmat:        326   1154   1480   1847 [+/-      0   1024   1024  -1024]
  mlock:       1350    130   1480    822 [+/-   1024      0   1024  -2049] <<<<
 touchE:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
 touchS:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
   set1:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
   set2:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
   set3:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
   set4:       1350    130   1480    822 [+/-   1024      0   1024  -2049]
    set:       1350    130   1480    822 [+/-   1024      0   1024  -2049] <<<<
munlock:       1350    130   1480   1846 [+/-   1024      0   1024  -1025]
  shmdt:       1350    130   1480   1847 [+/-   1024      0   1024  -1024]
 shmctl:        326    130    456   2871 [+/-      0      0      0      0]

最後の2ラウンドでは、ページを実際にタッチする前に、free列から512Mまたは1Gが追加で削除されます。mlockこの「二重会計」はmunlock通話後に消えた。

誰でもこの動作を説明できますか?ページはmlocked物理 RAM とバックアップ リポジトリに似ていますか?

SunOS myhost 5.10 Generic_142910-17 i86pc i386 i86pc

答え1

使用する場合ディスマン、スワップスペースに十分なスペースがあることを確認してください。

shmatSHMセグメントSHM_SHARE_MMU(デフォルトではない)を使用する場合教義セグメントは自動的にメモリにロックされます(ページングできません)。仮想メモリでは、このマッピングコストは割り当てられたSHM領域のサイズです。 (スワップは回収できないため、保存する必要はありません。)mlockこのページには何の影響もなく、すでにロックされています。

セグメントを追加するSHM_PAGEABLEディスマン部分。それはページング可能です。これ初期のコストは同じです。ただしmlock、メモリを使用している場合、mlocked領域はロックされたRAM使用量を再検討します。したがって、仮想メモリのコストは(whole mapping + mlocked zone)

SHM_PAGEABLEこれは、使用時にマッピングが「スワップで」作成され、ロックされた領域に「メモリ内」追加の予約が必要な場合と同じです(ロックされたページのバックアップストアは解放または予約解除されません)。

だから私が見るのは正常で意図的に設計されています。

これに関するいくつかの情報は以下にあります。DISMを使用したOracle SolarisでのOracleデータベースの動的SGAチューニング(280k PDF).抜粋:

DISMメモリは自動的にロックされないためセグメント全体にスワップ領域を割り当てる必要があります。。 [… ]。ただし、システム管理者がDISMにスワップスペースを提供する必要性を認識していない場合、これは問題になる可能性があります。

(私は情報のないシステム管理者の一人でした...)


ヒント:お持ちpmap -xaのセグメントの種類を確認するために使用してください。

  • 教義:
 Address  Kbytes     RSS    Anon  Locked Mode   Mapped File
...
80000000 1048576 1048576 1048576 1048576 rwxsR    [ ism shmid=0x16 ]
                                             ^      ^^^

Rモードビットに関する注意:このマッピングは維持されません。

  • ディスマン:
 Address  Kbytes     RSS    Anon  Locked Mode   Mapped File
...
80000000 1048576 1048576 1048576 1048576 rwxs-    [ dism shmid=0xa ]
                                             ^      ^^^^

関連情報