如何记录特定的系统调用执行了哪些进程?

彼得

最近,我发现许多进程/守护进程都喜欢发出不必要的fsync()syscall,从而以大大降低整个系统的总体性能为代价,提高了它们的稳定性。我想停止这种不合作的行为。但是,首先,我需要以某种方式找到它们。

我认为,最理想的方法是,如果我能以某种方式为特定类型的系统调用设置一个“监视器”,并记录调用它的进程的数据。

就我而言,如果有任何进程执行fsync()系统调用,我想知道。最理想的情况是,它应该是syslog条目,或者在中dmesg

我已经阅读了一些有关Audited的内容,但是我不确定是否可以做到这一点。

瑞·里贝罗(Rui F Ribeiro)

假设正在使用最近的发行版,则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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Linux内核如何知道哪个进程进行了系统调用?

如何查看当前由进程执行的系统调用?

linux如何识别特定文件系统以执行系统调用

系统调用如何执行

防止进程执行某些系统调用

如何检测在CPU上执行了哪些指令?

SQL Server:如何查找执行了哪些行

如何判断执行了哪些python源文件?

我们如何检测哪些用户在GCS(Google云存储)中执行了哪些操作?

如何在系统调用中终止进程?

确保在RCU关键部分中执行了系统调用中的UID / GID检查

打开应用程序时,我如何知道执行了哪些文件?

如何显示特定进程正在使用哪些内核?

如何执行程序或调用系统命令?

如何执行程序或调用系统命令?

您如何找出哪些寄存器用于系统调用?

如何获取调用系统功能的程序的进程ID

系统调用返回值如何传递回用户进程?

操作系统如何知道哪个进程正在调用函数?

如何记录特定用户执行的查询

我如何在Linux操作系统上使用clock_getttime()在C中以纳秒为单位记录进程执行时间?

如何知道在处理单个记录时是否进行了“包含”调用?

Kotlin中的main()函数之前执行了哪些指令?

如何确定哪些行代码参与了Java程序的特定执行?

如何确定在基于GNU / Linux的系统中哪些进程正在访问硬盘?

如果内核在处理系统调用时可以休眠,执行如何返回系统调用?

Evenlet信号量,如何限制对特定子进程的调用?

哪些系统调用可以创建新流程?

铛:如何检查是否执行了LTO