bpftrace是一个基于bpf的跟踪工具。上一篇分享了bpftool,bpftrace的功能更强大。在内核中,tcp通过tcp_sendmsg方法发送数据inttcp_sendmsg(structsock*sk,structmsghdr*msg,size_tsize);如果我们要查看tcp发送数据的大小,我们需要得到第三个(arg2)参数size的值。让我们尝试编写一个小的bpftrace脚本来查看size的值。执行效果如下:#bpftrace-e'k:tcp_sendmsg{@sizeAttaching2probes...@size:[1]6||[2,4)0||[4,8)0||[8,16)0||[16,32)110|@@@@@@@@|[32,64)687|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[64,128)429|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[128,256)60|@@@@|[256,512)96|@@@@@@|[512,1K)46|@@@|[1K,2K)28|@@|[2K,4K)8||[4K,8K)10||可以看到大小的直方图,类似正态分布。如果想查看哪些进程发送的数据量大,可以添加大于1024字节的过滤器,如下:#bpftrace-e'k:tcp_sendmsg/arg2>1024/{printf("PID%d,COMM:%s:%d字节\n",pid,comm,arg2);}'附加1个探测器...PID63700,COMM:kube-apiserver:1581bytesPID68206,COMM:etcd:1079bytesPID1784,COMM:kube-scheduler:2249bytesPID63700,COMM:kube-apiserver:1581bytesPID63700,COMM:kube-apiserver:5811bytesPID63700,COMM:kube-apiserver:5811bytesPID:kube-apiserver:1581byte基于tcp_sendmsg的size参数。我们再进一步看下发送数据包的内容,也就是tcp_sendmsg的第一个参数。我们写这样一个脚本#!/usr/local/bin/bpftrace#include
