Dies ist eine alte Version des Dokuments!
Cyclictest startet mehrere Tasks, welche periodisch aufgerufen werden. Die effektive Periodendauer wird gemessen und der Jitter wird angezeigt.
Ein Vortrag von der „Embedded Linux Conference 2013“ bietet einen guten Einstieg für die Benutzung des Cyclictest. Der Vortrag kann auf Youtube angeschaut werden. Die PPT Folien stehen hier zum Download bereit.
Siehe RT-Tests
Bei der Compile-Fehlermeldung „src/cyclictest/rt_numa.h:23:18: fatal error: numa.h: No such file or directory“ siehe Compile and install
git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
Oder bereits angepasstes Repository verwenden und anschliessend bei Punkt 7 (Build ausführen) weiterfahren.
git clone https://github.com/MarcelGehrig/rt-tests
cd rt-test
#ifdef __powerpc #define __NR_sched_setattr 355 #define __NR_sched_getattr 356 #endif
#ifndef SCHED_IDLE #define SCHED_IDLE 5 #endif
make all ARCH=powerpc CROSS_COMPILE=<pfad_zur_toolchain>powerpc-buildroot-linux-uclibc- NUMA=0
Bei der Messung der RT-Performance müssen diverse Einflüsse beachtet werden. Im Artikel Hinweise zum Messen eines RT-Systems sind die wichtigsten Einflüsse gesammelt.
sudo ./cyclictest -p 80 -t5 -n
Erzeugt 5 Threads mit höchster Priorität von -80 (-p) mit der Verwendung von nano_sleep() (-n). Genauere Informationen siehe Projektwebseite#Run_it
Das Histogramm zeigt auf, welche Latenzen wie oft auftreten. Mit folgendem Befehl speichert der Cycletest die Daten in Form von einem Histogramm ab.
sudo ./cyclictest -n -Sp80 -l600000 -i1000 -h1000 -q > histogramm.log
-n | use clock_nanosleep |
-Sp80 | S = alle Kerne; p = Priorität -80 (Realtime) |
-l600000 | 600'000 Zyklen |
-i1000 | 1000us pro Zyklus |
-h1000 | maximal Latenzen bis 1000us werden im Histogramm gemessen |
-q | quiet: keine Ausgaben während Messung |
Messdauer: | l600000*i1000 = 600e6us = 600s = 10min |
---|
Alle Messungen die länger dauern als -h1000
erscheinen nicht im Histogramm. Diese Messungen werden gezählt und am Schluss des Logfiles als Histogram Overflows: angezeigt. Die Maximale Latenz wird als Max Latencies: angezeigt.
Um das Histogramm zu plotten kann das Matlab Skript plotHistogramm.m verwendet werden.
Die vollständige Dokumentation über die Optionen findet sich auf der Webseite des Cyclictest. Die wichtigsten Optionen werden in der folgenden Liste beschrieben:
-n | use clock_nanosleep; clock_nanosleep wird von den meisten RT-Anwendungen verwendet |
-p80 | Priorität |
-l600000 | 600'000 Zyklen bis der Test sich selbst beendet. Kann auch weg gelassen werden, wenn man den Test manuell mit CTL + C beendet |
-i1000 | 1000us pro Zyklus |
-h1000 | maximal Latenzen bis 1000us werden im Histogramm gemessen |
-q | quiet: keine Ausgaben während Messung. Kann wichtig sein, wenn die SSH Verbindung die Messung stört |
-m | Der Cyclictest reserviert sich den benötigten Speicher zu beginn. Der Speicher muss nicht dynamisch zugewiesen werden. |
Für einen zyklischen Task mit einem Intervall von 1000us und der Priorität -80 ist ein Jitter von maximal 100-150us zu erwarten. Diese Ergebnisse können schlechter ausfallen, wenn zusätzliche Prozesse mit hoher Priorität (z.B. Interrupt Prozesse) laufen.
./cyclictest -n -p80 -t1 -i1000
In einem Blogpost schriebt Wolfgang Grandegger von ähnlichen Ergebnissen. Messungen innerhalb der NTB haben die Resultate bestätigt.
Alexander Bauer zeigt in seinem Paper Realtime capabilities of low-end PowerPC and ARM boards for embedded systems sogar noch bessere Ergebnisse auf. Laut diesem Paper ist der maximale Jitter gerade mal 45us. Allerdings wird nicht genau beschrieben, wie die Messung gemacht wurde. Solche Ergebnisse konnten in der NTB auch nicht reproduziert werden.
Die folgenden Messungen werden teilweise mit künstlicher Last wie CacheCalibrator oder dd durchgeführt. Mehr dazu unter Künstliche Belastungen für ein RT-System
# ./cyclictest -p 80 -t5 -n
15h 45min lange Messung
./cyclictest -p 80 -t5 -n
3 min lange Messung
Der Cache Calibrator belastet den Cache stark. Trotz dieser Belastung ist die maximale Latenz kaum gestiegen.
dd if=/dev/zero of=/dev/null
./cyclictest -p 80 -t5 -n
27 min lange Messung
T: 0 ( 695) P:80 I:1000 C:1643188 Min: 23 Act: 65 Avg: 49 Max: 120 T: 1 ( 696) P:80 I:1500 C:1095459 Min: 24 Act: 61 Avg: 51 Max: 119 T: 2 ( 697) P:80 I:2000 C: 821594 Min: 33 Act: 47 Avg: 43 Max: 89 T: 3 ( 698) P:80 I:2500 C: 657275 Min: 28 Act: 41 Avg: 51 Max: 99 T: 4 ( 699) P:80 I:3000 C: 547729 Min: 28 Act: 44 Avg: 51 Max: 114
Dank der hohen Priorität des Cyclictest von -80 wird er vom dd-Prozess, der eine Priorität von +20 hat, nicht beeinflusst.
Für folgende Tests wurde ein Laptop mit folgenden Kenndaten verwendet:
Linux Mint 17.3 Rosa wird mit einem 3.19 Kernel ausgeliefert. Für den 3.19 Kernel existiert aber kein RT-Patch. Für die RT-Tests wurde deshalb ein 3.18 Kernel verwendet. Mit dem 3.18 Kernel funktionierte das System aber nicht mehr einwandfrei. Es konnte zum Beispiel keine Netzwerkverbindung mehr aufgebaut werden.
./cyclictest -p 80 -t5 -n
19 min lange Messung
Die Messung zeigt deutlich, dass ein nicht RT gepatchter Kernel nicht für RT-Anwendungen zu gebrauchen ist.
./cyclictest -p 80 -t5 -n
83 min lange Messung
sudo ./cyclictest -n -p80 -l46800000 -i1000 -h1000 -q > histogramm.log
13h lange Messung
Das Histogramm zeigt, dass die meisten Latenzen kleiner als 250us sind. Allerdings hat es auch einige Ausreisser von bis zu 900us zu erkennen. Die Latenzen von 40us bis 250us sind vermutlich auf die SMIs, welche typisch für x86 Architekturen sind, zurückzuführen. Um die Ausreisser zu erklären sind weitere Untersuchungen notwendig.
Neben den ausgeführten Messungen können auch die Messungen von Open Source Automation Development Lab als Referenz verwendet werden. Das OSADL hat ein QA Rack, in dem diverse Prozessoren bezüglich Latenz ausgemessen werden. Die Hardwareübersicht zeigt alle Prozessoren, die gerade gemessen werden. Zu beachten ist noch, dass die von OSADL verwendeten Kernel speziell gepatched sind. Die Patches sind aber veröffentlicht. Unsere Messungen der x86 Plattform scheinen nicht auf eine brauchbare RT-Performance schliessen zu lassen. Besonders die sporadisch auftretenden Ausreisser stören. Die Messungen von OSADL zeigen aber, dass auch i7-Prozessoren eine gute RT-Performance haben können. Der Latency Plot von OSADL des i7-3615QE zeigt zum Beispiel eine viel bessere RT-Performance. Dies liegt vermutlich an den von OSADL verwendeten Patches und Kernelkonfiguration. Der oben gemessene Prozessor hat möglicherweise aber auch eine schlechtere RT-Performance, weil es sich beim i7-4600U um einen Ultra-low power Prozessor handelt (siehe Externer Link). Ein Ultra-low power Prozessor wurde von OSADL nicht gemessen.