Solaris 10의 메모리에 대한 질문이 하나 더 있습니다.
상단 I 672 MB의 메모리를 가지고 있음을 보여줍니다 나 :
130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle, 3.9% user, 1.0% kernel, 0.0% iowait, 0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap
의 vmstat 쇼 나에게 같은 :
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id
0 0 0 564744 687896 3 13 0 0 0 0 0 0 0 0 0 354 667 752 1 1 98
그러나 prstat -a -s 크기를 수행 하면 다음과 같이 나타납니다.
NPROC USERNAME SWAP RSS MEMORY TIME CPU
45 orbixadm 1449M 1592M 9.7% 4:46:53 0.4%
48 root 146M 160M 1.0% 8:09:49 1.2%
3 user1 46M 204M 1.2% 0:00:45 0.0%
9 webservd 46M 14M 0.1% 0:00:00 0.0%
5 ctxsrvr 28M 32M 0.2% 4:54:51 0.0%
11 user2 23M 34M 0.2% 0:00:37 0.2%
4 user3 4840K 11M 0.1% 0:00:01 0.0%
1 smmsp 1456K 4552K 0.0% 0:00:24 0.0%
2 daemon 2128K 6224K 0.0% 0:06:32 0.0%
1 user4 1232K 3608K 0.0% 0:00:00 0.0%
1 nagios 376K 2472K 0.0% 0:15:18 0.0%
보시다시피 RSS 값의 합계는 15GB의 메모리에 도달하지 않으며 SWAP 값을 추가하더라도 마찬가지입니다.
내 질문은 : 내가 어떤 명령을 믿습니까?
top과 vmstat가 좋은 결과를 낳으면 15GB의 메모리는 어디에 있습니까? 그렇지 않다면 왜 저에게 보여 주나요?
편집 : 명령의 결과 : % echo ::memstat | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1687138 13180 82%
Anon 137110 1071 7%
Exec and libs 47107 368 2%
Page cache 95277 744 5%
Free (cachelist) 22248 173 1%
Free (freelist) 69592 543 3%
Total 2058472 16081
Physical 2055442 16058
편집 2 :
좋아, 이제 ARC 캐시에 사용 된 메모리를 볼 수 있습니다.
그러나 몇 가지 새로운 테스트를 통해 이제 다음과 같은 결과를 얻었습니다.
2066 MB used
( prstat -Z 및 echo :: memstat | mdb -k 결과)
1193 MB free
( 최고 결과)
8859 MB ARC cache
( kstat zfs :: arcstats : 크기 결과)
12 GB
내 시스템에있는 동안 어느 정도 의 메모리를 제공 16 GB
합니다.
어쩌면 내가 다른 것을 놓친 것일 수도 있지만 다른 곳은 어디에 4 GB
있습니까?
답변
ZFS는 대부분의 메모리를 ARC 캐시로 사용합니다. RAM이 어떻게 사용되는지 알고 싶다면 루트로이 명령을 실행하십시오 :
# echo ::memstat | mdb -k
Solaris 10 10/09 이상에서는 다음과 같이 표시됩니다.
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 60569 236 16%
ZFS File Data 53270 208 14%
Anon 41305 161 11%
Exec and libs 5891 23 2%
Page cache 1190 4 0%
Free (cachelist) 7006 27 2%
Free (freelist) 212607 830 56%
Total 381838 1491
보시다시피, ZFS 파일 데이터를 캐시하는 데 사용되는 RAM의 양을 나타내는 줄이 있습니다. 불행히도 이전 Solaris 10 릴리스를 실행 중이므로 memstat는이 ZFS 통계를 별도로 표시하지 않습니다. 혼동되는 커널 사용 메모리에 포함되어 있습니다. 커널은 정상적인 상황에서 13GB의 RAM을 사용해서는 안됩니다.
어쨌든 여전히 서버에 전체 ARC 크기를 표시하는 방법이 있습니다.
이 명령을 실행하십시오.
# kstat zfs::arcstats:size
module: zfs instance: 0
name: arcstats class: misc
size 273469024
내 컴퓨터에서 현재 273MB의 RAM이 ZFS ARC 캐시를 처리하는 데 사용됩니다. memstat는이 273MB에서 208MB가 파일 캐시로 사용됨을 보여줍니다. 응용 프로그램에 필요한 경우 최대 208MB의 RAM을 자동으로 해제 할 수 있습니다.
이제 프로세스 메모리 사용량을 살펴 보겠습니다. prstat와 함께 -Z 옵션을 사용하면 프로세스 별 통계 아래 영역 별 요약이 표시됩니다. 여기서 전역 (및 유일한) 영역은 185MB의 RAM을 사용하고 있습니다. 이것은 (대략) 모든 프로세스 rss 열의 합계와 일치해야합니다.
# prstat -Z
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
741 noaccess 129M 113M sleep 59 0 0:00:35 1,4% java/18
973 root 5148K 832K run 29 0 0:00:00 0,4% script/1
972 root 5072K 900K sleep 59 0 0:00:00 0,2% script/1
998 root 7148K 2812K cpu0 49 0 0:00:00 0,1% prstat/1
974 root 3456K 968K sleep 49 0 0:00:00 0,1% ksh/1
5 root 0K 0K sleep 99 -20 0:00:01 0,1% zpool-rpool/37
241 root 5400K 1608K sleep 59 0 0:00:00 0,0% VBoxService/5
77 root 7620K 2356K sleep 59 0 0:00:00 0,0% devfsadm/7
969 root 3372K 936K sleep 59 0 0:00:00 0,0% script/1
126 root 9664K 2844K sleep 59 0 0:00:00 0,0% nscd/31
480 root 9420K 2036K sleep 59 0 0:00:00 0,0% sendmail/1
11 root 9164K 7860K sleep 59 0 0:00:29 0,0% svc.configd/17
1 root 2504K 1432K sleep 59 0 0:00:00 0,0% init/1
413 root 15M 9644K sleep 59 0 0:00:00 0,0% fmd/19
377 root 6536K 2848K sleep 59 0 0:00:02 0,0% inetd/4
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
0 48 177M 185M 12% 0:01:24 2,5% global
이 185MB는 memstat 출력에서 두 줄의 합에 해당합니다. “Anon”은 응용 프로그램에서 데이터를 저장하는 데 사용하는 RAM이고 “Exec and libs”는 응용 프로그램 및 라이브러리 코드입니다.
답변
메모리는 디스크에서 읽은 매핑되지 않은 페이지의 데이터로 채워집니다. 파일을 다시 읽을 수 있고 메모리에 데이터를 보관하면 디스크 읽기가 저장되므로 메모리에 보관됩니다. 사용 가능한 메모리는 영원히 낭비되므로 컴퓨터는 가능한 적은 메모리를 유지하려고합니다.
예를 들어, 프로그램을 실행한다고 가정하십시오. 프로그램이 종료됩니다. 프로그램이 여전히 메모리에 있지만 프로그램이 실행되고 있지 않으므로 해당 메모리 페이지는 프로세스에 의해 사용되지 않습니다. 시스템의 메모리가 부족하지 않은 경우 페이지는 메모리에 보관됩니다. 프로그램이 다시 실행되면 프로그램에 더 많은 메모리를 할당 한 다음 다시 읽어 들일 수 있도록 노력할 필요가 없습니다. 그리고 페이지가 다른 것에 필요하다면, 메모리 페이지를 다시 사용하기 위해 자유롭게 사용하는 것보다 메모리 페이지를 사용하는 것이 더 쉬워지기 때문에 여전히 시스템에서 승리합니다.
메모리는 저장 가능한 리소스가 아닙니다. 1GB를 1 시간 동안 무료로 남겨두면 해당 데이터로 수행 할 수있는 모든 것이 영원히 손실됩니다.