FreeBSD에서 IO 작업을 검사/가로채는 방법이 있는지 궁금합니다. ktrace와 비슷하지만 프로세스를 모르는 경우(예: 시간이 좀 걸립니다).
답변1
모니터링 및 성능 분석을 위해 다음과 같은 매우 강력한 반 프로그래밍 가능 도구가 있습니다.길.
dtrace를 사용하면 필요한 시스템 호출을 추적할 수 있는 명령줄이나 애플릿 프로그램을 작성할 수 있습니다.
다소 강력하고 복잡합니다. 매우 흥미로운 책을 포함하여 몇 가지 예를 찾을 수 있습니다.시스템 성능: 엔터프라이즈 및 클라우드
~에서DTrace 도구 페이지:
동적 추적 구현인 DTrace는 다양한 운영 체제(Solaris, Mac OS X, FreeBSD...)에서 사용할 수 있습니다. DTrace는 이전에는 어렵거나 접근할 수 없었던 수준으로 애플리케이션 및 시스템 내부에 대한 새로운 세부 보기를 제공하여 서버 문제를 해결하는 데 도움을 줍니다. DTrace 스크립트 작성을 위해 C 및 awk와 유사한 이벤트 기반 언어를 제공합니다.
# Files opened by process: dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' # Read bytes by process: dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }' # Write bytes by process: dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }' # Read size distribution by process: dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }' # Write size distribution by process: dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }'
답변2
다른 답변에서 언급했듯이 시스템 활동을 추적하는 강력한 도구인 DTrace를 이 작업에 사용할 수도 있습니다.
일부 Dtrace 스크립트는 이식 가능하지만 많은 스크립트는 운영 체제별로 다릅니다. 많은 유용한 스크립트를 다음에서 사용할 수 있습니다.추적 툴킷, 그러나 rwsnoot 및 opensnoop은 아직 FreeBSD에서 작동하지 않습니다.
공개 시스템 호출을 모니터링하려면 다음 스크립트를 사용할 수 있습니다.
#!/usr/sbin/dtrace -s
dtrace:::BEGIN
{
printf("%5s %5s %s","UID","PID", "Command Path");
}
syscall::open*:entry
{
printf("%5d %5d %s %s", uid, pid, execname,
probefunc == "open" ? copyinstr(arg0) : copyinstr(arg1));
}
간단하지만 그다지 유용하지는 않은 읽기/쓰기 스크립트
#!/usr/sbin/dtrace -s
syscall::*read:entry,
syscall::*write:entry
{
printf("%5d %s CALL %s(%d, .., %d)", pid, execname, probefunc, arg0, arg2);
self->fd = arg0;
}
syscall::*readv:entry,
syscall::*writev:entry
{
printf("%5d %s CALL %s(%d, ...)", pid, execname, probefunc, arg0);
}
syscall::*read*:return
{
printf("%5d %s fd %d read %d bytes", pid, execname, self->fd, arg0);
self->fd = 0;
}
syscall::*write*:return
{
printf("%5d %s fd %d wrote %d bytes", pid, execname, self->fd, arg0);
self->fd = 0;
}
필터가 필요할 수도 있습니다. 예를 들어 dtrace 자체를 추적하지 마세요.
syscall::foobar:entry
/execname != "dtrace"/
{
...
}
답변3
개인적으로 저는 top -m io
.