검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 쉘 스크립트
가끔 스크립트에서 CPU 사용률을 구해야 할 때가 있습니다. 예를 들어 CPU 사용률을 측정하기 위한 Nagios 플러그인 같은 걸 만들어야 할 때가 있죠. 그럴 때 유용하게 쓸 수 있는 간단한 스크립트입니다.
#!/bin/bash

$INTERVAL_SEC=1
$NUM_REPORT=3

CPU_REPORT=`vmstat -n $INTERVAL_SEC $NUM_REPORT | tail -$NUM_REPORT | awk 'BEGIN{USER=0;SYS=0;WAIT=0;IDLE=0} {USER=USER+$13;SYS=SYS+$14;WAIT=WAIT+$16;IDLE=IDLE+$15} END{print USER/'$NUM_REPORT'" "SYS/'$NUM_REPORT'" "WAIT/'$NUM_REPORT'" "IDLE/'$NUM_REPORT'}'`

CPU_USER=`echo $CPU_REPORT | awk '{ print $1 }' | cut -d "." -f 1`
CPU_SYSTEM=`echo $CPU_REPORT | awk '{ print $2 }' | cut -d "." -f 1`
CPU_IOWAIT=`echo $CPU_REPORT | awk '{ print $3 }' | cut -d "." -f 1`
CPU_IDLE=`echo $CPU_REPORT | awk '{ print $4 }' | cut -d "." -f 1`
  INTERVAL_SEC는 조사 시간 간격이고 NUM_REPORT는 조사 횟수입니다. 즉, 디폴트 값으로 1초당 1번씩 총 3번 사용률을 구한 후 평균값을 구하는 겁니다. 결과로 얻을 수 있는 정보는 사용자, 시스템, 입출력에 의한 CPU 사용률과 IDLE입니다. 사실 훨씬 간단하게 구할 수도 있지만 다수의 결과에서 평균값을 구하는 것이 더 정확한 것으로 보여 이렇게 작성했습니다.

  참고로 밑에 cut을 이용해 소수점 이하의 값을 잘라버린 이유는 나중에 스크립트 내에서 if 문을 통해 비교를 할 경우 정수가 필요하기 때문입니다. 따라서 그냥 출력만 하려고 할 경우 해당 부분은 없어도 됩니다. 하지만 그럴 경우 '1.33333' 같이 나눠 떨어지지 않는 값이 나올 수도 있으므로 결국 그에 대한 적절한 처리가 필요할 것입니다.

  만약 리눅스가 아닌 유닉스에서 사용하려면 USER, SYS, WAIT, IDLE이 있는 위치(차례대로 각각 $13, $14, $16, $15)를 해당 OS의 vmstat 출력 결과에 맞게 수정해야 합니다. 또한 vmstat 명령어의 옵션을 약간 수정해야 할 수도 있습니다.

2011/07/15 14:48 2011/07/15 14:48
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Using Taskset for Priority Tasks
관련 글 : cpulimit - CPU 점유율 제한 프로그램과 응용 스크립트

  이전에 CPU 사용률을 제한하는 것과 관련된 포스팅했었는데 이번에는 멀티프로세서(멀티 코어 포함) 시스템에서 특정 CPU(들)에 작업을 할당하는 것과 관련된 포스팅입니다. taskset 명령어를 사용하면 특정 프로세스를 특정 CPU에 할당할 수 있습니다. 아래는 구글 크롬 웹 브라우저를 하나의 CPU(정확히는 0번 CPU)만 사용하도록 실행하는 모습입니다.
taskset 0x00000001 google-chrome
  그리고 아래는 이미 실행 중인 크롬 프로세스에 대해 동일한 명령을 내리는 모습입니다.
taskset -p 0x00000001 크롬의_PID
  위의 명령어로 인해 크롬은 하나의 CPU(0x00000001은 CPU 0번에 대한 mask)만 사용하게 됩니다. 만약 2개의 CPU(정확히는 0번과 1번 CPU)를 사용하게 하고 싶다면 0x00000003(2진수로 '11')을 쓰면 됩니다. mask를 2진수로 고쳤을 때 가장 오른쪽이 0번 CPU를 뜻하고 왼쪽으로 가면서 CPU 번호가 하나씩 증가합니다.

  직접 마스크 값을 입력하는 방법 대신 -c 옵션과 함께 CPU의 번호(개수가 아님)를 콤마와 함께 나열(예: -c 0,1,3)하거나 범위(예: -c 0-3)로 쓰거나 둘을 혼합(예: -c 0,2-3)해서 사용할 CPU를 지정할 수도 있습니다.

  특정 프로세스가 어떤 CPU를 사용하는지 보려면 -p 옵션과 함께 대상 프로세스의 PID를 적습니다.
$ taskset -p 19992
pid 19992's current affinity mask: f
  위의 결과를 보면 해당 프로세스가 사용하는 CPU의 마스크 값이 f인데 이것은 0번~3번까지 총 4개의 CPU를 사용하고 있다는 뜻입니다. f를 2진수로 바꾸면 '1111'이며 이것이 "mask"라는 것을 생각하면 왜 f가 CPU 4개를 뜻하는지 알 수 있습니다.

  참고로 위 명령어를 실행한 시스템은 하나의 물리적인 프로세서에 2개의 코어가 있으며 하이퍼쓰레딩이 작동중이기 때문에 논리적으로 총 4개의 프로세서가 존재합니다. taskset으로 프로세스가 사용할 CPU를 별도로 지정하지 않는다면 기본적으로 저렇게 모든 CPU를 사용하게 됩니다. 그러므로 만약 논리적으로 2개의 코어가 있었다면 위에서 f가 아닌 3이 출력됩니다.

2010/12/15 17:37 2010/12/15 17:37
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : How to Limit The CPU Usage of Any Process in Linux
cpulimit 홈페이지 : http://cpulimit.sourceforge.net/

  cpulimit은 하나의 프로세서가 점유할 수 있는 최대 CPU 사용량을 제한하는 프로그램입니다. 아주 가끔가다가 이런 프로그램이 필요한 경우들이 있죠. 기본적으로 어느 배포판이든 사용 가능합니다. 우분투에서는 아래의 명렁어로 설치가 가능합니다.
sudo apt-get install cpulimit
  사용법도 정말 간단합니다. 제한하려는 프로세스의 PID를 찾고 최대 허용할 CPU 사용량을 정한 다음에 아래와 같은 명령어로 제한할 수 있습니다.
sudo cpulimit -p PID -l CPU
  PID에는 프로세스의 PID, CPU에는 제한할 백분률을 정수로 쓰면 됩니다.


  그리고 우분투 포럼에서 abcuser라는 사람이 이 프로그램을 활용하여 '프로세스들의 CPU 점유율을 모니터링하다가 특정 CPU 점유율을 넘는 프로세스를 감지하면 해당 프로세스를 제한 조치'하는 알흠다운 스크립트를 만들었다고 합니다. 스크립트에서 위의 cpulimit과 gawk를 사용한다고 하니 gawk도 깔아버립시다.
sudo apt-get install gawk
  스크립트는 여기서 받으시거나 위의 포럼 포스트에서 복사하시기 바랍니다. 스크립트는 총 2개로 프로세스들의 CPU 점유율을 감시하고 제한하는 cpulimit_daemon.sh와 시작과 종료를 제어하기 위해 /etc/init.d/ 디렉토리 안에 넣을 cpulimit 파일들로 구성되어 있습니다. cpulimit_daemon.sh 스크립트 내에는 아래의 4개 변수가 있습니다.
  • CPU_LIMIT : 각 프로그램의 최대 CPU 점유율입니다. 디폴트 값은 20(%)입니다.
  • DAEMON_INTERVAL : 스크립트가 시스템을 체크하는 시간 간격입니다. 디폴트 값은 3(초)입니다.
  • BLACK_PROCESSES_LIST : 이 변수에 있는 프로세스만 CPU 점유율을 제한합니다. 디폴트 값은 비어 있으며 그 경우 CPU_LIMIT에서 설정한 점유율을 넘기는 모든 프로세스에 대해 제한합니다. 여러 프로세스를 지정할 때는 파이프(|)를 구분자로 사용합니다.(예: mysql|firefox|gedit)
  • WHITE_PROCESSES_LIST : 이 변수에 있는 프로세스를 제외한 모든 프로세스의 CPU 점유율을 제한합니다. 위와 마찬가지로 디폴트 값은 비어 있으며 그 경우 위와 마찬가지로 CPU_LIMIT에서 설정한 점유율을 넘기는 모든 프로세스에 대해 제한합니다. 마찬가지로 여러 프로세스를 지정할 때는 파이프(|)를 구분자로 사용합니다.(예: mysql|firefox|gedit)
  참고로 BLACK_PROCESSES_LIST와 WHITE_PROCESSES_LIST를 모두 사용할 수는 없으며 둘 중 하나는 비어있어야 합니다.

  이제 설정이 끝났으면 설치 작업에 들어갑니다. 먼저 cpulimit_daemon.sh 스크립트 파일을 /usr/bin/ 디렉토리에 넣고 실행이 가능하도록 퍼미션을 변경합니다.
sudo mv ~/cpulimit/cpulimit_daemon.sh /usr/bin
sudo chown root:root /usr/bin/cpulimit_daemon.sh
sudo chmod 700 /usr/bin/cpulimit_daemon.sh
  그리고 cpulimit 스크립트 파일을 /etc/init.d/ 디렉토리에 넣고 오너와 퍼미션을 변경한 후 부팅 시 자동으로 실행하도록 만듭니다.
sudo mv ~/cpulimit/cpulimit /etc/init.d/
sudo chown root:root /etc/init.d/cpulimit
sudo chmod 700 /etc/init.d/cpulimit
sudo update-rc.d cpulimit defaults
  이제 아래의 명령어들을 통해 서비스를 제어할 수 있습니다.
sudo service cpulimit status   # cpulimit 데몬의 실행 여부 확인
sudo service cpulimit start    # cpulimit 데몬 실행
sudo service cpulimit stop     # cpulimit 데몬 종료

  마지막으로 지금까지 설치한 스크립트들은 아래의 명령어들을 통해 삭제할 수 있습니다.
sudo service cpulimit stop           # 삭제 전 cpulimit 데몬 중지
sudo update-rc.d -f cpulimit remove  # 심볼릭 링크 삭제
sudo rm /etc/init.d/cpulimit         # 데몬 제어 스크립트 삭제
sudo rm /usr/bin/cpulimit_daemon.sh  # 데몬 스크립트 삭제
  만약 cpulimit 프로그램과 gawk 프로그램까지 삭제하려면 아래의 명령어들을 실행합니다.
sudo apt-get remove cpulimit
sudo apt-get remove gawk
2010/10/30 16:04 2010/10/30 16:04