LTTng 簡介&使用實戰

1、LTTng簡介

      LTTng: (Linux Trace Toolkit Next Generation),它是用於跟蹤 Linux 內核、應用程序以及庫的系統軟件包。LTTng 主要由內核模塊和動態連接庫(用於應用程序和動態連接庫的跟蹤)組成。它由一個會話守護進程控制,該守護進程接受來自命令行接口的命令。babeltrace 項目容許將追蹤信息翻譯成用戶可讀的日誌,並提供一個讀追蹤庫,即 libbabletrace。php


        LTTng 不只使用了 Linux 內核中的追蹤點(tracepoint)手段,並且可使用其餘各類信息來源,好比kprobes 和 Perf(Linux 中的性能監檢測工具)。這對於調試大範圍內的bug 是很是有用的,不然這種調試工做將極具挑戰性。好比,包括並行系統和實時系統中的性能問題。另外,用戶本身定製的工具也能夠加入到其中。LTTng 的設計目標是將性能影響最小化,並且在沒有跟蹤的狀況下,對系統的影響應該幾乎爲零。
linux


        LTTng現在已支持多個發行版(Ubuntu/Dibian、Fedora、OpenSUSE、Arch etc.)和多種架構(x86 and x86-64 、ARM 、PowerPC, Sparc, Mips etc.),此外官方還說支持Android和FreeBSD系統。
shell

更多相關知識參見: 《使用LTTng連接內核和用戶空間應用程序追蹤vim

 

2、LTTng使用實戰 -- 安裝

2.0 LTTng須要的內核配置(經過讀取LTTng-module文檔中的README瞭解)


必選配置: 

CONFIG_MODULES   內核模塊支持
CONFIG_KALLSYMS   查看wrapper/ 文件。 
CONFIG_HIGH_RES_TIMERS  高精度時鐘,LTTng2.0的時鐘源 
CONFIG_TRACEPOINTS  內核追蹤點


可選配置(下面的內核配置會影響LTTng的特性):

CONFIG_HAVE_SYSCALL_TRACEPOINTS:  
            系統調用追蹤:
               lttng enable-event -k --syscall
               lttng enable-event -k -a
CONFIG_PERF_EVENTS:             lttng add-context -t perf:*
CONFIG_EVENT_TRACING:
            事件追蹤,塊層的追蹤
CONFIG_KPROBES                      lttng enable-event -k --probe ...
CONFIG_KRETPROBES               lttng enable-event -k --function ...
babel


2.1  Ubuntu  :

從Ubuntu 12.04開始,LTTng的包能夠直接從包管理器的倉庫裏找到,因此安裝變得很是簡單:
                 sudo apt-get install lttng-tools
對於其餘版本,須要添加PPA才能使用包管理器安裝(https://launchpad.net/~lttng/+archive/ppa):
                $ sudo apt-add-repository ppa:lttng/ppa
                $ sudo apt-get update
                $ sudo apt-get install lttng-tools lttng-modules-dkms babeltrace


2.2 Fedora:

從 Fedora 17開始, UST 和工具包也可使用yum直接安裝:
                $ sudo yum install lttng-tools
可是你須要手動的編譯lttng模塊。(從官網下載一個lttng-modules-***.tar.bz2)
# tar xvf lttng-modules-2.3.2.tar.bz2 
# cd lttng-modules-2.3.2
# vim README --- > 經過讀README學習如何安裝
# make
# make modules_install
# depmod -a

2.3 OpenSUSE(或者其餘的使用rpm包的Linux發行版)的RPM包:

https://build.opensuse.org/project/show?project=devel%3Atools%3Alttng


2.4 Arch Linux:

https://aur.archlinux.org/packages.php?O=0&K=lttng&do_Search=Go

 

3、LTTng使用實戰 -- 內核追蹤

 

首先咱們得確認你是否已經安裝了lttng-modules 和lttng-tools。
session

 

3.1  內核追蹤

列出全部的可追蹤內核事件:
# lttng list -k
Kernel events:
-------------
     timer_init (loglevel: TRACE_EMERG (0)) (type: tracepoint)
     timer_start (loglevel: TRACE_EMERG (0)) (type: tracepoint)
     timer_expire_entry (loglevel: TRACE_EMERG (0)) (type: tracepoint)
 ……


架構

3.2 建立一個追蹤會話(session),這個命令會建立一個目錄用以存放追蹤結果:

 

                 # lttng create mysession
                Session mysession created.
                Traces will be written in /home/dslab/lttng-traces/mysession-20131010-145153

假如你當前已經有了不少的會話,咱們能夠設置當前追蹤會話:app

# lttng set-session myothersession
Session set to myothersession

工具

3.3 建立追蹤規則(探測點/系統調用 etc.)

1) 追蹤內核全部的探測點和全部的系統調用事件(-k/--kernel)
# lttng enable-event -a -k

2) 
追蹤探測點事件,這裏咱們追蹤 sched_switch和sched_wakeup爲例 (-k/--kernel) 。性能

 

# lttng enable-event sched_switch,sched_wakeup -k
或者追蹤全部的探測點事件:
# lttng enable-event -a -k --tracepoint

3) 追蹤全部的系統調用:
# lttng enable-event -a -k --syscall


4) 使用 kprobes 以及 (或) 其餘追蹤器做爲lttng的源:
這是一個LTTng2.0內核追蹤器的一個新特性,你可使用一個動態probe做爲源,probe的追蹤結果會顯示在lttng的追蹤結果中

# lttng enable-event aname -k --probe symbol+0x0
or
# lttng enable-event aname -k --probe 0xffff7260695
能夠爲probe制定一個準確的地址0xffff7260695或者 symbol+offset。

你也可使用功能追蹤(使用的Ftrace API),追蹤結果也會顯示在lttng的追蹤結果中:

# lttng enable-event aname -k --function <symbol_name>


5) 打開一個事件的上下文信息:
這也是一個新特性,可讓你添加一個事件的上下文信息。好比說你能夠添加PID:

# lttng add-context -k -e sched_switch -t pid
你也可使用多個上下文信息:
lttng add-context -k -e sched_switch -t pid -t nice -t tid

你可使用' lttng add-context --help ' 學習全部的上下文格式的用法。

6) 打開事件的Perf計數器: 
這也是一個新的很強大的特性,爲每一個追蹤的事件添加Perf計數器數據(使用Perf的API)。下面實例爲爲每一個事件添加CPU週期:
# lttng add-context -k -e sched_switch -t perf:cpu-cycles

注: 你須要使用 add-context 的help學習全部的perf計數器值的含義。

3.4 開始追蹤:

# lttng start

追蹤結果會寫到上面建立會話時建立的文件夾中。好比上面的 :/home/dslab/lttng-traces/mysession-20131010-145153

注意:這個命令會打開全部的追蹤,若是你想同時追蹤用戶空間和內核空間,你在使用這個以前須要設置好全部的追蹤規則。

3.5 中止追蹤:

# lttng stop

注:在這時候,你可一使用 lttng start 從新追蹤,也能夠打開/關閉某個事件或者隔段時間再來追蹤。固然你也能夠查看追蹤信息。

 


3.6 關閉追蹤(你的追蹤工做已經結束)

# lttng destroy 

 


4、LTTng使用實戰 -- 用戶空間追蹤

待之後添加。

 

5、LTTng使用實戰 -- 追蹤數據分析

5.1 分析工具 -- babeltrace

 

babeltrace是lttng tools中自帶的分析工具,很強大。咱們能夠直接使用babeltrace打開追蹤數據,好比上面提到的 /home/dslab/lttng-traces/mysession-20131010-145153。

咱們先查看下這個追蹤結果下的結構:

# tree /home/dslab/lttng-traces/mysession-20131010-145153

 

/home/dslab/lttng-traces/mysession-20131010-145153

└── kernel

    ├── channel0_0
    ├── channel0_1
    ├── channel0_2
    ├── channel0_3
    └── metadata

能夠看出來追蹤目錄下只有一個目錄,叫作kernel,因此……若是追蹤前也打開了用戶追蹤,那麼這裏面還會多個追蹤目錄(用戶空間的)。kernel目錄下分幾個文件保存追蹤數據。可是咱們使用babeltrace查看追蹤結果時不能指定到具體的文件,須要指定到kernel。

# babeltrace /home/dslab/lttng-traces/mysession-20131010-145153

[13:09:27.585271256] (+?.?????????) Raring-Ringtail sys_geteuid: { cpu_id = 2 }, { }
[13:09:27.585273674] (+0.000002418) Raring-Ringtail exit_syscall: { cpu_id = 2 }, { ret = 0 }
[13:09:27.585275886] (+0.000002212) Raring-Ringtail sys_pipe: { cpu_id = 2 }, { fildes = 0xB6588B84 }
[13:09:27.585283170] (+0.000007284) Raring-Ringtail exit_syscall: { cpu_id = 2 }, { ret = 0 }
……

若是咱們將babeltrace的輸出信息輸出到一個文件中,好比# babeltrace /home/dslab/lttng-traces/mysession-20131010-145153 > /tmp/trace 。咱們就可使用shell腳本獲取/tmp/trace中的追蹤數據並進一步分析。

相關文章
相關標籤/搜索