特定のシステムコールを実行したプロセスを記録する方法は?

特定のシステムコールを実行したプロセスを記録する方法は?

最近、私は多くのプロセス/悪魔が不要な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パフォーマンスツール

答え2

許可された回答に加えて審査@Gillesがコメントで述べたように実行できます。

Auditd は次のように制御できます。監査管理命令、そして

auditctl -S fsync,fdatasync,...

記録されたシステムコールを目的のコールに制限します。

関連情報