• 莫名
    2022-02-07
    1、比较赞同【最主要是因为不清楚内核中都有哪些函数和跟踪点可以拿来跟踪】这一观点。如果对内核不熟悉,借助 tracepoint 通配符可以很好的协助理解网络协议栈的关键路径。举两个简单例子。 > 例 1:追踪 net 相关追踪点以及调用堆栈: # bpftrace -e 'tracepoint:net:* { printf("%s(%d): %s %s\n", comm, pid, probe, kstack()); }' 输出示例(sshd 发送数据包关键路径,涉及 tracepoint:net:net_dev_queue、tracepoint:net:net_dev_xmit 等追踪点,可以借助这些追踪点可进一步计算数据包排队时间等): sshd(219966): tracepoint:net:net_dev_queue __dev_queue_xmit+1524 dev_queue_xmit+16 ip_finish_output2+718 __ip_finish_output+191 ip_finish_output+54 ip_output+112 ip_local_out+53 __ip_queue_xmit+354 ip_queue_xmit+16 __tcp_transmit_skb+1407 tcp_write_xmit+982 __tcp_push_pending_frames+57 tcp_push+219 tcp_sendmsg_locked+2415 tcp_sendmsg+44 inet_sendmsg+59 sock_write_iter+156 new_sync_write+287 __vfs_write+38 vfs_write+171 ksys_write+97 __x64_sys_write+26 do_syscall_64+71 entry_SYSCALL_64_after_hwframe+68 sshd(219966): tracepoint:net:net_dev_xmit dev_hard_start_xmit+368 dev_hard_start_xmit+368 sch_direct_xmit+278 __dev_queue_xmit+1713 dev_queue_xmit+16 ip_finish_output2+718 ... __x64_sys_write+26 do_syscall_64+71 entry_SYSCALL_64_after_hwframe+68 > 例 2:使用 perf trace 也比较方便: # perf trace --no-syscalls -e 'net:*' curl -s time.geekbang.org > /dev/null 输出示例(可以看到具体走了哪些网络设备、数据包长度、skb 内存地址等): 0.439 curl/2240 net:net_dev_queue:dev=eth1 skbaddr=... len=54 0.452 curl/2240 net:net_dev_start_xmit:dev=eth1 skbaddr=... len=54 0.455 curl/2240 net:net_dev_xmit:dev=eth1 skbaddr=... len=54 0.707 curl/2240 net:netif_receive_skb:dev=eth1 skbaddr=... len=52 2、dropwatch.bt 头文件有些没使用到,可以做下简化: #include <linux/skbuff.h> #include <linux/ip.h> #include <linux/socket.h> #include <linux/netdevice.h> =====================> #include <linux/skbuff.h> #include <net/ip.h> 思考题直接用 bpftrace 内置变量 comm、pid 即可。
    展开

    作者回复: 非常👍的答案!也谢谢分享跟踪点学习的经验!

    共 2 条评论
    19
  • Geek_9e1ece
    2023-02-03 来自北京
    老师 ntop这个函数返回的是字符串么?为什么我用$sip或$dip去做if判断时候提示我两端的数据类不正确呢。 另外我翻了一下内核的源码,好像没有直接找到ntop()这个名字的函数,请问还有pton()这样的函数可以将字符串转成inet数据类型么,以便我在if判断中作为过滤条件。

    作者回复: ntop是bpftrace提供的一个内置函数,把IP地址转换成字符串形式,方便展示。 具体文档可以参考 https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#14-ntop-convert-ip-address-data-to-text

    
    
  • janey
    2022-11-25 来自江苏
    第二图里怎么没有tracepoint?应该是跟kprobe在同一个层面吧

    作者回复: 图里的syscall其实就是tracepoint。不过你说的也有道理,tracepoint其实有很多,不只是syscall,也包括很多网络跟踪点。

    
    
  • k8svip
    2022-03-16
    老师 如何跟踪下PHP-fpm线程,去处理MySQL 域名解析的过程呢?偶现连不通的情况,回出现udp receive error 包数量增加,tcpdump又捕获不到

    作者回复: 可以考虑去跟踪DNS请求?这可能比跟踪进程更简单一些

    
    
  • 从远方过来
    2022-02-24
    老师,看了你举的查找SKB的例子,我很好奇要怎么才能快速地从内核相关文档中找到相关的函数呢? 例如:找出关于内存分配的函数, 这个有什么好窍门么?

    作者回复: 最容易的就是使用eBPF跟踪系统调用相关的内核栈,然后对栈中的相关函数进行跟踪。当然,如果熟悉内核代码,去内核源码查看更好。

    
    
  • 阿斌斯基
    2022-02-07
    ubuntu 18.04 ,snap安装的bpftrace,kernel symbol解析失败 ➜ ~ bpftrace -V bpftrace v0.13.0 ➜ ~ echo $BPFTRACE_VMLINUX /usr/lib/debug/boot/vmlinux-5.4.0-96-generic ➜ ~ uname -a Linux max-machine 5.4.0-96-generic #109~18.04.1-Ubuntu SMP Thu Jan 13 15:06:26 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux ➜ ~ sudo bpftrace -e 'kprobe:kfree_skb /comm=="curl"/ {printf("kstack: %s\n", kstack);}' [sudo] password for max: Attaching 1 probe... kstack: 0xffffffff9091b941 0xffffffff90a5f5f7 0xffffffff90914e41 0xffffffff90a5eae9 0xffffffff909f4009 0xffffffff90a351c0 0xffffffff9090b8e2 0xffffffff9090b975 0xffffffff902e0276 0xffffffff902e047e 0xffffffff900c493d 0xffffffff90003ec9 0xffffffff90004320 0xffffffff90c0008c kstack: 0xffffffff9091b941 0xffffffff90a5f5f7 0xffffffff90914e41 0xffffffff90a5eae9 0xffffffff909f4009 0xffffffff90a351c0 0xffffffff9090b8e2 0xffffffff9090b975 0xffffffff902e0276 0xffffffff902e047e 0xffffffff900c493d 0xffffffff90003ec9 0xffffffff90004320 0xffffffff90c0008c kstack: 0xffffffff9091b941 0xffffffff9090fad3 0xffffffff9090fb6a 0xffffffff90004207 0xffffffff90c0008c kstack: 0xffffffff9091b941 0xffffffff9090fad3 0xffffffff9090fb6a 0xffffffff90004207 0xffffffff90c0008c
    展开

    作者回复: 有没有使用snap install --devmode来安装?Github上面也有个类似的issuehttps://github.com/iovisor/bpftrace/issues/1488。旧的发行版最好还是从源码安装 BCC 和 bpftrace。

    
    
  • 为了维护世界和平
    2022-07-19
    github上的程序 执行 段错误 #bpftrace dropwatch.bt Segmentation fault (core dumped)
    
    2
  • Bachue Zhou
    2023-04-06 来自上海
    $ sudo bpftrace -l 'kprobe:kfree_skb*' kprobe:kfree_skb_list_reason kprobe:kfree_skb_partial kprobe:kfree_skb_reason kprobe:kfree_skbmem $ uname -r 5.19.0-38-generic 尴尬 我这边 5.19 就没有 kfree_skb 这个函数了
    共 1 条评论
    
  • linker
    2023-03-13 来自江苏
    $ apt list --installed |grep '\<linux-' WARNING: apt does not have a stable CLI interface. Use with caution in scripts. binutils-x86-64-linux-gnu/jammy-updates,jammy-security,now 2.38-4ubuntu2.1 amd64 [installed,automatic] linux-base/jammy,now 4.5ubuntu9 all [installed,automatic] linux-buildinfo-5.19.0-35-generic/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed] linux-firmware/jammy-security,now 20220329.git681281e4-0ubuntu3.9 all [installed,upgradable to: 20220329.git681281e4-0ubuntu3.10] linux-headers-5.19.0-35-generic/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed] linux-hwe-5.19-headers-5.19.0-35/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 all [installed,automatic] linux-hwe-5.19-tools-5.19.0-35/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed,automatic] linux-image-5.19.0-35-generic/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed] linux-libc-dev/jammy-updates,jammy-security,now 5.15.0-67.74 amd64 [installed,automatic] linux-modules-5.19.0-35-generic/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed,automatic] linux-sound-base/jammy,now 1.0.25+dfsg-0ubuntu7 all [installed,automatic] linux-source-5.19.0/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 all [installed] linux-tools-5.19.0-35-generic/jammy-updates,jammy-security,now 5.19.0-35.36~22.04.1 amd64 [installed] linux-tools-common/jammy-updates,jammy-security,now 5.15.0-67.74 all [installed,automatic]
    展开
    
    
  • linker
    2023-03-13 来自江苏
    $ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.1 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy 这个版本升级到 5.19 内核后,源码安装最新版bpftrace , 执行本节程序报错 definitions.h:2:10: fatal error: 'linux/skbuff.h' file not found 内核头文件已经安装了,内核开发包也安装了,请问老师这可能是什么问题? 下面是安装的包
    展开
    
    