http://blog.yufeng.info/archives/102
我们在探索linux内核的时候,经常需要调整下变量的值,看它对系统的影响。如果这个值没有透过/proc来修改的话,那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。
演示如下: 我们通过修改过 extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。
probe kernel.
function
(
"do_tcp_setsockopt"
)
$sysctl_tcp_fin_timeout = $1
printf
(
"sysctl_tcp_fin_timeout = %d\n"
, $sysctl_tcp_fin_timeout);
这个时候 stap在运行, 只是还没有触发do_tcp_setsockopt. 现在我们来触发
Erlang R13B02 (erts-5.7.3) 1 [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:
false
]
Eshell V5.7.3 (abort with ^G)
1> {ok, LSock} = gen_tcp:listen(0, []).
2> inet:setopts(LSock, [{nodelay,
true
}]).
Ok,这时候回头可以看到stap打出来以下: sysctl_tcp_fin_timeout = 18000
我们来验证下:
OK,成功。
Tips: 1. stap对全局变量的写需要-g guru模式。 2. 全局变量必须在一个单元内的函数里面才可以修改, 而且必须是在内核上下文。
PS. 这样写的话会更好,因为这个变量是单元可见的,这个模块里面的任何函数被触发都可以看到这个变量. 因为这是tcp的核心模块随时都会被出发的,免除了以上的麻烦!
probe kernel.
function
(
"*@net/ipv4/tcp.c"
)
//probe kernel.
function
(
"do_tcp_setsockopt"
)
$sysctl_tcp_fin_timeout = $1
printf
(
"sysctl_tcp_fin_timeout = %d\n"
, $sysctl_tcp_fin_timeout);
Related posts:
erlang的abstract code