Cyclictest 是 rt-tests 下的一個測試工具,也是rt-tests 下使用最廣泛的測試工具,一般主要用來測試使用內核的延遲,從而判斷內核的實時性。
Debian / Ubuntu 系統下可以直接使用apt-get install rt-tests 來安裝cyclictest。
使用Linux最大的好處就是我們可以下載軟件的源碼,學習、編譯以及使用,所以如果使用上述方法直接安裝使用,如果你覺得有的問題不懂或者出現問題你也沒辦法解決,所以從開發者的角度而言,下載安裝軟件還是下載源碼包編譯后使用比較好。
(1) 首先拷貝cyclictest的Git 倉庫
# git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
(2) 進入git倉庫
# cd rt-tests
(3)創建一個分支,比如我們起名叫testing
# git branch testing
(4)轉到testing分支,之后我們做的步驟都不會對主分支有影響,這是我們在電腦上使用 git 倉庫的常用方法
# git checkout testing
(5)查看我們當前在哪個分支
# git branch
master
* testing
(6)在次我們使用make編譯
# make
編譯時我們會遇到缺失numa.h 的錯誤提示,在此我建議童鞋們安裝使用apt-file 來解決此類錯誤(有了apt-file,遇到這類錯誤我們就知道如何解決而不是一味的上網找別人的解決方法),主要步驟如下:
# sudo apt-get install apt-file // 安裝apt-file
# apt-file update // 類似於apt-get ,apt-file也需要根據系統配的源來更新一個庫
# apt-file search numa.h // 使用apt-file search 搜索我們缺失的文件
libhwloc-dev: /usr/include/hwloc/linux-libnuma.h
libnuma-dev: /usr/include/numa.h // 在搜索到的結果中,我們發現這個包叫做 libnuma-dev 應該就是我們需要安裝的包
linux-headers-3.2.0-4-amd64: /usr/src/linux-headers-3.2.0-4-amd64/include/config/acpi/numa.h
linux-headers-3.2.0-4-amd64: /usr/src/linux-headers-3.2.0-4-amd64/include/config/amd/numa.h
....
# apt-get install libnuma-dev // 使用apt-get 安裝libnuma-dev 包
2. cyclictest 的使用及參數簡介
對於Cyclictest的使用我們得先了解它的各個參數的含義,所以在你開始使用之前,請你看一下 cyclictest --help 中提到的各個參數!這將對你使用有很大的幫助。
如果你只是想玩玩這個工具,那么對於維基主頁上提到的tglx 使用的測試命令來測測你的電腦性能:
# sudo ./cyclictest -t1 -p 80 -n -i 10000 -l 10000
注:在rt-tests的路徑下,我們可以使用 ./cyclictest 來運行cyclictest, 而在別的目錄下,我們就需要指定 cyclictest的路徑來使用,比如說 /home/long/rt-tests/cyclictest ,或者你也可以直接將 rt-tests的路徑下的 cyclictest 拷貝到 /bin/ 下,以后就可以直接使用 cyclictest 而不需要指定路徑了!!
比如在我的電腦上,我使用這個命令測試的結果如下:
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.38 0.29 0.26 1/381 5595
T: 0 ( 5592) P:80 I:10000 C: 10000 Min: 2 Act: 15 Avg: 15 Max: 195
輸出結果含義:
T: 0 序號為0的線程
P: 0 線程優先級為0
C: 9397 計數器。線程的時間間隔每達到一次,計數器加1
I: 1000 時間間隔為1000微秒(us)
Min: 最小延時(us)
Act: 最近一次的延時(us)
Avg:平均延時(us)
Max: 最大延時(us)
所以我們當前的機器上最小延時為2,平均為15,最大的為 195。
$uname -a // 我們可以使用 “ uname -a ” 看到我們系統目前使用的內核版本
Linux wheezy 3.2.51-trace #8 SMP Thu Nov 21 12:34:04 CST 2013 x86_64 GNU/Linux
$ cat /boot/config-3.2.51-trace |grep CONFIG_PREEMPT_RT // 我們再打開 /boot 下面的當前內核的config信息查看目前這個內核是否打上實時補丁,結果顯示並沒有。所以在一個普通的內核下測的 Min: 2 Act: 15 Avg: 15 Max: 195 這樣的數據算是不錯的了!
$ cat /boot/config-3.10.17-trace-rt12 |grep CONFIG_PREEMPT_RT // 而在我 /boot 目錄下的另外一個打好實時補丁的內核中
CONFIG_PREEMPT_RT_BASE=y
# CONFIG_PREEMPT_RTB is not set
CONFIG_PREEMPT_RT_FULL=y // 判斷一個內核是否是實時內核,請看config 下有沒有此項
我得到的cyclictest 運行結果是這樣的:
T: 0 ( 5592) P:80 I:10000 C: 10000 Min: 1 Act: 1 Avg: 2 Max: 9
.2 cyclictest 的參數介紹
-m --mlockall 鎖定當前和將來的內存分配
-c CLOCK --clock=CLOCK 選擇時鍾 cyclictest -c 1
0 = CLOCK_MONOTONIC (默認)
1 = CLOCK_REALTIME
-i INTV --interval=INTV 基本線程間隔,默認為1000(單位為us),下面介紹原理的時候會提到
-l LOOPS --loops=LOOPS 循環的個數,默認為0(無窮個),與 -i 間隔數結合可大致算出整個測試的時間,比如 -i 1000 -l 1000000 ,總的循環時間為1000*1000000=1000000000 us =1000s ,所以大致為16分鍾多。
-n --nanosleep 使用 clock_nanosleep
-h HISTNUM --histogram=US 在執行完后在標准輸出設備上畫出延遲的直方圖(很多線程有相同的權限)US為最大的跟蹤時間限制,這個在下面介紹實例時可以用到,結合gnuplot 可以畫出我們測試的結果圖。
-q --quiet 使用-q 參數運行時不打印信息,只在退出時打印概要內容,結合-h HISTNUM參數會在退出時打印HISTNUM 行統計信息以及一個總的概要信息。
-f --ftrace ftrace函數跟蹤(通常與-b 配套使用,其實通常使用 -b 即可,不使用 -f )
-b USEC --breaktrace=USEC 當延時大於USEC指定的值時,發送停止跟蹤。USEC,單位為謬秒(us)。
2.3 推薦參數以及結果實例
一、測試命令./cyclictest –p 80 –t5 –n
1. 默認創建5個SCHED_FIFO策略的realtime線程,優先級80,運行周期是1000,1500,2000,2500,3000微秒,無干擾測試結果圖:
由此可見在AdvLinux3.0.2實時系統,最小值在2~3微秒,平均值為9-11微秒,而最大值則分布在24-29微秒之間。
2.運行同樣的測試,但是在運行這個測試的過程中引入更多的干擾,如將該設備與其它設備進行串口通信,則結果變為有干擾測試結果圖:
引入串口通信過程,最大值為34us。沒有出現AdvLinux3.0.2非實時系統下,最大值為1219微秒。
二、測試命令./cyclictest--smp -p95 -m
這一結果顯示了Cyclictest工具運行在一個四核系統,在所有內存都鎖定的情況下,每個內核運行一個測量線程,它們每一個SCHED_FIFO優先級是95,鎖定內存分配。在測試的結果中,CPU0的最大延遲是33us,平均延遲是9us; CPU1的最大延遲是33us,平均延遲是9us; CPU2的最大延遲是32us,平均延遲是12us; CPU3的最大延遲是29us,平均延遲是13us.
cat /proc/cpuinfo查看系統是幾核系統
三、測試命令./cyclictest -t1 -p 80 -n -i number -l10000
線程優先級為80,不同的時間間隔下的結果,其中,C:9397計數器。線程的時間間隔每達到一次,計數器加1
Min:最小時延(us);Act:最近一次的時延(us);Avg:平均時延(us);Max: 最大時延(us)
I為500us時,最小延時為2,平均為11,最大的為 26。I為10000us時,最小延時為4,平均為17,最大的為 33。