mlock
ed共有メモリがある場合、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
使用する場合ディスマン、スワップスペースに十分なスペースがあることを確認してください。
時shmat
SHMセグメントSHM_SHARE_MMU
(デフォルトではない)を使用する場合教義セグメントは自動的にメモリにロックされます(ページングできません)。仮想メモリでは、このマッピングコストは割り当てられたSHM領域のサイズです。 (スワップは回収できないため、保存する必要はありません。)mlock
このページには何の影響もなく、すでにロックされています。
セグメントを追加するSHM_PAGEABLE
とディスマン部分。それはページング可能です。これ初期のコストは同じです。ただしmlock
、メモリを使用している場合、mlock
ed領域はロックされた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 ]
^ ^^^^