개요
DBMS와 연관된 기술 지원을 하게 되면 Altibase가 제공하는 성능뷰만으로는 문제 해결을 위한 정보가 부족한 경우들이 있다.
이때 운영체제에서 제공하는 몇 가지 명령어를 이용하여 필요한 정보를 획득할 수 있는데 본 문서에서 그와 관련된 명령어들을 설명한다.
공통 명령어
모든 운영체제에 실행이 가능한 특별히 제약을 갖지 않는 공통적인 명령어를 설명한다.
netstat
네트웍 설정이나 오류 패킷 여부가 존재하는지 확인한다.
패킷상의 송수신간에 문제가 발생할 경우 R(T)X-ERR/R(T)X-DRP/R(T)X-OVR 등이 수치가 증가된다. 이 경우는 네트웍상에 어떤 문제가 있을 수 있음으로 관리자로 하여금 점검하도록 조치한다.
vmstat
시스템의 메모리, 디스크, swap in/out, CPU의 상태 등을 전반적으로 사용자가 정한 간격으로 조회할 수 있다.
확인할 주요 지표는 다음과 같다.
항목 설명 procs의 r CPU를 점유하기 위해 대기하는 쓰레드의 개수이며 값이 크다면 CPU병목이 발생한다고 판단할 수 있다. Memory의 free 물리적 메모리상의 여유 공간 swap의 si, so si/so 수치가 증가 한다는 것은 swap 디스크와 메모리간의 디스크 I/O가 발생한다는 의미이다. CPU의 모든항목 각 항목별로 변화 추이를 살펴야 한다.
Linux
Thread별 CPU 사용량
리눅스(Linux)에서 쓰레드 별 CPU를 top명령어로도 확인이 가능하다. top -H 옵션으로 수행하면 쓰레드 별로 조회가 된다. 하지만 설치된 procps version이 3.2.7 이상이어야 가능하다.
아닌 경우 간단하게 다음과 같이 확인한다. (낮은 버전에서는 잘 지원 안됨)LWP가 쓰레드 별 고유번호이며 C항목에 출력 되는 값이 CPU사용율이다.
항목 설명 CPU 해당 쓰레드가 CPU를 현재 사용하는 CPU 점유율 LWPID 쓰레드의 고유번호
pstack
pstack과 같이 쓰레드의 CPU점유를 확인하면 쓰레드가 현재 어떤 부분을 수행 중인지 확인하는 방법으로 사용한다.
다만, 일부 커널이 낮은 버전의 경우는 pstack이 지정된 쓰레드의 스택만 보여 주는 경우도 있다.위 결과는 모두 쓰레드 별로 출력되기 때문에 각 쓰레드 별로 구분하고 단락 내에서는 가장 아래부터 위로 확인한다. 위의 예제에서 Thread 44 (LWP: 7165)번은 다음과 같은 순서이다.
항목 설명 clone
start_thread
staticRunnerrun
multiplexingAsShared
execute_Task
execute_Task_READY
쓰레드의 생성 및 개시 cmiRecv 통신상에서 사용자의 질의 요청을 읽었음 mmtServiceThread::executeProtocol
mmtServiceThread::execute
doExecute
실행 단계로 진입 mmcStatement::execute
mmcStatement::executeDML
qci::execute
qmx::executeInsertSelect
qmnINST::doItNext
qmnINST::insertOneRow
smiTableCursor::insertRow
smiTableCursor::normalInsertRow
smcRecord::insertVersion
Insert문 수행 확인 smcRecordUpdate::writeInsertLog
smxTrans::writeTransLog
smrLogMgr::writeLog
Insert문 수행을 위해 redo log를 씀 smrLogMgr::updateTransLSNInfo
smxTrans::setLstUndoNxtLSN
undo를 위해 transaction lsn갱신 함 iduPosixLock 쓰레드에 Lock을 획득 위의 결과와 같이 ps/pstack의 정보를 조합하면 CPU를 가장 많이 사용하는 특정 쓰레드가 어떤 일을 수행 중인지 확인이 가능하다. 또한, 많은 SQL문중에 위의 pstack결과를 통해 좀 더 범위를 좁힌 추적을 가능하게 할 수 있다.
사용 중인 파일 목록 확인
리눅스에서 lsof와 같은 별도의 유틸을 설치하지 않는다면 다음과 같이 한다.
리눅스는 /proc/<process id> 경로 아래로 각종 정보를 확인할 수 있음으로 관련된 사항을 참고하도록 한다.
시스템 로그
- /var/log/에 존재하는 파일을 확인한다. 일반적으로 messages파일을 확인하도록 한다.
SUN
- solaris 5.10 기준의 명령어이다.
prstat
Altibase 는 쓰레드 구조로 개발되어 있으며 경우에 따라 어떤 쓰레드가 CPU를 많이 점유하고 사용하는지 확인해야 하는 경우 사용한다.
pstack
prstat과 같이 쓰레드의 CPU점유를 확인하면 쓰레드가 현재 어떤 부분을 수행 중인지 확인하는 방법으로 사용한다.
c++filter 라는 명령은 C/C++간에 호출된 함수 명이 제대로 보여 지지 않는 경우를 제거하는 용도이다. 사용하지 않을 경우 함수 명이 보기 힘든 형태로 출력됨으로 가능한 사용하도록 하며 일반적으로 컴파일러가 설치된 경로의 실행 파일이 위치하는 곳에 존재한다. (Ex: /opt/SUNWspro/bin/)
pstack의 결과를 해석하는 방법과 동일하게 쓰레드 별로 lwp#을 기준으로 단락 단위로 분리하여 아래에서 위로 해석해 가도록 한다.
pfiles
prstat과 같이 쓰레드의 CPU점유를 확인하면 쓰레드가 현재 어떤 부분을 수행 중인지 확인하는 방법으로 사용한다.
위의 결과에서 현재 사용 가능한 file descriptor정보와 함께 0번, 1번 순으로 해당 프로세스가 접근하여 사용 중인 모든 파일들을 보여 준다.
여러 세션들이 접속된 상태에서 pfiles를 수행하면 데이터파일, 트레이스 로그, 트랜잭션 로그파일 외에도 통신 연결 목록까지 모두 보여 준다.
시스템 로그
기술 지원 시 간혹 외부에서 원인을 찾아보아야 할 경우 SUN은 /var/adm/messages.* 파일들을 확인하도록 한다. 파일의 확장자는 로그가 기록된 주를 의미하며 오늘을 포함한 주간의 로그는 messages 파일에 기록된다.
시스템 로그는 각 벤더의 전문가가 아닌 이상 명확하게 이해하기 어렵지만 장애 등으로 기술 지원을 할 때 특정 시각에 의미 있는 로그가 있다면 반드시 확인하도록 한다.
AIX
- AIX 5.1이전에서는 특정 명령어들은 지원되지 않을 수 있다.
ps
SUN의 prstat과 동일한 결과를 확인할 수 있다.
위 결과에서는 쓰레드가 사용하는 점유율은 CP 칼럼으로 확인하면 된다.
procstack
SUN의 pstack과 동일한 결과를 확인할 수 있다.
pstack의 결과를 해석하는 방법과 동일하게 쓰레드 별로 tid#을 기준으로 단락 단위로 분리하여 아래에서 위로 해석해 가도록 한다. 위 결과에서는 어떤 질의가 수행된 이후 결과에 대한 통신 쓰레드의 송신 부분이 기록되어 있음을 확인할 수 있다.
procfiles
SUN의 pfiles와 동일한 결과를 확인할 수 있다.
-n옵션을 써야 사용하는 파일명까지 확인할 수 있다.
시스템로그
운영 장비에 오류가 발생했는지 시스템 로그를 확인하기 위해 사용한다. 디스크 장치의 오류나 네트웍 장치의 오류 혹은 프로세스의 비정상적인 종료 등에 대한 로그를 확인할 수 있기 때문에 기술 지원 시 간혹 외부에서 원인을 찾아보아야 할 경우 반드시 시스템 로그를 확인하도록 해야 한다.
HP-UX
- HP CPU의 종류에 따라 PA-RISK/ITANIUM으로 분리되는데 PA-RISK장비에서 일부 명령어는 지원되지 않을 수 있다.
glance를 통한 Thread별 CPU 사용량
HP의 경우는 glance라는 모니터링 툴을 통해 쓰레드 별 CPU사용량을 확인할 수 있다.
pstack
SUN의 pstack과 동일한 결과를 보여준다.
lwpid가 쓰레드의 고유번호를 의미한다. 동일하게 lwpid로 단락을 구분하고 아래에서 위로 해석한다. 위의 경우는 이중화Sender Thread가 상대편과 연결하기 위한 동작을 보여 주고 있다.
pfiles
SUN의 pfiles와 동일한 결과를 보여 준다.
시스템 로그
HP에서 시스템 로그를 확인하기 위해 다음과 같이 확인한다.