最近、私は多くのプロセス/悪魔が不要な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);
}
PS:Brendan Greggの293と294ページBPFパフォーマンスツール