0

0

Linux如何查看系统调用频率_Linux syscount与eBPF工具使用【监控】

尼克

尼克

发布时间:2026-01-23 15:29:25

|

346人浏览过

|

来源于php中文网

原创

可借助eBPF工具实时观测系统调用频次:一、用syscount统计高频调用;二、用bpftrace自定义脚本精准过滤;三、用perf trace跟踪调用流;四、通过/proc接口辅助验证;五、用bpftool检查eBPF程序状态。

linux如何查看系统调用频率_linux syscount与ebpf工具使用【监控】

如果您需要实时了解Linux系统中各类系统调用被触发的频次,以便定位性能瓶颈或异常行为,则可借助基于eBPF的轻量级工具进行无侵入式观测。以下是使用syscount及其他eBPF工具查看系统调用频率的具体方法:

一、使用syscount工具统计系统调用频率

syscount是bpftrace工具集中的一个预置脚本,它通过eBPF在内核态捕获所有系统调用事件,并在用户态聚合计数,支持按调用名、进程名或PID维度输出高频调用列表。

1、确认系统已安装bpftrace及配套工具包,例如Ubuntu需执行sudo apt install bpftrace;CentOS/RHEL需启用epel源后安装bpftracekernel-devel匹配当前内核版本。

2、运行sudo /usr/share/bpftrace/tools/syscount,默认持续采样5秒并输出调用次数降序排列的前20个系统调用。

3、如需限定统计特定进程,添加-p PID参数,例如sudo /usr/share/bpftrace/tools/syscount -p 1234仅捕获PID为1234的进程所发起的系统调用。

4、若要观察调用延迟分布,可改用sudo /usr/share/bpftrace/tools/syscount -L启用延迟直方图模式,此时输出将包含微秒级延迟区间统计。

二、使用bpftrace自定义脚本精确过滤系统调用

当syscount默认输出无法满足特定分析需求时,可通过编写bpftrace单行脚本实现精准捕获,例如仅统计openat、read、write三类调用,并按进程名分组计数。

1、执行sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { if (comm == "nginx" && (pid == pid)) @counts[probe, comm] = count(); } interval:s:5 { exit(); }',该命令将捕获所有以sys_enter_开头的tracepoint事件,并对nginx进程的调用进行计数。

2、若需聚焦某几个系统调用,替换通配符为具体名称:使用tracepoint:syscalls:sys_enter_openattracepoint:syscalls:sys_enter_readtracepoint:syscalls:sys_enter_write并用逗号连接。

3、在聚合语句中使用@counts[comm, probe]实现按进程名与调用名双重分组,避免不同进程间计数混叠。

4、添加printf("Top syscalls for %s:\n", comm)于interval块内可格式化输出头部信息,增强结果可读性。

三、利用perf trace实时跟踪系统调用流

perf trace是Linux内核自带的性能分析工具,不依赖eBPF,直接基于perf_events子系统捕获系统调用入口与返回事件,适合快速验证或低版本内核环境。

1、运行sudo perf trace -e 'syscalls:sys_enter_*' -a sleep 3,全局捕获所有进程3秒内的系统调用进入事件。

2、若仅关注某用户空间进程,先获取其PID,再执行sudo perf trace -p PID -e 'syscalls:sys_enter_*',此时输出包含时间戳、PID、TID、系统调用名及参数值。

Asksia
Asksia

Asksia AI - 最好的AI老师,可靠的作业助手

下载

3、添加--call-graph dwarf参数可同时采集调用,用于判断某系统调用是否由特定函数路径触发。

4、使用perf script导出原始事件流至文件,再配合awk脚本按syscall name字段统计频次,命令为awk '{print $4}' perf.data.script | sort | uniq -c | sort -nr | head -20

四、通过/proc/PID/status与/proc/PID/syscall接口辅助验证

/proc文件系统提供进程级系统调用计数快照,虽非实时流式数据,但可用于交叉比对eBPF工具结果或检查长期累积趋势。

1、查找目标进程PID,例如执行pgrep -f "python app.py"获取Python应用PID。

2、读取/proc/PID/statusvoluntary_ctxt_switchesnonvoluntary_ctxt_switches字段,间接反映因系统调用阻塞导致的上下文切换频次。

3、检查/proc/PID/syscall文件,其第三列显示当前正在执行的系统调用编号(若进程处于系统调用中),结合cat /usr/include/asm-generic/unistd_64.h可查证编号对应调用名。

4、对多个PID批量采集时,可用shell循环遍历/proc/[0-9]*/status,提取syscr(系统调用完成次数)与syscw(写系统调用次数)字段并累加,生成全系统粗粒度统计。

五、部署bpftool检查eBPF程序运行状态

当syscount或自定义bpftrace脚本未输出预期结果时,需确认eBPF程序是否成功加载并持续运行,bpftool可列出当前内核中所有活跃的eBPF程序及其附着点信息。

1、执行sudo bpftool prog list,筛选输出中含tracepoint/syscalls/kprobe/sys_call_table字样的条目,确认相关程序处于RUNNING状态。

2、若发现程序状态为DEAD或MISSING,说明加载失败或已被卸载,需检查dmesg日志:dmesg | tail -20,重点关注bpf:前缀报错,常见原因包括invalid bpf programpermission denied

3、使用sudo bpftool map dump id MAP_ID(MAP_ID从prog list中获取)可导出指定映射表内容,验证计数器是否真实更新,例如syscount使用的哈希表键为syscall号,值为计数。

4、对长时间运行的监控任务,建议将bpftrace命令置于systemd服务中,并配置Restart=alwaysRestartSec=10,防止因临时错误退出导致监控中断。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

663

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

765

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1385

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

570

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

751

2023.08.11

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号