리눅스 통계(Accounting) 이용한 서버 시스템 모니터링 글쓴날 : 2000년 2월 글쓴이 : 문태준 (http://www.taejun.pe.kr, taejun@taejun.pe.kr, taejun@hitel.net) 참고자료 : System Performance Tunning (O'REILLY 출판사, 영문판) Chapter 2 Monitoring System Activity 중 Acoounting (92년도에 나온 책이지만 시스템 관리측면에서 많은 도움을 주는 책입니다) Essential System Administration (한빛미디어, 번역판) 16장 계정, 7장 시스템 자원관리 (유닉스 시스템 관리에 관련된 내용을 담고 있습니다. 내용은 괜찮은 편이지만 번역 자체가 깔끔하지는 않습니다) http://kldp.org/HOWTO/mini/Process-Accounting 리눅스에서 프로세스의 통계를 얻는 방법 (이 자료는 97년에 작성되었고 99년 2월에 다른 분이 번역한 내용입니다. 그렇지만 내용이 아주 간략해서 다른 자료를 같이 보아야 합니다) 0. 들어가기전에.. 본 문서는 위 자료를 참고로 리눅스에 맞게 적절하게 수정한 내용입니다. 현재 국내에서는 리눅스 관련 서버관리측면에서 자세한 내용을 설명한 자료가 부족하다고 생각이 됩니다. 이글이 실제 서버를 운영하고 관리하는 분들에게 도움이 되었으면 좋겠습니다. 물론 현재는 PC급 하드웨어의 성능이 워낙 빠르게 발전하고 있지만 서버관리자는 언제나 최악의 상황을 염두에 두고 시스템을 관리해야 할 것입니다. 일반적으로 Accounting을 통계로 번역하는것갈으므로 아래에서는 Accounting대신 통계라는 단어를 사용하겠습니다. 이 문서는 상업적인 목적이 아닌한 자유롭게 배포할 수 있습니다. 그렇지만 배포시에는 출처와 저자, 본 주의사항을 밝혀주어야 합니다. 또한 상업적으로 사용할 경우에는 본 저자의 동의를 얻어야 합니다. 1. 통계를 왜 사용하는가? 먼저 통계란 리눅스에서 수행된 명령들을 요약하고 기록하는 것입니다. 수행명령, 사용자, 소요된 CPU시간, 메모리, 디스크 I/O등을 분석하여 시스템운영 및 관리에 사용할 수 있습니다. 또한 시스템의 튜닝을 위해서는 가장 기본적인 작업이라고도 할 수 있습니다. 통계 시스템은 시스템의 중요한 정보를 쉽게 모을 수 있습니다. 시스템 성능에 관심을 가진다면 실제 시스템이 어떤 활동을 하는지에 대해서 알아야 합니다. 사용자가 어떤 프로그램을 돌리는가, 이러한 프로그램에서 시스템 시간을 얼마나 소비하는가, 일반적인 유틸리티가 얼마나 시스템 시간을 소비하는가, 어떤 사용자가 시스템의 자원을 적절하게 사용하는가 등등. 어떤 프로그램이 시스템의 시간과 메모리를 잡아먹는지 알았다면 이제 시스템 튜닝 전략을 세울 수 있겠지요. 내부용으로 프로그램을 개발했다면 개발자가 더 뛰어난 알고리즘을 가지고 프로그램을 설계하라고 할 수 있고, 메모리를 맣이 사용하는 프로그램이라면 메모리를 절약할 방법에 대해서 찾아보아야 할 것입니다. 디스크 I/O를 많이 사용하는 프로그램이라면 더 빠른 디스크를 장착할 수가 있을 것입니다. 시스템에 문제가 생기기전에 이러한 시스템 정보를 가지고 있다면 훨씬 수월하게 문제를 해결할 수 있습니다. 2. 리눅스용 통계 프로그램 구하고 기본 설정하기 현재 리눅스에서 통계 시스템은 BSD 스타일을 따르고 있습니다. System V 통계 시스템이 BSD에 비해 다양한 통계 자료를 제공하는것 같습니다. 이러한 통계기능은 리눅스 커널 수준에서 지원되어야하며 시스템 차원에서 제어를 지원해야 합니다. 리눅스의 경우는 커널 1.3.73이후 버전에서 이러한 기능을 지원한다고 합니다. 최근에 나온 레드햇 및 국내 배포판 등에서는 지원되는것으로 알고 있습니다. 만약 레드햇 호환 배포판을 사용하고 있다면 다음 rpm명령으로 확인하면 됩니다. (지금 이글을 보는 사람들이라면 아주 초보자는 아니라고 생각되기에 개별적인 명령어에 대한 설명은 생략합니다) # rpm -qa | grep psacct psacct-6.3-10 없다면 각 배포판 사이트를 통해서 쉽게 구할 수 있을 것입니다. 필자가 설치한 프로그램목록은 다음과 같습니다. # rpm -ql psacct /sbin/accton /usr/bin/ac /usr/bin/lastcomm /usr/info/accounting.info.gz /usr/man/man1/ac.1 /usr/man/man1/lastcomm.1 /usr/man/man8/accton.8 /usr/man/man8/sa.8 /usr/sbin/accton /usr/sbin/dump-acct /usr/sbin/dump-utmp /usr/sbin/sa /var/log/pacct /var/log/savacct /var/log/usracct 부팅하면서 통계 프로그램을 시작하려면 부팅 스크립트를 수정해야 합니다. 이건 /etc/rc.d/rc.sysinit에 다음과 같은 내용을 추가하면 됩니다. if [ -x /sbin/accton ]; then /sbin/accton /var/log/pacct echo "Process Accounting started ~~~~" fi 통계시스템은 accton 명령을 이용해 실행합니다. /var/log/pacct 파일은 rpm으로 설치하는 경우 자동으로 설치가 되지만 만약 자동으로 생기지 않는 경우 touch 명령 등으로 생성을 해 주어야합니다. 이 파일은 통계기록를 하는 파일이라고 생각하면 됩니다. ** 여기서 주의할 것은 /var/log 가 속한 파일 시스템이 95%이상 차면 통계시스템이 자동으로 멈춤니다. 이걸 명심하세요 pacct 파일은 계속 모든 것을 기록하니깐 금새 커지겠지요? 그러므로 주기적으로 sa -s 를 실행시키면 요약 파일인 /var/log/savacct 파일에 pacct의 내용을 압축해서 병합합니다. -s 옵션에 대해서는 뒤에서 sa의 옵션을 참고하세요. 3. sa 이용해 보고서 작성하기 통계 시스템이 작동되면 정기적으로 보고서를 만들기 이해 sa 유틸리티를 이용합니다. sa를 옵션없이 사용하면 시스템에서 실행되었던 모든 명령에 대한 요약내용을 출력합니다. 한번 볼까요? (근데 이건 예제로는 좀 맞지 않는것 같습니다만 이해해주세요...) # sa 75563 169479.02re 510.44cp 0avio 506k 14056 450.37re 448.85cp 0avio 497k webalizer 361 91931.12re 37.86cp 0avio 1355k httpd* 275 7.50re 5.38cp 0avio 402k gawk 14056 455.55re 4.95cp 0avio 438k weblog 14226 588.92re 2.57cp 0avio 437k sh 11 18.88re 2.45cp 0avio 332k slocate 162 670.85re 1.46cp 0avio 666k in.telnetd 2298 45.83re 1.09cp 0avio 2858k mysqld* 325 0.86re 0.76cp 0avio 642k ps 358 1185.61re 0.66cp 0avio 454k bash 1419 0.48re 0.47cp 0avio 283k rmmod 출력내용은 끝의 접미사로 구분을 합니다. none : 실행된 횟수. 가장 첫컬럼. re : 명령을 실행하는데 사용된 실제시간(분단위). 총경과시간. cp : 명령을 실행하는데 사용된 총 CPU시간(분단위), system + user time 기본적으로 CPU 시간을 기준으로 정렬합니다. avio : 실행시 평균 I/O 연산 횟수. k : 평균 물리적 메모리 사용량. (kilobytes 단위). 여기서 평균이란 프로그램의 CPU시간에 근거함. (퓍his average is the integral of physical memory used over time(storage interval), divided by the total CPU time.) none : 프로그램이름. 가장 마지막 컬럼. 출력내용에서 첫번째 줄은 실행된 모든 명령에 대한 것을 보여주지만 그다지 유용하지는 않을 것이다. 그 이후부터는 총 CPU 시간에 대해 정렬해서 보여준다. 총CPU 시간에서 실행된 횟수를 나누면 실행될때마다 CPU시간을 얼마나 썼는지 나오겠지요? 실행횟수가 100번이고 CPU 시간이 10000이면 한번에 100분의 CPU시간을 쓴 것이지요. 여기서 자세히 내용을 분석하면 어떤 것이 CPU 시간을 많이 사용하는지, I/O 연산을 많이 하는지, 메모리를 많이 쓰는지 나올 것입니다. NFS같은 대몬은 CPU시간도 많이 쓰겠지만 I/O 를 훨씬 많이 쓸 것입니다.(avio) 어떤 프로그램은 CPU시간을 적게 쓰더라도 아주 자주 실행될 수도 있습니다. 아주 자주 실행되는 프로그램은 메모리도 많이 쓰므로 메모리에 문제가 생길 수 있겠지요. 이막스등의 에디터는 실행시 CPU시간은 적게 사용하더라도 총경과시간은 엄청날 수 있겠지요. 왜냐면 프로그래머가 터미널앞에서 않아서 타이핑은 안치고 엄청나게 머리만 굴리면서 시간을 보낼 수도 있으니 깐요. gcc등 컴파일러의 경우는 CPU시간도 많이 쓰겠지만 I/O연산은 적을 것이고 메모리는 많이 필요할 것입니다. -d 옵션을 사용하면 avio(평균 i/o연산)를 기준으로 출력합니다. 그러면 어떤 프로그램이 I/O를 많이 사용하는지 볼 수 있을 것입니다. 당근 위에서 말한것처럼 NFS같은게 1등을 차지하겠지요. 이런 식으로 CPU 시간, 메모리, I/O를 많이 사용하는 대표적인 프로그램이 어떤 것인지 알아낼 수 있습니다. 이걸 가지고 파일시스템 설계를 다시 할 수도 있고 I/O를 많이 사용하는 프로그램에 I/O 자원을 더 줄 수도 있을 것입니다. 큐잉 시스템을 사용하는 경우 CPU 집약적인 작업과 I/O 집약적인 작업의 큐를 부리할 수 있을 것입니다. CPU와 메모리를 한번에 많이 사용하는 프로그램을 여러개 띄우지 않을 것입니다. I/O를 많이 사용하는 프로그램을 여러개 띄우지않도록 조심하게 될 것입니다. 그런데 CPU를 많이 사용하는 프로그램과 I/O를 많이 사용하는 프로그램을 동시에 띄우는것은 시스템에 미치는 영향이 다르기때문에 괜찮겠지요? 끝에 *가 붙은 것은 대몬 프로세스입니다. 대몬과 쉘같은 프로그램은 실제로 아무일도 하지 않더라도 총경과시간은 길 것입니다. 이러한 프로그램은 또한 CPU시간이 길어지겠지요. 이것때문에 sa 결과를 잘못 볼 위험도 생깁니다. 센드메일 예를 들어볼까요? 센드메일은 큰 용량의 메일큐를 처리하려면 메모리가 많이 필요합니다. 그렇지만 대몬으로 실행되기때문에 실제로 아무일도 하지 않더라도 CPU 시간은 커지고 이에 따라 평균메모리 사용량은 작게 나타납니다. 위에서 설명했듯이 평균 메모리 사용량이란게 CPU시간을 근거로 해서 계산하니깐요. 알고보면 무지 메모리 많이 쓰는 것인데요. /var/log/pacct 파일에 프로세스 통계가 기록이 됩니다. (이건 raw 파일이라고 생각하면 됩니다) sa -s 하면 현재의 기록을 /var/log/savacct 에 기록합니다. /var/log/usracct 파일은 사용자 id별로 통계기록을 보관합니다. 좀 헷갈리죠? 그러니깐 모든 기록을 pacct에 가지고 있다가 sa -s 하는 순간 명령어별로 관련된 기록은 savacct에, 사용자별로른 usracct에 기록을 하는 것입니다. sa 를 옵션없이 사용하면 처음부터 현재까지 전체 통계내용을 확인하는 것입니다. (이 부분이 처음에는 무지 헷갈릴 것입니다) sa 와 관련된 옵션은 man sa 하면 나옵니다. 주요한 몇가지만 소개합니다. -a : 모든 명령 -b : 평균 CPU 시간에 따라 정열 -> CPU많이 쓰는 놈을 잡아라(cp) -d : 평균 I/O 연산따라 정열 -> I/O많이 쓰는 놈(avio) -i : savacct 요약 파일을 생략. 이건 sa -s 한 이후의 통계를 보여줌. -k : 평균 메모리 사용량에 따라 정열 -> 메모리 많이 쓰는 놈(k) -l : 시스템 cpu 시간과 사용자 cpu 시간을 분리해서 보여줌. -m : 각 사용자에 따른 통계 -n : 실행숫자. 자주 실행된 놈 찾기 -s : 현재의 통계 기록을 savacct 파일에 병합하기 -t : CPU 시간 총경과시간(re) 4. 통계 자료 스크립트 아래 스크립트는 통계 자료를 자동으로 모으는 스크립트입니다. 이걸 매일마다 cron으로 돌려서 시스템을 분석하면 되겠지요. 이 스크립트는 자기의 필요에 맞게 고쳐서 사용하면 될 것입니다. #!/bin/sh # 기록할 파일명 file_name=`date +%Y%m%d` #file_name=`date +%Y%m%d-%H%M%S` # 시분초까지 기록할 경우 # sa 프로그램 경로 sa="/usr/sbin/sa" # 기록할 디릭토리명 recorddir=/var/log/acct # 기록할 디렉토리가 없을 경우 디렉토리 생성 if [ ! -d $recorddir ] ; then mkdir $recorddir fi # 디렉토리/파일명 지정 pathname=$recorddir/$file_name ############# 파일 기록 ######################## # 날짜 기록 년월일 date +%Y/%m/%d > $pathname # 하루간 기록(cron을 매일 돌릴 경우) echo "================================================================================= " >> $pathname echo " Day's Activity" >> $pathname echo "================================================================================= " >> $pathname $sa -i >> $pathname # 전체 기록 echo "================================================================================= " >> $pathname echo " Total's Activity" >> $pathname echo "================================================================================= " >> $pathname $sa >> $pathname # 사용자 기록 echo "================================================================================= " >> $pathname echo " User Activity" >> $pathname echo "================================================================================= " >> $pathname $sa -m >> $pathname # 현재의 통계 기록을 savacct 파일에 병합하기 $sa -s 5. ac 프로그램으로 사용자 연결시간 점검하기 ac 프로그램은 /var/log/wtmp 파일에서 사용자의 로그인, 로그아웃에 관련된 데이터를 이용해 연결 시간을 출력합니다. (시간단위) # ac total 26.84 주요한 옵션으로 -p와 -d가 있습니다. -p는 사용자별로 -d는 날짜별로 출력합니다. 두가지를 동시에 쓰면 날짜별, 사용자별로 분류해서 출력합니다. 개별 사용자들의 접속 시간을 24시간 단위로 보여주는데 전체 사용시간을 보는것은 그다지 의미가 없을것같네요. 이걸 이용하면 누가 가장 많이 시스템을 쓰는지 알 수 있겠지요? 참고로 사용자의 활동 상황을 추적할 수 있는 또 다른 프로그램으로는 last 와 lastcomm 등이 있습니다. last는 사용자가 로그인한 정보를 보여줍니다. 이또한 /var/log/wtmp 파일을 이용하지요. lastcomm은 위에서 설명한 패키지에 같이 포함이 되어있습니다. 이는 이전에 실행된 명령들에 관한 정보를 보여줍니다. 요 두가지 프로그램은 특정한 시기에 누가 로그인했는지 그리고 누가 프로그램을 실행했는지 알아내는데 도움을 줄 수 있습니다. 그렇지만 아주 정확히 찾아내기는 힘들겠죠? 6. 마치며 처음 말을 했던대로 최근 하드웨어가 워낙 빠르고 발전하고 성능이 뛰어나다보니 시스템 최적화에 대한 고민은 덜 수가 있을 것입니다. 또한 실제로 서버 최적화를 한다는게 말만큼 쉬운것은 아니고 차라리 하드웨어를 구입하는게 가장 쉬운 방법이겠지요. 그렇지만 현재의 시스템에서 최적의 성능을 내려고한다면 위의 내용들이 어느정도 도움을 줄 수는 있을 것이며 서버 관리자는 항상 서버의 상태에 대해서 관심을 가지고 있어야겠지요. 기계를 탓하기전에 얼마나 애정(?)을 가지고 관심있게 시스템을 관리했는지 생각합시다.