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]

마지막 두 라운드에서는 페이지를 실제로 터치하기 전, 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 ]
                                             ^      ^^^^

관련 정보