1. 程式人生 > >系統技術非業餘研究 » 調研核心呼叫棧方便的工具 kmalloc

系統技術非業餘研究 » 調研核心呼叫棧方便的工具 kmalloc

我們在研究核心的時候,看了核心程式碼後,就想著某個函式被誰誰呼叫。 呼叫路徑有很多條,有熱門的,有偏門的,但從程式碼不大容易看出。 如果我們能和gdb那樣在函式上設個斷點,看下核心函式的呼叫棧就清楚了。 但是如何統計熱門路線呢?用systemtap就可以,參看這裡這裡

但是用systemtap寫統計的時候,用到統計功能的話,如果你的取樣點非常多,超過systemtap規定的上線,systemtap會選擇罷工,直接推出,很不爽。

kmalloc-top就是為了解決這個問題寫的一個perl指令碼,原本用來調查核心中kmalloc的使用情況的,在一個繁忙的核心中,kmallo每秒會被呼叫成千上萬次,明顯會超過處理的上限。 所以kmalloc-top的方法是stap部分只負責收集堆疊資訊,收集一個就寫到標準輸出一個,然後由perl指令碼來進一步分析統計。

指令碼位於:/usr/local/share/doc/systemtap/examples/memory/kmalloc-top

#The systemtap script that instruments the kmalloc
$script=”
global kmalloc_stack

probe kernel.function(\”__kmalloc\”) { kmalloc_stack[backtrace()]++ }

probe timer.ms(100), end
{
foreach (stack in kmalloc_stack) {
printf(\”\\n\”)
print_stack(stack)
printf(\”

\\n\”)
printf(\”%d\\n\”, kmalloc_stack[stack])
}
delete kmalloc_stack
}
“;

我們使用的時候把probe點用自己感興趣的替換掉就好。

它支援的功能見註釋部分:

#!/usr/bin/perl
#
# This script accumulates the execution paths of all calls to kmalloc
# in the kernel. On Ctrl-C (or exit of the command provided by -c option),
# it sorts, filters and displays them on
# stdout.
#
# The -e (exclude) option can be used to specify a comma-separated list
# – any stack with contents matching any of the items in the list will
# be excluded from the output.
#
# The -m (min) option can be used to specify the minimum number of
# occurrences a stack needs to be included in the output.
#
# The -t (top) option can be used to specify printing only the
# top N stack traces.
#
# The -c (command) option runs starts the command and script
# only runs for the duration of the command.
#
# The -o (options) option passes the options to systemap.
#
# Usage: ./kmalloc-top [-m min] [-e exclude list] [-t top_n] [-c command]
# [-o options]
# Ctrl-c

在實際使用中我們會加入 -o –all-modules, 用於列印全呼叫棧資訊,詳細見這裡

典型使用如下:
./kmalloc-top -o –all-modules -m 128 -t 10
取top 10, 每個至少被呼叫10次。

演示下:

$uname -r
2.6.18-164.el5

$sudo  /usr/local/share/doc/systemtap/examples/memory/kmalloc-top -o --all-modules  -m 10 -t 3        
Will print only the top 3 stacks.
Will print stacks with counts >= 10.
Press Ctrl-C to stop.
ERROR: Skipped too many probes, check MAXSKIPPED or try again with stap -t for more details.
WARNING: Number of errors: 0, skipped probes: 101

This path seen 31 times:
 0xffffffff800d9d3b : __kmalloc+0x0/0x9f [kernel]
 0xffffffff8002e1e9 : __alloc_skb+0x5c/0x12d [kernel]
 0xffffffff802214a3 : sock_alloc_send_pskb+0x7d/0x282 [kernel]
 0xffffffff8004a71d : unix_stream_sendmsg+0x15f/0x346 [kernel]
 0xffffffff80055261 : sock_sendmsg+0xf8/0x14a [kernel]
 0xffffffff80220056 : sys_sendto+0x11c/0x14f [kernel]
 0xffffffff8005d116 : system_call+0x7e/0x83 [kernel]
 0x246 : __mod_error_mask1type56+0x16/0x30 [bnx2i]
 0x2 : __mod_version79+0x2/0x10 [cnic]
 0x4000000000000000
 0x40000000000000
 0x400000000000
 0x4000000000
 0x40000000
 0x400000
 0x4000
 0x40 : __mod_description77+0x20/0x40 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]

This path seen 22 times:
 0xffffffff800d9d3b : __kmalloc+0x0/0x9f [kernel]
 0xffffffff8002e1e9 : __alloc_skb+0x5c/0x12d [kernel]
 0xffffffff80025c28 : tcp_sendmsg+0x184/0xb0e [kernel]
 0xffffffff80055261 : sock_sendmsg+0xf8/0x14a [kernel]
 0xffffffff8021fb48 : sys_sendmsg+0x217/0x28a [kernel]
 0xffffffff8005d116 : system_call+0x7e/0x83 [kernel]
 0x202 : __mod_error_mask157+0x2/0x30 [bnx2i]
 0x2 : __mod_version79+0x2/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x0 : __mod_version79+0x0/0x10 [cnic]
 0x700000000000000
 0x7000000000000
 0x70000000000
 0x700000000
 0x7000000
 0x70000

This path seen 14 times:
 0xffffffff800d9d3b : __kmalloc+0x0/0x9f [kernel]
 0xffffffff8002e1e9 : __alloc_skb+0x5c/0x12d [kernel]
 0xffffffff8003a7e8 : tcp_send_ack+0x20/0xf1 [kernel]
 0xffffffff80252178 : tcp_delack_timer+0x180/0x1ed [kernel]
 0xffffffff800968be : run_timer_softirq+0x133/0x1af [kernel]
 0xffffffff8001235a : __do_softirq+0x89/0x133 [kernel]
 0xffffffff8005e2fc : call_softirq+0x1c/0x28 [kernel]
 0xffff81034ab93f98
 0x20ffff81034ab93f
 0xfe20ffff81034ab9
 0xb8fe20ffff81034a
 0x4ab8fe20ffff8103
 0x34ab8fe20ffff81
 0x81034ab8fe20ffff
 0xff81034ab8fe20ff
 0xffff81034ab8fe20
 0x14ffff81034ab8fe
 0xcb14ffff81034ab8
 0x6cb14ffff81034a
 0x8006cb14ffff8103
 0xff8006cb14ffff81

Num stacks before filtering: 271
Num stacks after filtering: 3
Total kmallocs (before filtering): 536
Total kmallocs (after filtering): 67
The filter stacks have 12.5 of the total kmallocs

祝玩得開心!

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

相關推薦

系統技術業餘研究 » 調研核心呼叫方便工具 kmalloc

我們在研究核心的時候,看了核心程式碼後,就想著某個函式被誰誰呼叫。 呼叫路徑有很多條,有熱門的,有偏門的,但從程式碼不大容易看出。 如果我們能和gdb那樣在函式上設個斷點,看下核心函式的呼叫棧就清楚了。 但是如何統計熱門路線呢?用systemtap就可以,參看這裡, 這裡。 但是用systemt

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

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

系統技術業餘研究 » iozone檔案系統性能測試工具

IOzone官網: http://www.iozone.org/ IOzone is a filesystem benchmark tool. The benchmark generates and measures a variety of file operations. Iozone has

系統技術業餘研究 » Linux IO協議框圖

這張圖很清晰的把linux IO協議棧的層次給勾出來了,而且內容很與時俱進,特別是SCSI裝置的層次對大家理解sg3這樣的包非常有幫助,強烈推薦大家好好研習! 祝玩得開心! Post Footer automatically generated by wp-posturl plugin fo

系統技術業餘研究 » ftrace和它的前端工具trace

最近在調查lockless的ring_buffer的時候,發現了ftrace. ftrace是 Linux 核心中提供的一種除錯工具。使用 ftrace 可以對核心中發生的事情進行跟蹤,這在除錯 bug 或者分析核心時非常有用. ftrace在2.6.28-rc2以後的Linux核心都支援

系統技術業餘研究 » dropwatch 網路協議丟包檢查利器

在做網路伺服器的時候,會碰到各種各樣的網路問題比如說網路超時,通常一般的開發人員對於這種問題最常用的工具當然是tcpdump或者更先進的wireshark來進行抓包分析。通常這個工具能解決大部分的問題,但是比如說wireshark發現丟包,那深層次的原因就很難解釋了。這不怪開發人員,要怪就怪lin

系統技術業餘研究 » Linux常用效能調優工具索引

霸爺您好,麻煩請教個問題,我們最近一個專案上有個奇怪的問題,基於實時linux系統,兩個實時執行緒通過mq_send傳送訊息,A發訊息給B,是非阻塞的訊息佇列,A傳送訊息B進行處理,A傳送訊息後發現mq_send的開銷與B對該訊息的處理時延相關,也就是說B處理的快,那麼A呼叫的mq_send返回

系統技術業餘研究 » Linux下新系統呼叫sync_file_range

我們在做資料庫程式或者IO密集型的程式的時候,通常在更新的時候,比如說資料庫程式,希望更新有一定的安全性,我們會在更新操作結束的時候呼叫fsync或者fdatasync來flush資料到持久裝置去。而且通常是以頁面為單位,16K一次或者4K一次。 安全性保證了,但是效能就有很大的損害。而且我們更新

系統技術業餘研究 » gen_tcp呼叫程序收到{empty_out_q, Port}訊息奇怪行為分析

今天有同學在gmail裡面問了一個Erlang的問題,問題描述的非常好, 如下: 問題的背景是: 1、我開發了一個服務端程式,接收客戶端的連線。同一時刻會有多個客戶端來連線,連線後,接收客戶端請求後,再發送響應訊息,然後客戶端主動斷連。

系統技術業餘研究 » 如何在TILEPro64多核心板卡上編譯和執行Erlang

美國Tilera公司的眾核伺服器,單顆核心包含64顆CPU。硬體架構圖: 卡長這樣的: Erlang已經可以在這款CPU上成功執行,我們可以參考Ulf Wiger在Multicore ☺ Message-passing Concurrency 文件中關於Erlang在Tilera上的效能圖

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

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

系統技術業餘研究 » 調查使用者空間程式某函式最常呼叫路徑

在做系統調優或者調查效能問題的的時候,比如說調查一個鎖的效能問題。 這把鎖的程式碼會有很多路徑會呼叫, 我們可以在鎖的地方設個probe點,但是我們無法知道那個路徑是最經常呼叫的。 所以我就寫了個stap指令碼來解決這個問題,程式碼在RHEL 5.4/6下都除錯沒有問題的。 $ cat >

系統技術業餘研究 » erlang到底能夠併發發起多少系統呼叫

為了測試下erlang的多smp能夠每秒併發發起多少系統呼叫,這個關係到erlang作為網路程式在高併發下的評估。 首先crack下otp_src,因為erlang:now() 是呼叫了clock_gettime這個系統呼叫,但是遺憾的是這個now裡面設計到很多mutex會導致不可預期的futex

系統技術業餘研究

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » MySQL資料庫架構的演化觀察

MySQL資料庫架構的演化觀察 December 14th, 2017 Categories: 資料庫 Tags: mysql

系統技術業餘研究 » inet_dist_connect_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 推薦工作機會

最後更新時間:2014/11/28 請賜簡歷至:[email protected], 感謝您對加入我們公司有興趣,我們希望能早日和您共事。 以下幾個職位1年內有效,歡迎內部轉崗:
 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海

系統技術業餘研究 » 新的工作和研究方向

和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w

系統技術業餘研究 » 叢集引入inet_dist_{listen,connect}_options更精細引數微調

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 2017升的最快的幾個資料庫無責任點評

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼