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