用systemtap來修改下linux內核變量的值

我們在探索linux內核的時候,經常需要調整下變量的值,看它對系統的影響。如果這個值沒有透過/proc來修改的話,那隻能編譯內核。這個步驟是非常繁瑣的。現在我們有systemtap這個利器來幫忙了。

演示如下:
我們通過修改過
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. 全局變量必須在一個單元內的函數裏面纔可以修改, 而且必須是在內核上下文。
發佈了66 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章