【BPF EBPF】

简介: 【BPF EBPF】

linu 4.14内核

tcp.bt

#include <linux/socket.h>
#include <net/sock.h>
BEGIN
{
  printf("Tracing tcp state.\n");
  @tcp_states[1] = "ESTABLISHED";
  @tcp_states[2] = "SYN_SENT";
  @tcp_states[3] = "SYN_RECV";
  @tcp_states[4] = "FIN_WAIT1";
  @tcp_states[5] = "FIN_WAIT2";
  @tcp_states[6] = "TIME_WAIT";
  @tcp_states[7] = "CLOSE";
  @tcp_states[8] = "CLOSE_WAIT";
  @tcp_states[9] = "LAST_ACK";
  @tcp_states[10] = "LISTEN";
  @tcp_states[11] = "CLOSING";
  @tcp_states[12] = "NEW_SYN_RECV"; 
}
// 
kretprobe:inet_csk_accept
{
  $sk = (struct sock*)retval;
  $inet_family = $sk->__sk_common.skc_family;
  $daddr = ntop(0);
  $saddr = ntop(0);
  if ($inet_family == AF_INET) {
    $daddr = ntop($sk->__sk_common.skc_daddr);
    $saddr = ntop($sk->__sk_common.skc_rcv_saddr);    
  }
  $sport = $sk->__sk_common.skc_num;
  $dport = $sk->__sk_common.skc_dport;
  printf(" tcp_accept: %-16s:%d --> %-16s:%d\n", $daddr, $dport, $saddr, $sport);
}
kprobe:tcp_connect 
{
  $sk = ((struct sock*)arg0);
  $inet_family = $sk->__sk_common.skc_family;
  $daddr = ntop(0);
        $saddr = ntop(0);
        if ($inet_family == AF_INET) {
                $daddr = ntop($sk->__sk_common.skc_daddr);
                $saddr = ntop($sk->__sk_common.skc_rcv_saddr);
        }
        $sport = $sk->__sk_common.skc_num;
        $dport = $sk->__sk_common.skc_dport;
        printf(" tcp_connect: %-16s:%d --> %-16s:%d\n", $daddr, $dport, $saddr, $sport);
}
tracepoint:syscalls:sys_enter_connect
{
  @start[tid] = nsecs;
  printf("sys_enter_connect: %s --> %ld\n", comm, @start[tid]);
}
tracepoint:syscalls:sys_exit_connect
{
  @ms[comm] = sum(nsecs - @start[tid]);
  delete(@start[tid]);
  printf("sys_exit_connect: %s ", comm);
  print(@ms);
}
kprobe:tcp_fin
{
  $sk = ((struct sock*)arg0);
  $state = $sk->__sk_common.skc_state;
  $statestr = @tcp_states[$state];
  printf(" tcp_fin ");
  time("%H:%M:%S ");
  printf("%-8d %-16s %-16s\n", pid, comm, $statestr); 
}
END
{
  clear(@tcp_states);
  clear(@ms);
  clear(@start);
}

bpftrace 命令

bpftrace -e 'tracepoint:block:block_rq_i* { @[probe] = count(); } interval:s:1 { print(@); clear(@); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret > 0/ { @bytes = sum(args->ret); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read { @ret = hist(args->ret); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read { @ret = lhist(args->ret, 0, 1000, 100); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret < 0/ { @[- args->ret] = count(); }'
bpftrace -e 'kprobe:vfs_* { @[probe] = count(); } END { print(@, 5); clear(@); }'
bpftrace -e 'kprobe:vfs_read { @start[tid] =nsecs; } kretprobe:vfs_read /@start[tid]/ { @ms[comm] = sum(nsecs - @start[tid]); delete(@start[tid]); } END { print(@ms, 0, 1000000); clear(@ms); clear(@start); }'
bpftrace -e 'k:vfs_read { @[pid] = count(); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s -> %s\n", comm, str(args->filename)); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { join(args->argv); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
bpftrace -e 'tracepoint:raw_syscalls:sys_enter {@[comm] = count(); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_* {@[probe] = count(); }'
bpftrace -e 'tracepoint:raw_syscalls:sys_enter {@[pid, comm] = count(); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret/ { @[comm] = sum(args->ret); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_read { @[comm] = hist(args->ret); }'
bpftrace -e 'tracepoint:block:block_rq_issue { printf("%d %s %d\n", pid, comm, args->bytes); }'
bpftrace -e 'software:major-faults:1 { @[comm] = count(); }'
bpftrace -e 'software:faults:1 { @[comm] = count(); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_clone { printf("-> clone() by %s PID %d\n", comm, pid); } tracepoint:syscalls:sys_exit_clone { printf("<- clone() return %d, %s PID %d\n", args->ret, comm, pid); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_setuid { printf("setuid by PID %d (%s), UID %d\n", pid, comm, uid); }'
bpftrace -e 'tracepoint:syscalls:sys_exit_setuid { printf("setuid by %s returned %d\n", comm, args->ret); }'
bpftrace -e 'tracepoint:block:block_rq_insert { printf("Block I/O by %s\n", kstack); }'
bpftrace -e 'tracepoint:syscalls:sys_enter_connect /pid == 123/ { printf("PID %d called connect()\n", $1); }'
bpftrace -e 'tracepoint:timer:hrtimer_start { @[ksym(args->function)] = count(); }'
bpftrace -e 't:syscalls:sys_enter_read { @reads = count(); } interval:s:5 { exit(); }'


相关文章
|
监控 网络协议 Perl
[原创]结合案例深入解析orphan socket产生与消亡(一)
本文看点:结合服务器运行案例和TCP代码分析orphan socket产生与消亡以及对系统的影响。精彩的部分在(二)细节分析章节。 ##问题背景 tengine服务器发生过多次orphan socket数量很多的情况,例如有一次使用ss -s命令查看: ``` $ss -s T
9634 0
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
6842 16
|
Web App开发 资源调度 网络协议
Linux系统之部署IP工具箱MyIP
【10月更文挑战第5天】使用Docker部署Radicale日历和联系人应用Linux系统之部署IP工具箱MyIP
832 1
Linux系统之部署IP工具箱MyIP
|
SQL 安全 开发者
VSCode 放弃 Python 3.7
VSCode 放弃 Python 3.7
343 0
|
存储 缓存 安全
Linux 设备驱动程序(三)(下)
Linux 设备驱动程序(三)
331 0
|
Linux Shell API
【翻译】linux中cgroups内存控制子系统memory.oom_control文件
翻译自:redhat文档的部分内容。 新linux内核cgroup的memory子系统提供memory.oom_control来开关cgroup中oom killer,并且提供了消息接口。
8515 0

热门文章

最新文章

下一篇
开通oss服务