Superkkt Blog

SystemTap

2009/09/23 15:28

SystemTap은 솔라리스에는 DTrace라는 이름으로 있는 기능과 비슷한 놈이다. 실시간으로 리눅스 커널을 모니터링 할 수 있는 기능을 가지고 있는데, 일종의 스크립트 언어처럼 사용하면 된다.

예를 들어서 어떤 프로세스가 어떤 네트웍 디바이스를 사용해서 몇 바이트의 패킷을 주고 받았는지 보고 싶다면, 대충 아래와 같이 SystemTap 스크립트를 만들어서 돌리면 된다.

#! /usr/bin/env stap
global ifxmit, ifrecv

probe netdev.transmit
{
  ifxmit[pid(), dev_name, execname(), uid()] <<< length
}

probe netdev.receive
{
  ifrecv[pid(), dev_name, execname(), uid()] <<< length
}

function print_activity()
{
  printf("%5s %5s %-7s %7s %7s %7s %7s %-15s\n",
  "PID", "UID", "DEV", "XMIT_PK", "RECV_PK",
  "XMIT_KB", "RECV_KB", "COMMAND")
  foreach ([pid, dev, exec, uid] in ifrecv-) {
  n_xmit = @count(ifxmit[pid, dev, exec, uid])
  n_recv = @count(ifrecv[pid, dev, exec, uid])
  printf("%5d %5d %-7s %7d %7d %7d %7d %-15s\n",
     pid, uid, dev, n_xmit, n_recv,
     n_xmit ? @sum(ifxmit[pid, dev, exec, uid])/1024 : 0,
     n_recv ? @sum(ifrecv[pid, dev, exec, uid])/1024 : 0,
     exec)
  }
  print("\n")
  delete ifxmit
  delete ifrecv
}

probe timer.ms(5000), end, error
{
  print_activity()
}

그럼 아래와 같은 결과를 얻을 수 있다.



그 외에도 다양한 시스템 정보를 얻을 수 있다. 특히 SystemTap은 직접 커널을 모니터링하기 때문에 원하는 정보를 아주 자세하게 얻을 수 있다는 장점이 있다.

참고로 우분투에서 설치할 때 여기에 있는 내용대로 하면 된다. 그런데 Interpid 이후 버전부터 linux-image-debug-generic metapackage가 제대로 설치되지 않는 버그가 있어서, systemtap이 정상적으로 작동하지 않는다. 따라서 설치안내 페이지에 있는대로 http://ddebs.ubuntu.com/pool/main/l/linux/ 사이트에서 본인이 사용하는 커널에 맞는 디버깅 이미지를 다운 받아서 dpkg로 설치해줘야 한다.

그런데 ddebs 사이트에는 현재 2.6.28-15.52 버전의 디버그 커널 이미지가 올라와 있는데,  Januty에 설치된 커널은 2.6.28-15.20이다. 그래서 systemtap이 커널과 디버그 커널의 버전이 다르다는 에러를 출력하면서 정상 작동이 안된다.

이럴 때는 /etc/apt/sources.list 파일에 아래 내용을 추가하고 업데이트 한 다음에 시냅틱으로 2.6.28-15.52 버전 커널을 설치한다.

# sudo vi /etc/apt/sources.list
... (생략)
...
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-proposed main restricted universe multiverse
deb http://ddebs.ubuntu.com jaunty-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com jaunty-security main restricted universe multiverse
deb http://ddebs.ubuntu.com jaunty-proposed main restricted universe multiverse

# sudo apt-get update

설치할 패키지는 linux-image-generic, linux-header-generic인데 버전이 2.6.28-15.52인지 확인하고 설치한다. 그리고 ddeb 사이트에서 디버그 커널 2.6.28-15.52 버전을 받아서 dpkg로 설치하고 리부팅하면 systemtap을 사용할 수 있다.
2009/09/23 15:28 2009/09/23 15:28

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment