Solaris

具有 mlocked 共享記憶體的 Solaris 交換分配

  • October 25, 2012

我很難理解 Solaris 10 x86 交換分配在mlocked 共享記憶體的情況下是如何工作的。

我寫了一個小程序:

  • 獲取 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有任何記憶體,則mlocked 區域將再次考慮其鎖定的 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 ]
                                            ^      ^^^^

引用自:https://unix.stackexchange.com/questions/18734