一、LTTng簡介
? ? ??LTTng: (Linux Trace Toolkit Next Generation),它是用于跟蹤 Linux 內核、應用程序以及庫的系統軟件包。LTTng 主要由內核模塊和動態鏈接庫(用于應用程序和動態鏈接庫的跟蹤)組成。它由一個會話守護進程控制,該守護進程接受來自命令行接口的命令。babeltrace 項目允許將追蹤信息翻譯成用戶可讀的日志,并提供一個讀追蹤庫,即 libbabletrace。
? ? ? ? LTTng 不僅使用了 Linux 內核中的追蹤點(tracepoint)手段,而且可以使用其他各種信息來源,比如kprobes 和 Perf(Linux 中的性能監檢測工具)。這對于調試大范圍內的bug 是非常有用的,否則這種調試工作將極具挑戰性。比如,包括并行系統和實時系統中的性能問題。另外,用戶自己定制的工具也可以加入到其中。LTTng 的設計目標是將性能影響最小化,而且在沒有跟蹤的情況下,對系統的影響應該幾乎為零。
? ? ? ? LTTng如今已支持多個發行版(Ubuntu/Dibian、Fedora、OpenSUSE、Arch etc.)和多種架構(x86 and x86-64 、ARM 、PowerPC, Sparc, Mips etc.),此外官方還說支持Android和FreeBSD系統。
更多相關知識參見: 《使用LTTng鏈接內核和用戶空間應用程序追蹤》
?
二、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 ...
2.1 ?Ubuntu ?:
從Ubuntu 12.04開始,LTTng的包可以直接從包管理器的倉庫里找到,所以安裝變得非常簡單:? ? ? ? ? ? ? ? ?sudo apt-get install lttng-tools
對于其他版本,需要添加PPA才能使用包管理器安裝(https://launchpad.net/~lttng/+archive/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)
# make modules_install
# depmod -a
2.3 OpenSUSE(或者其他的使用rpm包的Linux發行版)的RPM包:
https://build.opensuse.org/project/show?project=devel%3Atools%3Alttng2.4 Arch Linux:
https://aur.archlinux.org/packages.php?O=0&K=lttng&do_Search=Go?
三、LTTng使用實戰 -- 內核追蹤
?
首先我們得確認你是否已經安裝了lttng-modules 和lttng-tools。
?
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
假如你當前已經有了很多的會話,我們可以設置當前追蹤會話:
# 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?
?
四、LTTng使用實戰 -- 用戶空間追蹤
待以后添加。
?
五、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
? ? ├── 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中的追蹤數據并進一步分析。
?