在实时环境中监控进程系统调用

Posted

技术标签:

【中文标题】在实时环境中监控进程系统调用【英文标题】:Monitoring Process Syscalls in Live Environment 【发布时间】:2020-06-07 14:41:42 【问题描述】:

我从事一个项目已经有一段时间了,第一步是为进程构建一个系统调用跟踪库。从本质上讲,我想要做的是有一个系统,其中每次进程通过系统调用请求操作系统服务时,事件的相关信息(调用进程、时间、系统调用名称)都会记录到文件中。

从理论上讲,这听起来很简单,但是随着时间的推移,实现它变得越来越痛苦。我想给我造成问题的主要原因是普遍不知道从哪里开始实施。

最初,我认为这可以通过在内核入口点添加几行代码来解决,但是在研究了 entry_64.S 一段时间后,我得出结论,必须有一个更简单的方法.我的下一个想法是用我自己的服务覆盖 sys_call_table 指向的所有服务,该服务进行日志记录,然后调用原始服务。但是,事实证明,由于 sys_call_table 不再被导出,这种方法在 linux 内核 5.4.18 中存在一些困难。而且,即使在重新编译内核以导出 sys_call_table 时,该表也位于内存受保护的位置。最后,我一直在尝试使用 auditd。具体来说,我关注了this link,但它似乎不起作用(当我执行 kill 命令时,ausearch 中只有大约 50% 的时间基于时间戳的相应结果)。

所有这些死胡同让我有点筋疲力尽,我真的希望最终能够启动并运行我的项目的第一阶段。有人对我应该尝试什么有任何指示吗?

解决方案:BPFTrace 正是我想要的。

【问题讨论】:

您的目标是自己编写这个工具,还是只是想要一些方法来监控系统调用?如果是后者,那么已经有工具可以做到这一点,例如ftracesystem tap。即使你想重新发明工具,你也可以考虑看看那些现有的工具是如何完成任务的。 谢谢,我会调查这些的。 我的目标只是收集每个进程系统调用跟踪的 dara。理想的工具将为任何运行的进程收集。我宁愿自己不编写工具。 【参考方案1】:

我使用 BPFTrace 记录每次内核开始执行系统调用(不包括那些由 BPFTrace 本身发起的调用)

【讨论】:

以上是关于在实时环境中监控进程系统调用的主要内容,如果未能解决你的问题,请参考以下文章

性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程

Linux命令之实时监控系统进程状态top

Centos-实时监控系统处理器状态-top

业务实时监控服务概述

linux系统下实时监控进程以及定位杀死挂起的进程

进程监控工具strace