具有 mlocked 共享記憶體的 Solaris 交換分配
我很難理解 Solaris 10 x86 交換分配在
mlock
ed 共享記憶體的情況下是如何工作的。我寫了一個小程序:
- 獲取 1G SHM 段 (
shmget
)- 將其附加到程序 (
shmat
)- 鎖定其中的一部分(
mlock
,第一輪什麼都不鎖定,然後是 512M,然後是整個)- 寫在 SHM 區域的最後一頁,然後是第一頁
- 逐步寫入整個段
- 釋放鎖(如果有)
- 分離和清理。
它在每次操作後列印出
swap -s
以 MB 為單位的值。輸出如下:
- 第 1 輪,否
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
共享段的前512M: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]
- 第三輪,
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]
在最後兩輪中,列在 之後,但在實際觸摸任何頁面之前
free
下降了額外的 512M 或 1G 。mlock
這種“雙重核算”在munlock
通話後就消失了。誰能解釋這種行為?頁面是否
mlocked
保留在真實 RAM 和備份儲存中或類似的東西中?SunOS myhost 5.10 Generic_142910-17 i86pc i386 i86pc
如果您使用DISM,請確保您的交換中有足夠的空間。
當您
shmat
使用 SHM 段SHM_SHARE_MMU
(這不是預設值)時,您將獲得一個ISM段,該段自動鎖定在記憶體中(不可分頁)。該映射在虛擬記憶體中的成本只是分配的 SHM 區域的大小。(由於無法調出,無需預留swap)。mlock
對這些頁面沒有影響,它們已經被鎖定。如果您附加帶有
SHM_PAGEABLE
或不帶有屬性的段,您將獲得一個DISM段。那是可分頁的。初始成本是一樣的*。*但是,如果您mlock
有任何記憶體,則mlock
ed 區域將再次考慮其鎖定的 RAM 使用情況。所以虛擬記憶體成本是(whole mapping + mlocked zone)
。就好像,
SHM_PAGEABLE
映射是“在交換中”創建的,並且您鎖定的區域需要“在 ram”中的額外保留(那些鎖定頁面的備份儲存未釋放或未保留)。所以我看到的是正常的,按設計的。
可以在使用 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
模式中的位:此映射沒有保留。
- DISM:
Address Kbytes RSS Anon Locked Mode Mapped File ... 80000000 1048576 1048576 1048576 1048576 rwxs- [ dism shmid=0xa ] ^ ^^^^