최근에 나는 많은 프로세스/악마가 불필요한 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 성능 도구