내 Oracle Solaris 11.3
메모리(RAM)는 128GB이고 스왑 공간은 80GB입니다.
스왑 공간 사용량을 제한하고 싶습니다(크기가 아니라 사용량만).
Ubuntu
, Fedora
, ... 와 같은 최신 Linux 배포판에는 숫자를 0에서 100까지 편집하고 변경할 수 있는 CentOs
파일이 있다는 것을 알고 있습니다. 0은 사용량이 적다는 것을 의미하고 100은 스왑 공간 사용량이 많다는 것을 의미합니다. /proc/sys/vm/swappiness
그러나 불행하게도 (Solaris 10 및 11.3에서는) /proc
로 명명된 디렉토리가 없습니다 .sys
지금:
어디서 찾 /proc/sys
거나 swappiness
제출해야 합니까? 이 파일이 솔라리스에 없으면 스왑 사용을 어떻게 제한해야 합니까?
추신:
현재 내 메모리 사용량은 약 30%입니다. 하지만 새 프로세스를 시작할 때마다 스왑 공간이 할당되고 프로세스가 올바르게 시작되지 않습니다.
echo "::memstat" | mdb -k
결과는 다음과 같습니다.
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 852964 6.5G 5%
ZFS Metadata 156226 1.1G 1%
ZFS File Data 2675261 20.4G 16%
Anon 4342304 33.1G 26%
Exec and libs 1764 13.7M 0%
Page cache 28121 219.6M 0%
Free (cachelist) 18607 145.3M 0%
Free (freelist) 8687248 66.2G 52%
Total 16777216 128G
결과 swap -l
:
swapfile dev swaplo blocks free
/dev/zvol/dsk/rpool/swap 303,1 16 8388592 8388592
결과 prstat -Z
:
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
0 96 97G 33G 26% 26:29:09 0.3% global
답변1
스왑 공간 사용량을 제한하고 싶습니다(크기가 아니라 사용량만).
Solaris에서는 스왑 예약을 제한할 수 없습니다.
프로세스에서 사용하는 거의 모든 RAM 바이트는보장하다Solaris는 일종의 영구 백업 저장소를 제공합니다. (Solaris에는 스왑 아웃이 불가능하기 때문에 스왑 예약이 필요하지 않은 특정 유형의 공유 메모리와 같은 몇 가지 예외가 있습니다. Oracle Database SGA와 같은 구현에서는 이러한 기능을 사용합니다.)
실행 파일 및 공유 개체와 같은 메모리 매핑된 파일은 일반적으로 디스크의 실제 파일을 백업 저장소로 사용하므로 스왑 공간을 전혀 사용하지 않습니다. 대부분의 다른 메모리 사용에는 백업 스토리지가 필요합니다. 예를 들어, 프로세스가 커널에서 2GB의 힙을 요청하지만 실제로는 사용하지 않는 경우 Solaris는 프로세스가 메모리를 요청하면 이를 확보할 것을 보장하므로 스왑 공간을 위해 2GB가 예약됩니다. 어떤 OOM 킬러도 프로덕션 데이터베이스 서버의 데이터베이스 프로세스나 고객 주문을 처리하는 온라인 웹 서버의 웹 서버를 종료할 수 없습니다.
Solaris에서는 메모리를 요청하고 커널이 메모리를 가질 수 있다고 말하면 사용자는 메모리를 얻습니다. 실제로 훨씬 나중에 사용하지 않더라도 말이죠. 이는 사용자가 요청하면 향후 어떤 이유로든 교체해야 하는 경우 커널이 이를 넣을 장소가 있는지 확인해야 함을 의미합니다.
"이 기억을 가질 수 있다고 말하는데, 그건 당신이~ 할 것이다어쨌든 접근할 수 있다' 패러다임이 아니라 '이 메모리를 가질 수 있다고 말했지만 거짓말을 했고, 이제 당신이 그것을 사용하려고 했으니 내가 당신을 죽일 것이다' 패러다임, 그리고 비용은 교환 사용량을 보는 것입니다. 너무 높습니다.
프로세스의 스왑 공간 사용량을 보려면 다음 pmap -S
명령을 사용할 수 있습니다.
bash-4.1$ pmap -S $$
4622: /usr/bin/bash
Address Kbytes Swap Mode Mapped File
0000000000400000 1412 - r-x---- bash
0000000000571000 40 40 rw----- bash
000000000057B000 24 24 rw----- bash
0000000EC09E6000 236 236 rw----- [ heap ]
00007FF0C8590000 304 - r-x---- libcurses.so.1
00007FF0C85EC000 20 20 rw----- libcurses.so.1
00007FF0C85F1000 16 16 rw----- libcurses.so.1
00007FF0C8600000 6756 - r-x---- en_US.UTF-8.so.3
00007FF0C8CA9000 8 8 rw----- en_US.UTF-8.so.3
00007FF0C8CD0000 32 - r-x---- libgen.so.1
00007FF0C8CE8000 4 4 rw----- libgen.so.1
00007FF0C8CF0000 64 64 rwx---- [ anon ]
00007FF0C8D10000 64 64 rwx---- [ anon ]
00007FF0C8D2D000 4 - rwxs--- [ anon ]
00007FF0C8D30000 64 - r-x---- methods_unicode.so.3
00007FF0C8D40000 4 4 rw----- methods_unicode.so.3
00007FF0C8D50000 24 24 rwx---- [ anon ]
00007FF0C8D60000 1816 - r-x---- libc.so.1
00007FF0C8F36000 68 68 rw----- libc.so.1
00007FF0C8F47000 8 8 rw----- libc.so.1
00007FF0C8F50000 64 64 rw----- [ anon ]
00007FF0C8F6C000 352 - r-x---- ld.so.1
00007FF0C8FD4000 16 16 rwx---- ld.so.1
00007FF0C8FD8000 4 4 rwx---- ld.so.1
FFFF80E6271AF000 20 20 rw----- [ stack ]
---------------- ---------- ----------
total Kb 11424 684
다음 줄을 확인하세요.
0000000000400000 1412 - r-x---- bash
이 Swap
열은 특정 메모리 맵에서 스왑을 전혀 사용할 필요가 없음을 나타냅니다. 이는 bash
디스크 파일 자체가 지원하는 실행 파일의 일부 입니다 /usr/bin/bash
.
하지만 이 줄은:
0000000000571000 40 40 rw----- bash
40kb의 스왑 공간을 사용하십시오. 이는 매핑된 데이터 세그먼트에서 나올 수 있지만 /usr/bin/bash
수정 가능한 데이터(권한 참고)이므로 rw
백업 저장소는 수정 불가능한 /usr/bin/bash
디스크 파일이 될 수 없으므로 40kb 스왑 예약을 얻습니다.
모든 heap
및 매핑 anon
은 stack
스왑 공간으로 지원됩니다.
요점:
Solaris에서 모든 스왑 공간을 사용하고 싶지 않고 새 프로세스를 시작할 수 없는 경우 프로세스가 실제로 사용하지 않는 메모리를 요청하지 못하게 하십시오.
또는 더 큰 스왑 파티션을 만드세요.