2008/07/02

솔라리스 10 서버 성능 모니터링에 관한 방안 제안



솔라리스10에서 시스템에서 발생할 성능 관련 문제를 감지하기 위한 자동화된 모니터링 환경 구축을 위해서는 다음과 같은 구조를 권고합니다.



성능 관련해서 저장해야할 정보는

1) 성능에 영향을 주는 장애가 발생하나 를 일단 봐야 합니다.

2) 컴포넌트 장애가 없다는 가정하에서 어떤 형태의 부하가 발생하고 어느 컴포넌트에 부하가 많이 몰리는 지를 축적하는 것이 중요합니다.



1)은 fmstat과 prtdiag, dmesg 를 주기적으로 보관하는 것이 중요합니다. 특히 fmstat는
cpu/memory/io component의 장애를 실시간 보고해주는 것이므로, 관리하는 것이 바람직합니다. 모니터링시에는
syslogd가 만들어주는 메세지 /var/adm/messages와 함께 일치된 시간상으로 관리하는 것이 바람직합니다.




$pfexec fmstat 1
module ev_recv ev_acpt wait svc_t %w %b open solve memsz bufsz

cpumem-retire 0 0
0.0 0.2 0 0 0 0 0 0
disk-transport 0 0 0.0 348.9 0 0 0 0 32b 0

eft 0 0 0.0 2.0 0 0 0 0 1.4M 0

fmd-self-diagnosis 1 0 0.0 0.1 0 0 0 0 0 0

io-retire 0 0 0.0 0.1 0 0 0 0 0 0

snmp-trapgen 0 0 0.0 0.1 0 0 0 0 32b 0

sysevent-transport 0 0 0.0 434.5 0 0 0 0 0 0

syslog-msgs 0 0 0.0 0.1 0 0 0 0 0 0

zfs-diagnosis 2 2 0.0 7.4 0 0 0 0 0 0

zfs-retire 0 0 0.0 0.1 0 0 0 0 0 0



2) 장애난 컴포넌트가 없는 경우에 서비스에 의해서 발생하는 부하에 의하여 서비스 응답이 장애성으로 판단되는 경우가 있는데
이러한 경우를 향후 추척하기 위해서는 3가지의 데이타를 축적하는 것이 바람직합니다. 시스템에서는 서비스를 위해서 사용되는 것은

CPU, memory, io(block io), net(streaming io)로 분류될 수 있겠습니다.

CPU와 메모리 추적을 위해서는 vmstat를 축적하시는 것이 바람직하며, 네트웍의 대역폭 조사를 위해서는 첨부되어 있는 netsum과 같은 유틸리의 값을 저장해놓는 것이 좋습니다.

동시에 io(블럭IO)를 위해서 예전에는 sar를 제안했습니다만, 솔라리스10에서는 보다 더 세련된 dtrace를 이용하여 실감나는 추적을 할 수 있습니다.


링크된 netsum은 다음과 같은 출력을 지원합니다. (플랫폼별로 실행화일이 다릅니다.)


$netsum -A -I wpi0 -i 5

Name inc/s out/s ipkts/s opkts/s ierr oerr Bi/pkt Bo/pkt Time

wpi0 20.4 B 16.0 B 0.2 0.2 0 0 102 80 14:24:18

wpi0 953.5 B 36.3 B 2.6 0.4 0 0 367 91 14:24:23

wpi0 0.0 B 0.0 B 0.0 0.0 0 0 0 0 14:24:28

이런 기록으로 네트웍 인터페이스에 대한 기록을 유지할 수가 있습니다.

그외 디스크 사용의 패턴에 관한 데이타를 저장해두고, 가장 빈번한 사용이 되는 disk가 어딘지를평소에 기록해놓는 것이 좋습니다. 솔라리스10 이전에는 이러한 기록이 매우 힘들었으나, 솔10에서는 dtrace 스크립트를 통해서 아주 훌륭한 데이타를 볼 수 가 있습니다.


다음은 hotspot.d라는 DTraceToolkit 0.99에 포함된 스크립트를 약간 수정한 스크립트입니다.
실행은 #dtrace -s hotspot.d 처럼 실행하며, 스크립트화해서 cron에 등록해서 백그라운드로
실행하시면 됩니다.



실행결과는 대략 다름과 같습니다. 이러한 데이타를 통하여 어떤 디스크가 어떻게 사용되고 있는 지를 파악할 수 있습니다.


혹은 io 패턴을 축적해놓는 것도 도움이 될 수 있는데, 역시 DTraceToolkit에 들어있는 iopattern이라는 스크립트를 이용하여 관련 정보를 기록해놓으면 크게 도움이 될 수 있습니다. (아래 링크 참조)



iopattern 이라는 스크립트는 다음과 같은 내용이 나오게 됩니다. 디스크의 패턴에 따라서, 향후 서비스 둔화 지점 파악과 스토리지 아키텍쳐를 어떤 방향으로 가져가야 할 지에 대한 기초 데이타를
제공하게 됩니다.









그외, DtraceToolkit에 내장된 여러 스크립트를 이용하게 되면, 매우 정확하고 정밀한 서버 관련 데이타를 축적할 수 있습니다.

DtraceToolkit : http://opensolaris.org/os/community/dtrace/dtracetoolkit/


솔라리스에서 사용자의 명령어 활동을 기록할 수 있을까 ? (CLI logging)

사용자 활동에 관한 로그는 기본적으로는 강제로 규정하게 하려면, 쉘 레이어에서 강제화 해야 하는데 현재 솔라리스에 들어있는 쉘은 강제적으로 활성화하는 방안이 없습니다.



현재 사용자의 터미널 활동을 로깅할 수 있는 방안으로는

1) 사용자의 쉘의 .profile이나 .login에서 로그인 시점에 script들이 자동으로 실행되어 자동으로 스크립트가 저장되도록 하는 방법. 사용자의 쉘 프로화일 파일 안에 다음과 같이 추가합니다.

...

exec script -a `date '+%m%d%y:%H%M'`.log




=> 사용자가 로그인하면 자동으로 저장되고, ctrl-d 혹은 logout하면 스크립트 내용이 저장됩니다.

매우 소극적 방법이고, 실제 사용자가 로그아웃할때까지 내용이 화일에 저장되지 않습니다. 또한, 사용자가
.profile을 변경해버리면 소용이 무용지물이 될 수 있습니다. 또한 쉘에 따라서 이런 구성이 지원 될 수도 있고, 안될 수도
있습니다.



2) dtrace를 이용하여 실시간 모든 쉘의 행위를 감시할 수 있습니다.

=> 매우 적극적인 방법입니다. 모든 쉘을 죄다 감시하게 되므로, 불필요한 데이타도 컬렉션 될 수 있습니다.
DtraceToolkit에 포함된 shellsnoop 이라는 dtrace 스크립트를 이용하면, 현재 실행되고 있는 대부분의
쉘(sh,ksh,bash,csh,tcsh,zsh)의 입출력을 실시간으로 감시가 가능합니다. 물론, 사용자는 알 수 없습니다.
커널단에서 syscall을 hooking하여 쉘의 read,write를 캡쳐해서 출력해주는 유틸리티입니다. 매우 강력합니다.
첨부 화일 참고



3) 쉘 자체가 log 기능을 가지고 있는 쉘을 사용자 쉘로 지정하는 방법이 있습니다.

솔라리스가 제공하는 기본 쉘들은 이런 기능을 가지고 있지 않으며, 오픈 소스 중에서 사용하여야 합니다.

대표적으로 수도쉘등이 있습니다.

다음 링크를 참고하십시요. http://www.egbok.com/sudoscript/sudoshell.1.html

2008/06/30

버추얼박스에서 게스트와 호스트간의 공유 방식

버추얼 박스 상에서는 다양한 호스트/게스트가 올라올 수 있기 때문에, 각 조합에 따른 호스트/게스트 간의 폴더 공유 방식이 달라질 수 있습니다. 다음은 몇가지 경우에 대해서 구성가능한 매트릭스를 만들어봤습니다.

다음의 테이블에서 첫번째 컬럼에는 호스트 운영체제의 목록이며, 각 컬럼은 호스트에 따라 게스트별 사용이 권고되는 공유 화일 시스템입니다.

아래 테이블의 경우, 호스트와 게스트가 동시에 솔라리스와 리눅스 중 어느 한쪽인 경우에는 호스트에서 NFS를 구성하고 게스트에서 NFS를 공유하는 방식이 가장 추천되는 방법입니다. 물론, 솔라리스의 경우 내장형 CIFS나 혹은 Samba를 이용해서 CIFS를 서비스할 수 있으며, 리눅스 역시 Samba를 이용하여 CIFS를 서비스할 수 있으므로, 이러한 방법으로도 공유를 할 수 있습니다.

H \ G
Solaris Linux Windows
Solaris NFS NFS(CIFS) CIFS
Linux NFS(CIFS) NFS CIFS
Windows CIFS CIFS CIFS

기술적으로 버츄얼 박스는 게스트가 윈도우즈 계열인 경우 내부적으로 VboxSharedFolderFS이라는 가상의 화일시스템 서비스를 제공하여 호스트가 공유한 폴더를 마치 네트웍 공유 폴더인 것처럼 노출하여 윈도우즈 게스트가 호스트의 공유폴더를 cifs로 마운트할 수 있도록 제공해줍니다. 하지만, 게스트가 비 윈도우즈 계열인 경우에는 이러한 기능을 쓰지 않고 호스트나 게스트가 이미 내장하고 있는 공유 화일 시스템인 NFS/CIFS(samba)를 이용하여 네트웍 공유를 사용하면 됩니다. vbox에서 NAT 네트웍 구성을 가지도록 게스트OS를 설치하면 게스트운영체제는 default gateway로 10.0.2.2를 가지게 되는데, 이 IP가 곧 호스트 서버이기도 합니다.

따라서, 호스트서버에서 export된 nfs나 cifs(samba)는 이 IP를 이용하여 vbox 내부 게스트들에게 마운트(Map Network drive...)되어 질 수 있게 됩니다.

각 운영체제별 공유 디렉토리 생성 및 제공 방안은 구글링해보시기 바랍니다.

참고로 솔라리스는 /etc/dfs/dfstab에 예제 라인을 복사한후 원하는 디렉토리로 변경하고, 커멘트를 없애고 저장한 후에 nfs 서비스를 시작 혹은 재시작 하도록 하면 됩니다.

#svcadm enable -r nfs/server
-----> nfs/server와 연관된 다른 서비스도 모두 시작됩니다. 이미 서비스가 시작되어 있는 경우 restart를 하시면 됩니다.

공유하고자 하는 디렉토리가 공유 서비스 중인지 확인하기 위해서는 다음과 같이 실행해봅니다.
#share

명령어 결과로 원하는 내용이 나오면, 버추얼 박스 게스트에서 마운트할 수 있는 지 확인할 수 있습니다. 게스트가 솔라리스인 경우에는

#dfshares 10.0.2.2
와 같이 공유가능한 지 확인할 수 있으며, nfs automount가 활성화되어 있는 경우에는

#cd /net/10.0.2.2
처럼 그냥 일반 디렉토리로 접근하면 공유된 화일 시스템을 보실 수 있게 됩니다. 노틸러스에 북마크해놓으면 늘 자동으로 접근할 수 있게 됩니다.