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
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
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