1. 程式人生 > >系統技術非業餘研究 » 用systemtap來修改下linux核心變數的值

系統技術非業餘研究 » 用systemtap來修改下linux核心變數的值

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

演示如下:
我們通過修改過
extern int sysctl_tcp_fin_timeout;的值來達到目的。是因為這個值是proc匯出的 我們好驗證是否成功。

[email protected] ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
15000
[[email protected] ~]# 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()
}

[
[email protected]
st ~]# stap -g test.stp 18000 ready go

這個時候 stap在執行, 只是還沒有觸發do_tcp_setsockopt.
現在我們來觸發

[[email protected] ~]# erl
Erlang R13B02 (erts-5.7.3)  [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

我們來驗證下:

[email protected] ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
18000

OK,成功。

Tips:
1. stap對全域性變數的寫需要-g guru模式。
2. 全域性變數必須在一個單元內的函式裡面才可以修改, 而且必須是在核心上下文。

PS. 這樣寫的話會更好,因為這個變數是單元可見的,這個模組裡面的任何函式被觸發都可以看到這個變數. 因為這是tcp的核心模組隨時都會被出發的,免除了以上的麻煩!

$ cat test.stp
probe begin
{
        printf("ready go\n");
}
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);
        exit()
}

Post Footer automatically generated by wp-posturl plugin for wordpress.

相關推薦

系統技術業餘研究 » systemtap修改linux核心變數的值

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

系統技術業餘研究 » 突破systemtap指令碼對資源使用的限制

我們在使用指令碼收集系統資訊的時候經常會用到map這樣的資料結構存放結果,但是stap指令碼在使用過程中經常會提升說”ERROR: Array overflow, check MAXMAPENTRIES near identifier ‘a’ at test.stp:6:5″ 類似這樣的資訊,然後

系統技術業餘研究 » leveldb ubuntu 11.04編譯失敗問題

我在最新的ubuntu11.04下編譯leveldb的時候發現問題,但是在更早前的這個版本很正常: [email protected]:/usr/src/leveldb$ make g++ -c -DLEVELDB_PLATFORM_POSIX -I. -I./include -std

系統技術業餘研究 » latencytop深度瞭解你的Linux系統的延遲

我們在系統調優或者定位問題的時候,經常會發現多執行緒程式的效率很低,但是又不知道問題出在哪裡,就知道上下文切換很多,但是為什麼上下文切換,是誰導致切換,我們就不知道了。上下文切換可以用dstat這樣的工具檢視,比如: $dstat ----total-cpu-usage---- -dsk/tot

系統技術業餘研究 » itop更方便的瞭解Linux中斷情況

乘著公司搬家的功夫,寫點東西! 在作網路程式的時候, 經常需要了解interrupts和軟中斷的平衡情況, 需要知道每秒有多少中斷髮生,發生在哪個cpu上. Linux下中斷來源可以從 /proc/interrupts 中瞭解到: $ cat /proc/interrupts

系統技術業餘研究 » gcc mudflap 檢測記憶體越界的問題

我們用C語言在做大型伺服器程式的時候,不可避免的要面對記憶體錯誤的問題。典型的問題是記憶體洩漏,越界,隨機亂寫等問題。 在linux下valgrind是個很好的工具,大部分問題都可以查的到的。但是對於更微妙的越界問題,valgrind有時候也是無能為力的。比如下面的問題。 [[email

系統技術業餘研究 » 如何檢視節點的可用控制代碼數目和已控制代碼數

很多同學在使用erlang的過程中, 碰到了很奇怪的問題, 後來查明都是檔案控制代碼不夠用了, 因為系統預設的是每個程序1024. 所以我們有必要在程式執行的時候, 瞭解這些資訊, 以便診斷和預警. 下面的這個程式就演示了這個如何檢視節點的可用控制代碼數目和已用控制代碼數的功能. 首先確保你已經安

系統技術業餘研究 » Erlang port巧環境變數

Erlang與外面世界的互動主要通過port來進行的,特別是和外部程式的協作,通常是通過管道進行的。 基本上有2種方法可以呼叫外部程式: 1. os:cmd 2. erlang:open_port, 這二種方式各有利弊,先看文件: os:cmd的文件參見這裡 cmd(Command) ->

系統技術業餘研究 » systemtap如何跟蹤libc.so

下午和周忱同學折騰複雜程式的記憶體洩漏問題,用了valgrind, gogle perftools等工具都不大好用,很容易把應用程式搞死,於是打算用systemtap來在libc.so層面瞭解記憶體的使用情況。主要思路就是看malloc/realloc和free的呼叫次數的平衡。 首先準備下環境,

系統技術業餘研究 » Systemtap輔助設定tcp_init_cwnd,免對作業系統打Patch

前段時間google的工程師提出對tcp的擁塞視窗的初始值進行增大可以顯著的提高http的效能,這個主要是針對tcp的slow start的優化. 具體參考這裡, 這裡. 謝謝叔度同學從美國帶回第一手資訊! 由於低版本的linux核心的問題,這個引數的正確設定需要對os打patch,這個過程對線

系統技術業餘研究 » nmon(Linux很好的效能監測工具)介紹

The nmon tool is designed for AIX and Linux performance specialists to use for monitoring and analyzing performance data, including: * CPU utiliz

系統技術業餘研究 » Systemtap的另類用法

通常我們在做核心程式設計的時候,會用到核心的資料結構,比如說textsearch提供了幾種演算法用於支付串查詢。在用於正式的專案前,我們會希望考察下他的用法以及想體驗下。最通常的做法是自己寫個module,寫個makefile,編譯,執行,然後去dmesg裡面看printk的結果。這個過程沒啥問題

系統技術業餘研究 » systemtap觀察page_cache的使用情況

在規劃伺服器的記憶體使用的時候經常需要知道應用在理想情況下會使用多少的pagecache, 我們好預先把這個記憶體預留出來. 這個值作業系統沒有提供可檢視的管道,我們只能自己寫個指令碼來實現. 下面的systemtap指令碼每隔N秒顯示下當前os下頭10個檔案佔用多少的pagecache, 降序

系統技術業餘研究 » 再談systemtap在ubuntu 10.10的安裝

安裝的時候有幾個地方需要注意: 在做步驟2的時候: $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.10 DISTRIB_CODENAME=maverick DISTRIB_DESCRIPTION="Ubuntu

系統技術業餘研究 » systemtap全域性變數自動列印的原因和解決方法

在執行stap的時候,經常會發現在指令碼結束執行的時候打出了很多無預期的東西,仔細一看都是些全域性變數的dump, 這個問題比較煩人. 我來演示下: $ cat > g.stp global xyz probe begin{ xyz=2010 exit(); } CT

系統技術業餘研究 » 簡單的Map reduce的收集函式

在處理大量重複任務的時候,為了加快速度,通常會用map-reduce的方式,要是能有段程式碼做這個事情就好了。作者luke寫了底下的程式碼片段,用起來感覺挺爽的,推薦給大家。原文見這裡 %% http://lukego.livejournal.com/6753.html – that doesn’

系統技術業餘研究 » 巧Netcat方便網路程式開發

首先介紹下NC,這個號稱網路瑞士軍刀的工具。 What is Netcat? Netcat is a featured networking utility which reads and writes data across network connections, using the TC

系統技術業餘研究 » GLIBC 2.16 支援systemtap靜態檢查點

剛@淘寶雕樑 告訴我 GLIBC 2.16 支援systemtap靜態檢查點,訊息源在這裡, 摘抄相關部分如下: * New configure option –enable-systemtap builds SystemTap static probes into libc for setj

系統技術業餘研究 » mmap的MAP_POPULATE標誌妙

前段時間在學習MySQL和核心的時候,碰巧遇到twitter的dba老大在折騰numa不平衡問題的問題而寫了二篇numa相關的文章,非常有技術含量。參見 這裡 numa不平衡問題的解決方案摘抄如下: A more thorough solution The original post also

系統技術業餘研究 » systemtap函式呼叫棧資訊不齊的原因和解決方法

有時候在看系統程式碼的時候,我們很難從原始碼中看出我們感興趣的函式是如何被呼叫的,因為呼叫路徑有可能太多。使用者空間的程式gdb設斷點是個好的方法,核心的就麻煩了。這時候systemtap可以幫忙, 比如: $uname -r 2.6.18-164.el5 $stap -V Syste