內核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
英文地址,請注明出處:http://en.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; 實…