内核bpf的实现原理

bpftrace能帮我们干什么?1、统计 tcp连接的生命时长、2、统计mysql执行一条sql语句的时间3、统计redis执行命令的时间、 4、对文件进行一次读或者写的时间。

常用命令:

bpftrace -e 'Begin { printf("hello\n"); }'

bpftrace -l '*enter_accept*'

bpftrace -e 'tracepoint:syscalls:sys_enter_accept{ printf("accept\n"); }'

bpftrace -e 'tracepoint:syscalls:sys_enter_accept{ printf("accept %s\n", comm); }'

bpftrace -e 'tracepoint:syscalls:sys_enter_accept / comm == "networkio" / { printf("accept %s\n", comm); }'

bpftrace -e 't:syscalls:sys_enter_connect { printf("connect\n"); }'

Bpftrace -e 'kprobe:tcp_connect {printf("tcp_connect \n"); }'

bpftrace实现:获取到每一个连接的源IP、源端口、目的ip、目的端口 。执行方式bpftrace tcp_connect.bt

#include <net/sock.h>
#include <linux/socket.h>BEGIN
{printf("Enter tcp_connect Case \n");printf("%8s %6s %16s", "TIME", "PID", "COMM");printf("%19s:%5s  %16s:%5s\n", "SADDR", "SPORT", "DADDR", "DPORT");
}kprobe:tcp_connect 
{$sk = (struct sock*)arg0;$inet_family = $sk->__sk_common.skc_family;if ($inet_family == AF_INET) {$daddr = ntop($sk->__sk_common.skc_daddr);$saddr = ntop($sk->__sk_common.skc_rcv_saddr);}$dport = $sk->__sk_common.skc_dport;$lport = $sk->__sk_common.skc_num;$dport = bswap($dport);time("%H:%M:%S ");printf("%6d %16s", pid, comm);printf("%19s:%5d  %16s:%5d\n", $saddr, $lport, $daddr, $dport);}END
{printf("Exit tcp_connect Case \n");
}

tcp_accept.bt

#include <net/sock.h>
#include <linux/socket.h>BEGIN
{printf("%8s %6s %16s", "TIME", "PID", "COMM");printf("%19s:%5s  %16s:%5s\n", "SADDR", "SPORT", "DADDR", "DPORT");
}kretprobe:inet_csk_accept 
{$sk = (struct sock*)retval;$inet_family = $sk->__sk_common.skc_family;if ($inet_family == AF_INET) {$daddr = ntop($sk->__sk_common.skc_daddr);$saddr = ntop($sk->__sk_common.skc_rcv_saddr);}$dport = $sk->__sk_common.skc_dport;$lport = $sk->__sk_common.skc_num;$dport = bswap($dport);time("%H:%M:%S ");printf("%6d %16s", pid, comm);printf("%19s:%5d  %16s:%5d\n", $saddr, $lport, $daddr, $dport);        }END
{printf("END\n");
}

tcp_life.bt tcp统计生命周期

#include <net/sock.h>
#include <linux/socket.h>BEGIN
{printf("%8s %6s %16s", "TIME", "PID", "COMM");printf("%19s:%5s  %16s:%5s %s\n", "SADDR", "SPORT", "DADDR", "DPORT", "DURms");
}kprobe:tcp_set_state
{$sk = (struct sock*)arg0;$newstate = arg1;if ($newstate <= TCP_SYN_RECV) { // begin@birth[$sk] = nsecs;}if ($newstate == TCP_CLOSE ) { // end$dur = (nsecs - @birth[$sk]) / 1e6;$inet_family = $sk->__sk_common.skc_family;if ($inet_family == AF_INET) {$daddr = ntop($sk->__sk_common.skc_daddr);$saddr = ntop($sk->__sk_common.skc_rcv_saddr);}$dport = $sk->__sk_common.skc_dport;$lport = $sk->__sk_common.skc_num;$dport = bswap($dport);time("%H:%M:%S ");printf("%6d %16s", pid, comm);printf("%19s:%5d  %16s:%5d %d\n", $saddr, $lport, $daddr, $dport, $dur);     }
}END
{printf("END\n");
}

nginx.bt

BEGIN
{printf("NGINX\n");
}uprobe:/usr/local/nginx/sbin/nginx:ngx_close_connection 
{printf("ngx_close_connection\n");
}END
{printf("Exit\n");
}

redis.bt

BEGIN
{}uprobe:/home/king/share/redis-7.4.0/src/redis-server:call 
{printf("redis --> call\n");
}END
{}

mysqld.bt

BEGIN
{printf("Tracing MySQL Server\n");printf("%10s %6s %s\n", "TIME(ns)", "PID", "SQL");
}uprobe:/usr/sbin/mysqld:*dispatch_command*
{@start = nsecs;
}uprobe:/usr/sbin/mysqld:*dispatch_command*
/@start/
{$dur = nsecs - @start;printf("%10u %6d %s\n", $dur, pid, str(*arg1));
}END
{printf("Exit\n");
}

malloc.bt

BEGIN
{printf("%10s %16s %s\n", "TYPE", "NAME", "PID");
}uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc
/ comm == "King" /
{printf("%10s %16s %d\n", "malloc", comm, pid);
}uprobe:/lib/x86_64-linux-gnu/libc.so.6:free
/ comm == "King"/
{        printf("%10s %16s %d\n", "free", comm, pid);
}END
{printf("Exit\n");
}

ntyco.bt

BEGIN
{printf("Tracing NtyCo\n");
}
// 挂载到可执行程序里,具体函数
uprobe:/home/king/share/2404/7.2.1-bpf/NtyCo/nty_server:nty_coroutine_create
{printf("name: %s, pid: %d\n", comm, pid);
}END
{printf("Exit\n");
}

参考连接:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90064.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端npm配置Nexus为基础仓库

步骤&#xff1a; 一、Nexus仓库配置 新增npm仓库,具体详解见 Nexus私有仓库配置&#xff0c;解释 注&#xff1a;Nexus的版本需要至少3.38以上&#xff0c;不然会出现npm install 时npm的审计功能报错&#xff0c;导致install失败。虽然在3.38以后不会报400错误&#xff0c…

数据结构 之 【排序】(直接插入排序、希尔排序)

目录 1.直接插入排序 1.1直接插入排序的思想 1.2直接插入排序的代码逻辑&#xff1a; 1.3 直接插入排序图解 1.4单趟排序代码(单个元素的排序逻辑) 1.5完整排序代码 1.6直接插入排序的时间复杂度与空间复杂度 1.7直接插入排序的优势 2.希尔排序(缩小增量排序) 2.1…

Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙

Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙一顿操作猛如虎&#xff0c;一看结果250&#xff0c;必须记录&#xff0c;必须记录&#xff0c;&#xff01;今天弄了很久关于我们2023年的产品系统蜻蜓T会议系统专业版&#xff0c;然后终于搞好了密码也重…

Newline全场景方案闪耀2025中国智慧生活大会

7月15日 — 16日&#xff0c;由中国电子视像行业协会等权威机构指导的2025 CIC中国智慧生活大会在京召开。Newline作为视像协会PID分会副会长单位携全场景智慧办公解决方案亮相&#xff0c;首席营销官李宇鹏受邀出席领袖圆桌环节&#xff0c;与腾讯云、京东方、创维、TCL、小猿…

Edge浏览器地址栏默认搜索引擎设置指南

前言 Microsoft Edge 浏览器允许用户自定义地址栏默认搜索引擎&#xff0c;只是设置入口隐藏比较深&#xff0c;以版本 137.0.3296.83 (正式版本) (64 位)为例详细记录设置地址栏默认搜索引擎步骤&#xff1a; Edge 设置默认搜索引擎步骤 通过设置界面修改 打开Edge设置&#x…

Python eval函数详解 - 用法、风险与安全替代方案

Python eval函数详解 - 用法、风险与安全替代方案在Python中&#xff0c;eval() 是一个内置函数&#xff0c;用于解析并执行传入的字符串形式的表达式。它能够将字符串动态地转换为有效的Python代码并运行。虽然 eval() 功能强大&#xff0c;但其使用也伴随着潜在的安全风险。本…

Webpack5 新特性与详细配置指南

一、Webpack5 新特性 内置 Asset Modules&#xff08;资源模块&#xff09; 替代 file-loader、url-loader、raw-loader 等&#xff0c;统一资源处理方式。四种类型&#xff1a;asset/resource&#xff1a;导出文件 URL&#xff08;等同 file-loader&#xff09;。asset/inli…

笼子在寻找一只鸟:解读生活的隐形陷阱

想象一个闪闪发光的笼子&#xff0c;敞开着门&#xff0c;在世界中游荡&#xff0c;寻找一只鸟儿。这画面是不是有点奇怪&#xff1f;这是卡夫卡的格言“一个笼子在寻找一只鸟”带给我们的奇思妙想。通常&#xff0c;鸟儿自由翱翔&#xff0c;笼子静静等待&#xff0c;但卡夫卡…

低空经济展 | 约克科技携小型化测试设备亮相2025深圳eVTOL展

全球低空经济与eVTOL产业盛会——2025深圳eVTOL展&#xff0c;将于2025年9月23日至25日在深圳坪山燕子湖国际会展中心盛大启幕&#xff01; 本届展会以“低空经济eVTOL航空应急救援商载大型无人运输机”为核心&#xff0c;预计汇聚200位发言嘉宾、500家顶尖展商及15,000位专业观…

数学专业转行做大数据容易吗?需要补什么?

高考志愿选择数学专业是一个面向未来的决定。数学作为基础学科&#xff0c;其严谨的逻辑训练和抽象思维能力培养&#xff0c;为后续专业发展提供了广泛的可能性。在数字化时代背景下&#xff0c;数学专业毕业生在数据科学、人工智能等领域的竞争优势明显。大学期间推荐考CDA数据…

物联网系统中-设备管理定义方法

物联网系统中的设备管理是指对联网物理设备进行全生命周期监控、配置、维护和优化的系统性过程。它涵盖了从设备接入到退役的各个环节&#xff0c;是物联网平台的核心能力&#xff0c;确保设备安全、稳定、高效地运行并产生价值。 以下是设备管理的详细定义与核心组成部分&…

java和ptyhon对比

&#x1f4dd; ​1. 语言特性对比​​维度​​Java​​Python​​语法风格​静态类型&#xff0c;需显式声明变量类型&#xff1b;代码冗长&#xff08;需分号、大括号&#xff09;动态类型&#xff0c;变量类型自动推断&#xff1b;简洁&#xff08;缩进代替大括号&#xff0c…

UI测试解决方案TestComplete:助力小团队端到端测试全覆盖

面对软件多平台部署的复杂环境与有限的人力资源&#xff0c;小团队在追求端到端测试覆盖时常常陷入困境&#xff1a;既要确保应用在Windows、macOS、Linux及iOS、Android等碎片化平台上的稳定兼容&#xff0c;又要应对脚本重复编写耗时费力、测试效率低下的挑战&#xff0c;同时…

【Android】事件、绘制坐标系相关

一&#xff0c;事件坐标系即MotionEvent事件下发的坐标系&#xff0c;其坐标轴如下MotionEvent#offsetLocation方法可调整坐标原点&#xff0c;以影响MotionEvent#getX&#xff0c;MotionEvent#getY值&#xff0c;以匹配子View的坐标参考系&#xff0c;进而进行事件处理。注意&…

本地Linux服务器使用Docker快速部署SyncTV

文章目录前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址前言 当想和异地恋人同步看恐怖片却因网络延迟错过惊悚瞬间&#xff0c;或与朋友组队观看电竞直播时无法实时吐槽…这些尴尬场景或许你都经历过。而SyncTV的存在正是为了解决…

搭建比分网服务器怎么选数据不会卡顿?

一、 体育比分网站的独特技术挑战体育比分网站是互联网服务中的"极限运动"&#xff0c;面临三大技术高峰&#xff1a;数据实时性&#xff1a;NBA最后2分钟的比分延迟超过1秒就会流失用户流量脉冲&#xff1a;欧冠决赛时流量可能是平时的50-100倍全球覆盖&#xff1a;…

7月18日总结

bashupload / upload files from command line 远程文件包含 介绍一个上传文件的网站 bashupload.com 简介 借助bashupload.com&#xff0c;可以简朴地从下令行上传文件&#xff0c;剖析给其他的服务器&#xff0c;桌面和移动装备&#xff0c;最大支持25G。上传的文件会被保留…

【leetcode】3202. 找出有效子序列的最大长度(2)

文章目录题目题解题目 3202. 找出有效子序列的最大长度&#xff08;2&#xff09; 给你一个整数数组 nums 和一个 正 整数 k 。 nums 的一个 子序列 sub 的长度为 x &#xff0c;如果其满足以下条件&#xff0c;则称其为 有效子序列 &#xff1a; (sub[0] sub[1]) % k (su…

Linux内核网络栈深度剖析:inet_connection_sock.c的服务器端套接字管理

引言 在Linux网络协议栈中,net/ipv4/inet_connection_sock.c是实现面向连接协议(如TCP)服务器端逻辑的核心文件。它承载了从端口绑定、连接接受到资源回收的全流程管理,是构建高并发网络服务的基石。本文将深入解析其关键机制和实现原理。 一、地址匹配:端口冲突检测的基…

机器学习中核心评估指标(准确率、精确率、召回率、F1分数)

混淆矩阵混淆矩阵是一个表格&#xff0c;用于总结分类模型在测试集上的预测结果&#xff0c;特别是当真实标签已知时。它将预测结果分为四种情况&#xff08;记忆&#xff1a;实际和预测一致为True&#xff0c;预测为正是Positive&#xff09;&#xff1a;真正例&#xff1a; 实…