web-dev-qa-db-ja.com

ログに記録する方法、特定のシステムコールを行ったプロセスはどれですか?

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

2
Rui F Ribeiro

@Gillesがコメントで述べたように、受け入れられた答えに加えて、 auditd もそれを行うことができます。

Auditdは、 auditctl コマンド、および

auditctl -S fsync,fdatasync,...

ログに記録されたシステムコールを必要なものに制限します。