Solaris Memory 에 대하여 외워야 할 10 개 항목



1. S olaris 는 가상 메모리 ( Virtual Memory) 시 스템을 사용한다.

가상 메모리란 물리적 메모리(physical memory)와 하드 디스크(swap device)를 결합하여 하나의 큰 메모리 처럼 사용하는 것을 말한다.

2. S olaris 는 이러한 가상 메모리를 관리하기 위하여 메모리를 페이지 단위 ( 8KB) 로 나누어 관리한다.
1000Page =8M byte

3. S olaris 에 서는 가상 메모리 ( Virtual Memory) 를 s wap 으 로 명칭한다.
swap partition 이 보통 디스크를 말하며 구별해야 한다.

4. S olaris 는 응용 프로그램이 동작할 때, 필 요한 메모리만 s wap(VM) 에 서 빼서 준다.


프로세스가 메모리를 요청하면, 요청한 메모리 만큼 예약하여 두고 그 메모리를 실재로 액세스할 때 그 메모리가 물리적 메모리에 할당된다.

* Memory allocation: reserved allocated
1. request: p = malloc( 100MB ); 100M 0M
2. use:
for( i = 0; i < 10M; i++ ) *(p+i) =
1;
90M 10M

5. S olaris 에 서 여유 있는 물리적 메모리를 화일 시스템의 캐쉬로 사용한다. 디폴트로 프리 메모리(free physical memory)가 전체 물리적 메모리 양의
1/64(lotsfree)보다 크면, 화일 시스템을 통한 디스크 I/O는 모두 메모리에 남겨두어 화일 시스템의 캐쉬로 사용한다.파일시스템 자주 사용하는 시스템은 vmstat
free 값이 작아 보인다.

6. Solaris 는 부족한 메모리을 보충하기 위하여 기존에 사용하고 있던 페이지 중에 최근에 사용하지 않은 페이지를 찾아서 프리시킨다.
이러한 찾는 과정을 scan rate 값으로 확인할 수 있다.

7. 시 스템의 메모리가 부족하다고 판단할 수 있는 근거는 s can rate 의 값으로 판단한다 .
30초 간격으로 조사하여 약 200 – 300 이상이면 그 순간에 메모리 로드가 있다고 판단한다.

8. 사 용 가능한 가상 메모리는 각각의 명령어의 결과에서 확인할 수 있다.
swap -s vmstat sar -r

9. 프 로세스가 사용하는 메모리 양은 다음과 같은 시스템 명령어로 확인할 수 있다.
#ps -ef , /usr/ucb/ps -aus (SZ reserve page 수, RSS 는 메모리상주 )

10. 예제.
Q1) 특별히 메모리를 많이 사용하는 것이 없는데 메모리 양이 매우 적게 보입니다. 위에서 언급한 바와 같이 Solaris 운영체제는 물리적 메모리의 여유 공간을 화일 시스템의
캐쉬로 사용한다. 애플리케이션 프로그램이 화일을 읽고 쓸 경우, 커널 메모리를 거쳐서 I/O가 발생한다. 이때 화일을 읽거나 쓴 후에, 커널 메모리에 남아 있는 화일의 내용을
바로 지우는 것이 아니고, 캐쉬 용도로 사용하기 위하여 메모리에 남겨둔다. I/O가 많이 발생하면 화일 시스템의 캐쉬가 시스템의 메모리를 다 사용하게 될 것이다. 이것을 관리하기
위하여 커널은 물리적 메모리 양이 lotsfree(전체 물리적 메모리 양의 1/64(1.5%)) 이하로 줄어들 경우에 시스템에 있는 메모리를 조사하여 최근에 사용하지 않은 페이지를 찾아,
프리시켜서 lotsfree 양 만큼의 메모리를 유지한다.

그래서 일반적으로 시스템의 물리적 메모리의 양은 적게 보인다. 이것으로 시스템의 메모리가 부족하다고 판단할 수 없다. 일반적으로 시스템의 메모리가 부족하다고 판단할 수 있
SS는 근거는 scan rate의 값으로 판단한다. 30초 간격으로 조사하여 약 200 – 300 이상이면 그 순간에 메모리 로드가 있다고 판단한다.
priority_paging을 사용하면 메모리 양이 cachefree(전체 물리적 메모리 양의 1/32(3%)) 보다 적게되면, 시스템이 있는 메모리를 조사하여 최근에 사용하지 않은 페이지를 찾아,
프리시켜서 cachefree 양 만큼의 메모리를 유지한다. 메모리가 lotsfree 양보다 클 경우에는 화일 시스템의 캐쉬로 사용되는 메모리만 프리시킨다. priority_paging가 사용되면,
scan rate 값이 좀 더 크게 측정될 수 있다.

Q2) 어떤 프로세스가 메모리를 비정상적으로 많이 사용하는지 알 수 있읍니까?
애플리케이션 프로그램을 작성하면 프로그램이 사용하는 코드나 초기 데이타의 크기는 고정된다. 그리고 프로그램이 실행되어 프로세스로서 동작하게 되면 다이나믹하게 메모리를
할당 받을 수 있는데, 일반적으로 비정상적으로 메모리를 사용하는 프로세스는 다이나믹하게 메모리를 할당 받고, 그것을 제대로 관리하지 않아서 발생한다. 이렇게 할당 받은 데
이타는 프로세스의 힙(heap) 영역에 포함된다. 따라서 힙(heap)이 큰 프로세스가 있다면, 그 프로세스가 그 만큼의 힙(heap)을 사용할 프로세스인지 아니지를 판단하여야 한다.
만일 비정상적으로 힙(heap)을 사용한다고 판단이 되면, 그 프로그램의 개발자에서 알려서 프로그램을 수정하여야 할 것이다.프로세스가 얼마나 많은 힙(heap)을 사용하는가를 확인
하려면, Parm에 포함된 psinfo 명령어로 확인할 수 있다. psinfo에 -h 옵션을 사용하면 힙(heap)을 많이 사용하는 순서로 화면에 보여준다.

# /opt/JSparm/bin/psinfo -h
Date.time 0123.12:27:07 proc 518 zomb 339 run 0 lwp 422 cpu 15.26% load1m 0.20 ptime 128706.45 hp+stk 249.9M

PID PPID USERNAME SIZE RSS HP+STK S NLWP WCPU% CPU% MEM% ELAPSED TIME CMDLINE
19440 19438 guest 131.0M 84.38M 107.4M R 1 4.90% 4.90% 17.0% 8d73139 03:00:59.86 netscape
13217 13216 nobody 44.42M 10.82M 26.12M S 59 0.00% 0.00% 2.2% 1d7702 16.18 ns-httpd -d config
200 1 root 6.070M 1.555M 2.875M S 10 0.00% 0.00% 0.3% 58d11424 16.60 /usr/sbin/syslogd
283 1 oracle 63.89M 41.88M 2.547M S 1 0.00% 0.00% 8.5% 58d11409 09.85 ora_pmon_SOL
19345 19325 guest 9.258M 6.805M 2.141M S 7 0.68% 0.68% 1.4% 8d73245 05:59.89 dtwm
19904 19903 guest 7.172M 4.438M 1.594M S 1 0.00% 0.00% 0.9% 8d66806 09.37 dtpad -server
19339 1 guest 4.383M 3.250M 1.266M S 4 0.00% 0.00% 0.7% 8d73246 26.76 senddata -p 1200
285 1 oracle 63.02M 44.93M 1.258M S 22 0.00% 0.00% 9.1% 58d11409 02.33 ora_dbw0_SOL
287 1 oracle 62.78M 45.05M 1.203M S 14 0.00% 0.00% 9.1% 58d11409 02.66 ora_lgwr_SOL
289 1 oracle 62.72M 44.91M 1.172M S 11 0.00% 0.00% 9.1% 58d11409 02.42 ora_ckpt_SOL
… skip …
HP+STK는 프로세스의 힙(heap)과 스택(stack)을 합계한 크기이다. 만일 프로세스의 메모리 크기 순서(SIZE)로 정열할 경우에 oracle과 같이 큰 공유메모리를 사용하는
프로세스가 있다면, 그 프로세스들이 상위를 차지할 것이다. 전체 크기(SIZE)로 보아서는 그 프로세스가 얼마나 많이 다이나믹한 메모리를 할당 받았는지 알 수 없다.프로세스 메모리
맵에 대한 자세한 정보는 /usr/proc/bin/pmap 명령어를 사용하여 확인할 수 있다.

Q3) vmstat의 w값이 30으로 계속해서 보입니다.
vmstat의 w가 의미하는 것은 swap out된 쓰레드(thread) 갯수를 나타내며, 멀티 쓰레드 프로세스가 아닌 경우에는 하나의 프로세스는 하나의 쓰레드를 가진다.한번 swap out된
프로세스는 그 프로세스가 다시 실행될 때 메모리로 들어온다. 예를 들어, 프린터 데몬 lpsched가 swap out되었다면, 프린터를 사용하는 작업을 하지 않은 한 메모리로 들어오지
않는다. vmstat의 w값에 0이 아닌 값이 나타날 무렵에 시스템의 메모리 로드가 극심했다는 것을 알 수 있다. 이렇게 메모리 로드를 극심하게 야기시킬 수 있는 경우는 다음과 경우가 있을 수 있다.

1. 프로세스를 동시에 많이 실행하여 메모리 요청이 집중되었을 경우
2. 화일 시스템 backup과 같이 광범위하게 많은 양의 화일을 동시에 액세스할 경우
3. 프로세스가 큰 메모리를 요구하여 짧은 시간에 초기화 할 경우

Q4) df -k 에서 swap의 크기가 변합니다
# df -k /tmp
Filesystem kbytes used avail capacity Mounted on
swap 845712 196248 649464 24% /tmp
#
… skip ….
# df -k /tmp
Filesystem kbytes used avail capacity Mounted on
swap 706336 196248 510088 28% /tmp
3
실제로 df -k 명령어에서 보여주려고 하는 값은 swap의 값이 아니라 /tmp의 값을 보여주려한다. / 화일 시스템의 저장공간은 하드 디스크의 특정 파티션(예,
/dev/dsk/c0t0d0s0)이고 이 크기는 화일 시스템을 다시 만들기 전까지는 불변이다. 그러나 /tmp 화일 시스템의 저장공간은 하드 디스크의 특정 파티션이 아니고 가상 메모리를
저장공간으로 사용한다.



/ 화일 시스템은 ufs 라는 화일 시스템을 사용하는 반면에, /tmp 화일 시스템은 tmpfs 라는 특수한 화일 시스템을 사용한다. 이것은 화일 시스템의 저장공간으로 가상 메모리(VM:
swap)를 사용한다.


그래서 프로세스들이 메모리를 많이 사용하면 가상 메모리 공간이 줄어든다. 그 결과 /tmp 디렉토리에 화일들이 더 이상 만들어 지지 않았음에도 불구하고 swap 공간이 줄어서 /tmp
디렉토리가 100%로 될 수 있다.

Q6) vmstat 명령어의 결과에서 프리 메모리량에 대하여 그래프를 만들 수 있읍니까? Parm에는 vmstat, iostat, mpstat, netstat, sar의 결과물에서 주요 필드에 대하여 그래프를
만들 수 있는 명령어들(gvmstat, giostat, gmpstat, gnetstat, gsar)이 있다. 뿐만 아니라, 행과 열로 된 데이타에 대하여 그래프를 만들 수 있는 명령어(mkgraph)가 있다.
vmstat 명령어의 결과를 수집한 화일이 vmstat.log가 있고(09시 정각에 30초 간격으로 수집했다고 가정), 이 화일에 대하여 다음과 같이 free 메모리 그래프를 만들 수 있다.


# gvmstat -t 09:00:00 -i 30 -G free -o output vmstat.logQ7) swap -s 에서 실제로 할당된 메모리의 크기를 모니터하여 그래프를 그려볼 수 있읍니까?
# swap -s total: 664720k bytes allocated + 53320k reserved = 718040k used,
485160k available

swap -s 명령어를 실행하여 allocated 된 부분과 reserved 된 부분과 이 두개를 합계한 used 된 부분에 대하여 다음과 같이 그래프를 만들 수 있다.

# dolog -o swap-s -t -T 30,480 swap -s # ls -l swap-s.021105.091020.30 #
mkgraph -G 2::allocated,6::reserved,9::used -A -i 30 -t 091020 -o swap swaps.
021105.091020.30 # ls -l swap-s.021105.091020.30 swap.gif
dolog 명령어는 Parm V6.1에 포함된 명령어이다. 이것은 지정한 명령어를 일정 시간간격으로 실행하여 그 결과을 화일에 저장한다. 이렇게 저장된 결과에 대하여 mkgraph 명령어
로 그래프를 그린다.

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다