Solaris 10에서 사용 된 메모리 0

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 -Zecho :: 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 시간 동안 무료로 남겨두면 해당 데이터로 수행 할 수있는 모든 것이 영원히 손실됩니다.


답변