最近,我发现许多进程/守护进程都喜欢发出不必要的fsync()
syscall,从而以大大降低整个系统的总体性能为代价,提高了它们的稳定性。我想停止这种不合作的行为。但是,首先,我需要以某种方式找到它们。
我认为,最理想的方法是,如果我能以某种方式为特定类型的系统调用设置一个“监视器”,并记录调用它的进程的数据。
就我而言,如果有任何进程执行fsync()
系统调用,我想知道。最理想的情况是,它应该是syslog条目,或者在中dmesg
。
我已经阅读了一些有关Audited的内容,但是我不确定是否可以做到这一点。
假设正在使用最近的发行版,则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)变体:sync(2),syncfs(2),fsync(2),fdatasync(2),sync_file_range(2)和msync(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的BPF性能工具的第293页和第294页的PS
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句