最近、多くのプロセス/デーモンが不要なfsync()
システムコールを発行し、システム全体の全体的なパフォーマンスを大幅に低下させる代わりに、安定性を少し高めていることに気付きました。この非協力的な行動を止めたいと思います。しかし、最初に私はどういうわけかそれらを見つける必要があります。
どういうわけか、特定のタイプのシステムコールに対して「モニター」を設定し、それを呼び出したプロセスのデータをログに記録できれば、最も理想的なことだと思います。
私の場合、いずれかのプロセスがfsync()
syscallを実行する場合、それを知りたいです。最も理想的には、syslogエントリ、またはdmesg
にある必要があります。
私はauditdについて少し読んだことがありますが、それが可能かどうかはわかりません。
最近のディストリビューションが使用されていると仮定すると、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
すべてのsync関連システムコールをログに記録するためのソース:
#!/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);
}
ブレンダン・グレッグの293ページと294ページからのPS BPFパフォーマンスツール