1) perf 스크립트 안의 모든 코멘트를 언 코멘트한다. 이 스크립트에서는 sadc(1M)에 인자를 주어 실행시키는데, 이 명령은 시스템이 재시작되었을때, sar의 데이터 파일에 들어있는 상태 데이터를 초기화하는 역할을 수행한다. 2)cron(1M)에 의해 실행되는 구문. 주석만 풀어주면 된다. 3) 이 스크립트를 실행하면 /var/adm/sa/sa*파일이 생성된다. *에 해당하는 문자는 날짜이다. sar는 한달 동안의 데이터만 저장하는 셈이다.
root@wl /var/adm/sa # ls -al sa??
-rw-r--r-- 1 sys sys 564032 1월 4일 23:00 sa04
-rw-r--r-- 1 sys sys 564032 1월 5일 23:00 sa05
-rw-r--r-- 1 sys sys 539968 1월 6일 23:00 sa06
-rw-r--r-- 1 sys sys 294528 1월 7일 23:00 sa07
-rw-r--r-- 1 sys sys 294528 1월 8일 23:00 sa08
-rw-r--r-- 1 sys sys 539968 1월 9일 23:00 sa09
-rw-r--r-- 1 sys sys 551760 1월 10일 23:00 sa10
-rw-r--r-- 1 sys sys 539968 1월 11일 23:00 sa11
-rw-r--r-- 1 sys sys 539968 1월 12일 23:00 sa12
-rw-r--r-- 1 sys sys 539968 1월 13일 23:00 sa13
-rw-r--r-- 1 sys sys 294528 1월 14일 23:00 sa14
-rw-r--r-- 1 sys sys 294528 1월 15일 23:00 sa15
리포트
cron 에 등록되어있는 sar 이 생성하는 리포트는 /var/adm/sa/sar*에 저장된다. 5일치 리포트를 저장하며 그 이전 리포트는 자동으로 삭제한다.
sar* 파일은 텍스트파일이기 때문에 텍스트 뷰어(예를 들어 cat(1))를 사용해 열람할 수 있다.
root@wl /var/adm/sa $ ls -al sar*
...
-rw-r--r-- 1 sys sys 93132 12월 14일 18:05 sar14
-rw-r--r-- 1 sys sys 121153 12월 15일 18:05 sar15
-rw-r--r-- 1 sys sys 124904 12월 16일 18:05 sar16
-rw-r--r-- 1 sys sys 124958 12월 19일 18:05 sar19
-rw-r--r-- 1 sys sys 124958 12월 20일 18:05 sar20
-rw-r--r-- 1 sys sys 124958 12월 21일 18:05 sar21
root@wl /var/adm/sa $ cat sar21
SunOS wl 5.10 Generic_147441-01 i86pc 12/21/2011
08:00:00 %usr %sys %wio %idle
08:20:00 0 0 0 100
08:40:00 0 0 0 100
09:00:00 0 0 0 100
09:20:00 0 0 0 100
...
sar 커맨드
sar 커맨드는 크게 3가지 작동 방법이 있다.
sar [-aAbcdgkmpqruvwy]
sar [-aAbcdgkmpqruvwy] [-s 시간] [-e 시간] [-i 초] -f 파일명
sar [-aAbcdgkmpqruvwy] [-o 파일명] t [n]
-aAbcdgkmpqruvwy 은 출력할 리포트의 종류를 나타낸다. CPU, 메모리, 파일, 메모리의 상태등을 출력해 줄 수 있다. 기본값은 -u(CPU 활성 정보)이다. 따라서 sar 를 아무 옵션 없이 실행하면, 오늘 날짜의 파일을 읽어, CPU 활성 정보를 출력한다.
-f, -s, -e, -i 를 사용해 sar 데이터 출력의 시간을 결정할 수 있다. -f 는 sa 파일의 경로를 의미한다.
- fork/s 는 4-6명의 시스템에서 초당 약 0.5정도다. 셸 스크립트가 실행중인 경우 이 수는 늘어난다.
- fork/s로 나눈 exec/s가 3보다 클 경우 PATH 변수를 최적화 해보자.
-d: 블록 디바이스
device: 장치명
%busy, avque: 장치의 전송 요청에 대해 서비스 해준 비율, 그 시간동안 처리하지 못한 요청 수(이 요청은 큐에 쌓임)
r+w/s, blks/s: 초당 읽기/쓰기 회수, 초당 전송된 블록(512바이트)수
avwait: 평균 대기 시간(밀리초)
avserv: 평균 서비스 시간(밀리초) iostat 의 svc_t 는 avwait + avserv 이다.
-g: 페이징
pgout/s: 초당 페이지 아웃 (요청) 회수
ppgout/s: 초당 페이지 아웃된 페이지수 (실제로 페이지 아웃된 회수)
pgfree/s: (페이지 스캐너에 의해) 페이지 프리된 페이지수
pgscan/s: 페이지 스캐너의 스캔 회수
%ufs_ipf: 1. 재사용 가능한 페이지를 가리키고 있던 inode 가 제거된 비율. 2. 강제 페이지 플러시된 igets 의 비율: 쉽게 설명하자면(정확한 설명은 아니지만), 페이지 아웃 용도로 예약해둔 inode 인데, 파일 시스템에서 inode가 부족해지면 이거라도 가져다 쓴다는 의미다. 고전적인 UFS에서나 사용한 필드로, ZFS를 사용하는 지금은 의미 없을 것으로 생각된다.
- pgfree/s 에 값이 있다는 의미는 페이지 스캐너가 작동중이라는 의미고, 페이지 스캐너는 시스템의 여유 메모리를 찾는 커널 안의 데몬이다. 따라서 pgfree/s 값이 높다면 여유 메모리를 찾는 작업이 많다는 의미로 이는 메모리가 부족함을 직접적으로 의미한다.
- %ufs_ipf 는 0 이어야 하며, 이 수치가 1 이상이면 파일 시스템의 inodes개수를 늘려야 한다. ufs 를 사용하는 경우, [df -o i /UFS/FILESYSTEM]명령을 사용해 inode정보를 얻을 수 있다. ZFS는 inode가 동적으로 관리되기 때문에 inode가 부족해지지 않는다.
-k: 커널 메모리 할당(KMA, kernel memory allocation). 커널은 메모리 할당 속도를 빠르게 하기 위해 'Pool'을 만들어 놓아 운용하고 있다.
ovsz_alloc, fail: 매우 큰 메모리 할당 크기(바이트), 실패 회수. 이 크기의 메모리는 풀에서 가져오는 것이 아니라 동적으로 할당한다.
- 실패 회수가 높다면, 어플의 메모리 관리에 문제가 있거나, 컴파일시 메모리 세팅이 잘못되어있거나, 메모리가 부족한 경우인 경우일 수 있다.
-m: IPC(interprocess communication, 프로세스간 통신)
msg/s, sema/s: 초당 메시지, 세마포어 작업 회수. 메시지나 세마포어를 사용하지 않는 경우 0이다.
-p: 페이지 인
atch/s: 초당 Attach 회수.(페이지 리클레임에 의해 발생된 페이지 폴트 회수) 예를 들어 2개 이상의 프로세스가 같은 프로그램 텍스트에 접근할때 발생.
pgin/s: 페이지인 요청 회수
ppgin/s: 페이지인 된 페이지 개수
pflt/s: 보호 오류로 인한 페이지 폴트(잘못된 페이지 접근. 이 오류를 처리하지 못하면 프로세스를 더이상 실행할 수 없다) 또는 copy-on-writes(대부분이 copy-on-writes임. 두개 이상의 프로세스에 의해 공유된 메모리 영역에 데이터를 쓸때, copy-on-writes가 발생해 다른 프로세스 영역에도 내용이 복사됨. copy-on-writes은 CPU의 명령어 이름이기도 하다)
vflt/s: validity faults 회수. 주소 변환 페이지 폴트. 페이지 타당성 폴트이다. vmstat에서 page-mf 값과 비슷하다
slock/s: 소프트웨어락. 물리적 I/O를 위해 소프트웨어에서 거는 락이다. 예를 들면 디스크에서 메모리로 데이터를 옮길때 메모리 영역이 다른 프로세스에 의해 방해되지 않도록 하기 위해 발생된다.
-q: 대기열
runq-sz, %runocc: 실행되기 위해 대기하고 있는 쓰레드 개수, 큐가 사용된 시간의 비율