systemtap查看free_skb的场景

目前的dropwatch仅能查看丢包发生在哪个环节,不能看到丢包的内容,于是七拼八凑,拼了一个脚本,可以看到ip层的信息了,哈哈哈,tcp层的还是要做解析,不过如果不是tcp包的话,还要做一些判断逻辑,所以,先看到ip层信息就可以了。脚本如下:

#! /usr/bin/env stap
%{
#include <linux/version.h>
#include <net/sock.h>
#include <net/tcp.h>
#include <net/ip.h>
#include <linux/skbuff.h>
%}


# Note when we turn the monitor on and off
probe begin { printf("Monitoring for dropped packets\n") }
probe end { printf("Stopping dropped packet monitor\n") }

probe kernel.statement("kfree_skb") {
        iphdr = __get_skb_iphdr($skb)
        family = %{ AF_INET %}
        saddr = format_ipaddr(__ip_skb_saddr(iphdr), %{ AF_INET %})
        daddr = format_ipaddr(__ip_skb_daddr(iphdr), %{ AF_INET %})
        protocol = __ip_skb_proto(iphdr)
  printf("%s->%s\n",saddr,daddr)
}

发现ping包最后都会走到kfree_skb的逻辑去。所以拿kfree_skb衡量丢包不太准确啊

后续:dropwatch跟这个脚本跟踪的都是kfree_skb函数被调用的时机,但是其实这个函数也是正常包被释放的时候会被调用的,所以,这个根本不是衡量丢包的,请注意

此条目发表在好玩的linux分类目录。将固定链接加入收藏夹。