예를 들어서 어떤 프로세스가 어떤 네트웍 디바이스를 사용해서 몇 바이트의 패킷을 주고 받았는지 보고 싶다면, 대충 아래와 같이 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()
}
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
... (생략)
...
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을 사용할 수 있다.

comments
comments rss (+댓글 쓰러가기)