Linux 實時性能測試工具——Cyclictest


Cyclictest 是 rt-tests 下的一個測試工具,也是rt-tests 下使用最廣泛的測試工具,一般主要用來測試使用內核的延遲,從而判斷內核的實時性。

1.2 cyclictest 安裝

1.2.1 基於包管理軟件安裝

Debian / Ubuntu 系統下可以直接使用apt-get install rt-tests 來安裝cyclictest。

1.2.2 git 倉庫源碼安裝

      使用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 中提到的各個參數!這將對你使用有很大的幫助。

2.1 cyclictest的簡單使用及結果分析

如果你只是想玩玩這個工具,那么對於維基主頁上提到的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

:-),運行的結果有目共睹,在以后的博客中我會介紹關於Linux 內核的實時補丁。

 .2 cyclictest 的參數介紹 

      關於cyclictest 的各個參數具體含義建議大家還是用時間具體看看 cyclictest --help 的信息(參考資料【2】為我的師兄對--help下的每個參數的解釋,大家也可以看看!)我這只介紹幾個常用的。
-p PRIO --prio=PRIO       最高優先級線程的優先級  使用時方法為: -p 90 /  --prio=90
-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 推薦參數以及結果實例

dslab@wheezy:~$ sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 1000000
我們使用 -p 90給cyclictest 賦優先級90,使用-m參數鎖定內存分配,使用  -c 0指定使用默認的MONOTONIC 時鍾, -i 200 指定一個循環為200us,結合 -l 1000000為總共1000000個循環,此外-n 為使用nanosleep 而不是簡單的sleep,-q為在運行時不打印即時信息,-h 100 為總共統計100個信息在最后的結果中。 
 
cyclictest用於測試定時器的精度,假定定時器時間間隔為 interval,定時器啟動前記錄下當前時間t1,定時器到時后記錄下當前時間t2,則測出的時延為 t2 - (t1 + interval)。
 

一、測試命令./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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM