演示如下:
我們通過修改過
extern int sysctl_tcp_fin_timeout;的值來達到目的。是因爲這個值是proc導出的 我們好驗證是否成功。
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
15000
# cat test.stp
probe begin
{
printf("ready go\n");
}
probe kernel.function("do_tcp_setsockopt")
{
$sysctl_tcp_fin_timeout = $1
printf("sysctl_tcp_fin_timeout = %d\n", $sysctl_tcp_fin_timeout);
exit()
}
# stap -g test.stp 18000
ready go
這個時候 stap在運行, 只是還沒有觸發do_tcp_setsockopt.
現在我們來觸發
# erl
Erlang R13B02 (erts-5.7.3) [source] [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, []).
{ok,#Port<0.437>}
2>
2> inet:setopts(LSock, [{nodelay,true}]).
ok
3>
Ok,這時候回頭可以看到stap打出來以下:
sysctl_tcp_fin_timeout = 18000
我們來驗證下:
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
18000
OK,成功。
Tips:
1. stap對全局變量的寫需要-g guru模式。
2. 全局變量必須在一個單元內的函數裏面纔可以修改, 而且必須是在內核上下文。