Performance-Optimierung des Raspberry Pi

Der Start eines unkonfigurierten Raspberry Pi VZ-Images ist in der Regel noch problemlos, weil nur wenig IO-Last auf dem System liegt. Das ändert sich aber wenn der vzlogger konfiguriert wird, und dieser dann die Daten an „localhost“ sendet, so dass die PHP Middleware und MySQL zusätzliche IO-Last generieren.

Messung

Mit dem Kommando

vmstat 5

kann man einige wichtige Parameter abfragen und erste Erkenntnisse zur aktuellen Systemauslastung zu erhalten. Zusätzliche Pakete müssen dazu nicht installiert werden, erst für weitergehende Analysen muss man dann das „sysstat“ Paket installieren. Wenn Sie das Kommando starten ignorieren Sie bitte (immer) die erste Zeile der ausgegebenen Messwerte, achten Sie aber auf alle folgenden. Wenn „vzlogger“ konfiguriert und gestartet ist und fortan Messwerte sendet – und die Ausgabe dann so aussieht:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1      0 276644  15200 101032    0    0    95    11  369  130  2  2 87  9
 0  1      0 276264  15204 101036    0    0     1   158  414  267 22  4  0 74
 0  2      0 276232  15208 101036    0    0     0    10  367  142  0  1  0 99
 0  1      0 276108  15236 101036    0    0     0    18  400  181  9  4  0 87
 2  1      0 276108  15244 101036    0    0     0   134  397  248 19  5  0 76
 0  2      0 276140  15248 101036    0    0     0    18  400  184  9  1  0 90
 0  1      0 276108  15256 101040    0    0     1     8  381  186 13  4  0 83

Die Spalten ganz rechts beachten:

* „wa“ = „IOwait“ - ist die Zeit, die die CPU auf Ein-/Ausgabegeräte wie z.B. die SD-Karte warten muss * „id“ = „Idle“ ist der Prozentsatz, den das System noch zur (weiteren) Erledigung von Aufgaben übrig hat * „us“ und „sy“ sind die Prozent, die das System Rechenzeit im „User“ und „System“ Mode aufbringt

Die Messung oben stammt vom meinem Raspberry Pi mit der SD-Karte als root-Filesystem - das ist der Standardfall wenn man den Installations-Anweisungen raspberry_pi_image folgt.

Die Messwerte zeigen eindeutig, dass das System den Großteil seiner Gesamtkapazität mit der IO-Ansteuerung (der SD-Karte) verbringt. Freie Kapazität ist gar nicht mehr vorhanden (Idle = 0). Nun gibt es ja diverse SD-Karten in verschiedenen Klassen und Geschwindigkeiten, ich habe mir im Computerladen eine Auswahl zusammengestellt - allerdings ohne Erfolg, dieser IO-Bottleneck war immer vorhanden. Erschwerend kommt noch dazu, dass nicht alle Karten / Typen zuverlässig im Raspberry Pi funktionieren - und einige Karten schon nach wenigen Stunden Betrieb dauerhaft zerstört waren.

weiterführende Info

* http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

Boot via SD-Karte, root auf USB-Stick

Leider kann der Raspberry Pi nicht direkt vom USB Stick booten - das Boot-Device ist immer die SD-Karte. Allerdings kann man den Bootstring leicht abändern, so dass man schnell auf den USB Stick schalten und von dort den restlichen Boot-Vorgang fortsetzen kann.

Gehen Sie so vor:

* Erzeugen Sie sich eine SD-Karte mit einem kompletten Image - wie in raspberry_pi_image beschrieben * Machen Sie genau dasselbe mit einem USB-Stick >= 4GB * Stecken Sie nun SD-Karte und USB-Stick und Starten Sie die Stromversorgung des Rapberry Pi * Nun startet der Raspberry Pi komplett von SD-Karte * Sie können einloggen und mit

dmesg | more

alle Startmeldungen ansehen und prüfen, ob der USB-Stick erkannt wurde (als Gerät /dev/sda ). Probeweise können Sie /dev/sda2 mounten - und unmounten.

Mit

sudo nano /boot/cmdline.txt

ändern Sie nun

root=/dev/mmcblk0p2

in

root=/dev/sda2

und dann einfach mit

init 6

das System neu starten - falls der USB-Stick eine LED hat können Sie schon am „flackern“ sehen dass der boot-Vorgang nun über den USB Stick läuft.

Die Boot-Partition der SD-Karte bleibt auf /boot gemountet.

weiterführende Info

* http://www.dingleberrypi.com/2013/05/install-and-run-raspbian-from-a-usb-flash-drive/

root-Partition auf USB-Stick erweitern

Leider läßt sich mit einem root-Filesystem auf dem USB Stick der ungenutzte Platz nicht einfach wie bisher mit „raspi-config“ nutzbar machen. raspi-config merkt leider, dass das root-FS nun keine SD Karte ist und verweigert die Arbeit (don't know what to do). Ist aber kein großes Problem:

Hier die Ersatzprozedur (Unglaublich, geht wirklich am laufenden System):

sudo fdisk /dev/sda 

p ## (print) 

## Startsektor von P#2 merken (sollte 122880 sein) 

d ## (delete) 

2 ## Partition Nummer 2

n ## (new) 

p ## primary 

2 ## Partition Nummer 2

Start: <gemerkt von vorhin, hier: 122880) ## hier den vorher gemerkten Wert eingeben, NICHT den Vorschlag übernehmen

End: ## Vorschlag übernehmen 

p ## (print) 

## nun nochmal alles konkrollieren 

w  ## (write) 

reboot 

Nach (hoffentlich) erfolgreichem reboot

sudo resize2fs /dev/sda2

Dateisystem-Strukturen werden nun auf die neue Partitionsgröße angepasst - geht online auf der lebenden root Partition - kein reboot nötig

Schließlich mit

df -k

überprüfen.

VZ Konfigurieren

Nun wie gehabt vzlogger entsprechend einrichten (ist natürlich abhängig vom Zählertyp und den Kanälen die man auswerten möchte). Dann starten

IO Last überprüfen

Mit dem Kommando

vmstat 5

wie oben die Gesamtlast des Systems betrachten.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 290516  18260  88032    0    0    81     9  362  157  2  2 93  2
 2  0      0 290144  18284  88036    0    0     0    15  376  239 20  3 63 15
 0  0      0 290208  18340  88036    0    0     0   323  449  319 16  3 32 49
 0  0      0 290176  18364  88036    0    0     0    21  368  207 13  3 68 16
 2  1      0 290176  18380  88036    0    0     0   128  392  256 17  5 50 28
 0  0      0 290060  18444  88040    0    0     0   208  452  331 18  4 34 45
 0  0      0 290092  18460  88040    0    0     0    12  360  199 15  2 74  9
 7  0      0 290052  18516  88040    0    0     0   325  455  341 16  4 34 46
 0  0      0 289928  18540  88044    0    0     0    14  369  227 19  3 57 21
 0  1      0 289928  18564  88048    0    0     0   135  368  207 15  2 59 24
 2  0      0 289960  18620  88048    0    0     0   207  453  332 17  4 38 41
 0  1      0 289804  18636  88048    0    0     0    25  381  231 18  4 67 12
 0  0      0 289804  18700  88052    0    0     0   312  432  299 13  3 41 42
 2  0      0 289804  18716  88052    0    0     0    12  374  235 16  4 58 22
 0  1      0 284332  18744  93204    0    0  1032    21  550  380 21  7 43 29
 1  1      0 284224  18804  93208    0    0     0   314  451  296 14  4 36 45
 0  0      0 284256  18824  93208    0    0     0    13  367  220 14  2 62 22

In meinem Fall haben die Werte jetzt so ausgesehen - wie man sieht (Spalte „id“ ) hat das System jetzt ausreichend Kapazität frei und reagiert auch schnell und störungsfrei auf Anfragen des „frontends“.

Empfehlungen

Idealerweise legt man sich _zwei_ SD-Karten a 4GB und einen USB-Stick zurecht. Alle drei werden erst einmal mit dem Standard VZ-Raspberry Image beschrieben (und getestet).

* Auf der ersten SD-Karte modifiziert man den Boot-String wie oben beschrieben * die zweite SD-Karte hinterlegt man an einem sicheren Ort - sie kommt dann zum Einsatz, wenn das System nicht mehr startet. Dann zieht man die SD-Karte (die mit dem modifizierten boot-String) heraus und steckt diese zweite - nicht modifizierte - ein, bootet und versucht den USB-Stick mit „fsck“ zu reparieren bzw Daten zu retten. So hat man für diesen Fall gleich ein recovery System zur Hand.

Als USB-Stick habe ich einen 32GB USB3.0 für wenig Geld eingesetzt. Natürlich hat der Raspberry Pi keinen USB3.0 Port, aber ich wollte sichergehen dass die im Stick verbauten Flash-Chips keine allzugroße Geschwindigkeitsbremse darstellen.

Aktuell liegen noch keine Erfahrungswerte über die Lebensdauer des USB Sticks vor, sicher ist nur, dass früher oder später die max Anzahl Schreibzyklen erreicht sein wird und dann Probleme auftreten - und der Stick getauscht werden muss. Das sollte man von vornherein einplanen, alle Daten regelmäßig sichern, ebenso alle config files und andere nachträglich vorgenommene Anpassungen.

Denkbar wäre auch der Einsatz einer kleinen USB Festplatte (was aber wohl den Stromverbrauch erhöht) oder eine USB Sticks mit „sandforce“ Chipsatz - z.B. „USB-Stick Super Talent Express RC8 50 GB USB 3.0 silber“ darin sind die in SSD Festplatten verwendeten Chipsätze verbaut, was sich deutlich im Preis bemerkbar macht