특정 시스템 호출을 수행한 프로세스를 기록하는 방법은 무엇입니까?

특정 시스템 호출을 수행한 프로세스를 기록하는 방법은 무엇입니까?

최근에 나는 많은 프로세스/악마가 불필요한 fsync()시스템 호출을 발행하여 안정성을 약간 높이지만 전체 시스템의 전반적인 성능을 크게 저하시키는 대가를 치르는 것을 발견했습니다. 나는 이런 비협조적인 행동을 멈추고 싶다. 하지만 먼저 어떻게든 찾아야 합니다.

내 생각에 이상적인 것은 특정 유형의 시스템 호출에 대한 "모니터"를 설정하고 이를 호출하는 프로세스의 데이터를 기록할 수 있는 것입니다.

내 경우에는 어떤 프로세스가 fsync()시스템 콜을 수행하는지 알고 싶다. 이상적으로는 syslog 항목이거나 dmesg.

auditd에 대한 내용을 읽었지만 이것이 가능한지 확실하지 않습니다.

답변1

최신 배포판을 사용한다고 가정하면 이는 bpftrace정말 편리합니다. 이를 위해서는 Debian 10에서 설치해야 합니다:

apt install bpftrace

그런 다음 synsnoop.bt,를 사용하여 시스템 전체에서 *sync 관련 시스템 호출을 수신합니다.

# syncsnoop.bt
Attaching 7 probes...
Tracing sync syscalls... Hit Ctrl-C to end.
TIME      PID    COMM             EVENT
03:15:35  443    dhclient         tracepoint:syscalls:sys_enter_fsync
^C

이 도구는 sync(2), syncfs(2), fsync(2), fdatasync(2), sync_file_range(2) 및 msync(2) 추적점을 통해 sync(2) 변형을 추적하여 작동합니다. sync(2) 속도는 일반적으로 매우 드물기 때문에 이 도구의 오버헤드는 무시할 수 있을 것으로 예상됩니다.

또는 bpftrace스크립팅 언어를 사용하십시오.

# ./sync.bt 
Attaching 7 probes...
Tracing sync syscalls... Hit Ctrl-C to end.
TIME      PID    COMM             EVENT
08:09:53 443    dhclient         tracepoint:syscalls:sys_enter_fsync
^C

sync.bt모든 소스 기록동기화관련 시스템 호출:

#!/usr/bin/bpftrace
BEGIN {
  printf("Tracing sync syscalls... Hit Ctrl-C to end.\n"); 
  printf("%-9s %-6s %-16s %s\n", "TIME", "PID", "COMM", "EVENT");
}

tracepoint:syscalls:sys_enter_sync, 
tracepoint:syscalls:sys_enter_syncfs, 
tracepoint:syscalls:sys_enter_fsync, 
tracepoint:syscalls:sys_enter_fdatasync, 
tracepoint:syscalls:sys_enter_sync_file_range, 
tracepoint:syscalls:sys_enter_msync
{
  time("%H:%M:%S ");
  printf("%-6d %-16s %s\n", pid, comm, probe);
}

추신: Brendan Gregg의 293 및 294페이지BPF 성능 도구

답변2

허용되는 답변 외에도심사@Gilles가 의견에서 언급했듯이 수행할 수 있습니다.

Auditd는 다음을 통해 제어할 수 있습니다.감사 통제명령, 그리고

auditctl -S fsync,fdatasync,...

기록된 시스템 호출을 원하는 호출로 제한합니다.

관련 정보