So verwenden Sie JVM-Befehle in Java zur Fehlerbehebung bei Servern
In diesem Artikel erfahren Sie, wie Sie JVM-Befehle in Java verwenden, um die Server-Fehlerbehebung zu implementieren. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.
1. top (Linux-Befehl)
Führen Sie den top-Befehl aus: (Sehen Sie sich die Details des Prozesses 15477 an, der unten verwendet wird)
Systeminformationen (erste fünf Zeilen):
Zeile 1: Informationen zur obersten Aufgabenwarteschlange (Systembetriebsstatus und durchschnittliche Auslastung), das gleiche Ergebnis wie uptime-Befehl.
Durchschnittliche Systemlast: Bei einer Single-Core-CPU bedeutet 0,00 keine Last, 1,00 bedeutet nur Volllast, mehr als 1 bedeutet Überlastung Idealwert ist 0,7;
Multi-Core-CPU-Last: Anzahl der CPU-Kerne * Idealwert 0,7 = Ideallast, zum Beispiel: 4-Core-CPU-Last überschreitet nicht 2,8, was bedeutet es gibt keine hohe Belastung.
Format: bis xx Tage, HH:MM
Zum Beispiel: 241 Tage, 20:11, bedeutet Dauerbetrieb für 241 Tage, 20 Stunden und 11 Minuten
Abschnitt 1: Aktuelle Systemzeit, zum Beispiel: 16:07:37
-
Absatz 2: Systemlaufzeit, die Zeit bis zum Neustart. Je länger die Zeit, desto stabiler ist das System.
Absatz 3: Die aktuelle Anzahl der angemeldeten Benutzer, zum Beispiel: 1 Benutzer, was bedeutet, dass derzeit nur 1 Benutzer angemeldet ist
Absatz 4 Segment: Systemlast, also die durchschnittliche Länge der Aufgabenwarteschlange. Die drei Werte zählen jeweils die durchschnittliche Systemlast in den letzten 1, 5 und 15 Minuten
Zeile 2: Aufgaben prozessbezogene Informationen
Absatz 1: Gesamtzahl der Prozesse, zum Beispiel: Aufgaben : 231 insgesamt, was bedeutet, dass insgesamt 231 Prozesse ausgeführt werden
Absatz 2: Anzahl der laufenden Prozesse, zum Beispiel: 1 läuft,
Absatz 3: Anzahl der schlafenden Prozesse, zum Beispiel: 230 schlafende,
Absatz 4: Anzahl der gestoppten Prozesse, zum Beispiel: 0 gestoppt,
Absatz 5: Anzahl der Zombie-Prozesse, zum Beispiel: 0 Zombie
Zeile 3: CPU-bezogene Informationen Wenn es sich um eine Multi-Core-CPU handelt, drücken Sie die Zahl 1 um die CPU-Informationen jedes Kerns anzuzeigen. Zu diesem Zeitpunkt wird die Zeile 1 in die Zeile mit der CPU-Kernnummer umgewandelt und die Nummer 1 kann hin und her geschaltet werden.
Absatz 1:
us
Prozentsatz der vom Benutzer belegten CPU , zum Beispiel: CPU(s): 12,7 % uns,Absatz 2:
sy
Kernel-Speicherplatz belegt CPU-Prozentsatz, zum Beispiel: 8,4 %sy,Absatz 3:
ni
Der CPU-Prozentsatz, der von Prozessen belegt wird, deren Prioritäten im Benutzerprozessbereich geändert wurden, zum Beispiel: 0,0 %ni,Absatz 4:
id
Der CPU-Prozentsatz im Leerlauf, z Beispiel: 77,1 %id,Absatz 5:
wa
Prozentsatz der CPU-Zeit, die auf Ein- und Ausgabe wartet, zum Beispiel: 0,0%wa,-
Absatz 6 Absatz:
hi
Gesamtzeit, die die CPU für die Bearbeitung von Hardware-Interrupts aufgewendet hat, zum Beispiel: 0,0 %hi, Absatz 7:
si
Gesamtzeit, die von der CPU aufgewendet wurde CPU-Wartungs-Soft-Interrupts, zum Beispiel: 1,8 %si,Absatz 8:
st
Zeit stehlen Die CPU-Zeit, die der virtuellen Maschine vom Hypervisor gestohlen wurde (wenn die VM derzeit unter ein Hypervisor, tatsächlich verbraucht der Hypervisor auch einen Teil der CPU-Verarbeitungszeit)Zeile 4: Mem-Speicherbezogene Informationen (Speicher: 12196436 KB insgesamt, 12056552 KB verwendet, 139884 KB frei, 64564 KB Puffer)
Segment 1: Gesamter physischer Speicher, zum Beispiel: Speicher: 12196436 KB insgesamt,
Absatz 2: Gesamtmenge des verwendeten physischen Speichers, zum Beispiel: 12056552k verwendet,
Absatz 3: Gesamtmenge des freien Speichers, zum Beispiel : Mem: 139884k frei,
Absatz 4: Die Menge an Speicher, die als Kernel-Cache verwendet wird, zum Beispiel: 64564k Puffer
Zeile 5: Informationen zur Swap-Partition (Swap: insgesamt 2097144 KB, 151016 KB verwendet, 1946128 KB frei, 3120236 KB zwischengespeichert)
Absatz 1: Gesamtgröße des Swap-Bereichs, zum Beispiel: Swap: 2097144k insgesamt,
Absatz 2: Gesamtmenge des genutzten Swap-Bereichs, zum Beispiel: 151016k genutzt,
Absatz 3 : Gesamtmenge des freien Swap-Bereichs, zum Beispiel: 1946128k frei,
Absatz 4: Gesamter gepufferter Swap-Bereich, 3120236k zwischengespeichert
Prozessinformationen:
Drücken Sie f im oberen Befehl, um die angezeigten Spalteninformationen anzuzeigen. Drücken Sie den entsprechenden Buchstaben, um die Spalte ein-/auszuschalten Buchstaben bedeuten aus. Die mit * gekennzeichneten Spalten sind die Standardspalten.
A:
PID
= (Prozess-ID) Prozess-ID;E:
USER
= (Benutzername) Der Benutzername des ProzesseigentümersH:
PR
= (Priorität) PrioritätI:
NI
= (Schöner Wert) Schöner Wert. Negative Werte stehen für hohe Priorität, positive Werte stehen für niedrige PrioritätO:
VIRT
= (Virtual Image (kb)) Der gesamte virtuelle Speicher Wird vom Prozess verwendet Menge, Einheit kb. VIRT=SWAP+RESF:
RES
= (Residente Größe (kb)) Die Größe des physischen Speichers, der vom Prozess verwendet und nicht ausgelagert wird , Einheit kb. RES=CODE+DATAT:
SHR
= (Shared Mem size (kb)) Shared Memory-Größe, Einheit kbW :
S
= (Prozessstatus) Prozessstatus. D = ununterbrochener Schlafzustand, R = läuft, S = Schlaf, T = verfolgen/stoppen, Z = Zombie-ProzessK:
%CPU
= (CPU Auslastung) Der Prozentsatz der seit der letzten Aktualisierung belegten CPU-ZeitN:
%MEM
= (Speichernutzung (RES) ) Prozentsatz vom Prozess genutzter physischer SpeicherM:
TIME
+ = (CPU-Zeit, Hundertstel) Gesamte CPU-Zeit, die vom Prozess genutzt wird, Einheit 1/100 Sekunde
b:PPID
= (Parent Process Pid) Parent Process Id
c:RUSER
= (Echter Benutzername)
d:UID
= (User Id) Benutzer-ID des Prozesses Eigentümer
f:GROUP
= (Gruppenname) Der Gruppenname des Prozesses Eigentümer
g:TTY
= (Steuer-Tty) Der Terminalname des gestarteten Prozesses. Prozesse, die nicht vom Terminal aus gestartet werden, werden angezeigt als: = (Ausgelagerte Größe (KB)) Die Größe des vom Prozess verwendeten virtuellen Speichers, der ausgelagert wird, Einheit KB
l:P
= (CPU-Zeit) Die gesamte vom Prozess verwendete CPU-Zeit, Einheit Sekunden
r:SWAP
= (Codegröße (kb)) Die Größe des physischen Speichers, der vom ausführbaren Code belegt wird, in kb
s:TIME
= (Daten+Stackgröße (kb)) Der andere Teil als der ausführbare Code (Datensegment + Stapel) Größe des belegten physischen Speichers, Einheit KB
u:CODE
= (Anzahl der Seitenfehler) Anzahl der Seitenfehler
v:DATA
= (Anzahl der fehlerhaften Seiten) Das letzte Mal, dass in die Gegenwart geschrieben wurde, wurde geändert. Anzahl der Seiten
y:nFLT
= (Schlafende Funktion) Wenn der Prozess schläft, wird der Name der Systemfunktion im Ruhezustand angezeigt
z:nDRT
= (Task Flags) Task Flags finden Sie unter sched.h WCHAN
Flags
Weitere Informationen finden Sie in der ausführlichen Erläuterung des Top-Befehls des Linux-Leistungsanalysetools Führen Sie die PID top -Hp aus, z. B. top -Hp 15477-
Threads in einem Prozess anzeigen
Hinweis: Zu diesem Zeitpunkt ist die PID die Thread-IDCOMMAND
2. jstack
Referenz Java-Befehl – Jstack-ToolJava-Befehlslernserie (2) – Jstack
Muss gehen zu JDK Verwenden Sie es im Installationsverzeichnis (Sie können den Java-Prozess über ps Hexadezimal = 3cd3 anzeigen) StatusMonitor Monitor:
Monitor ist das wichtigste Mittel in Java, um gegenseitigen Ausschluss und Zusammenarbeit zwischen Threads zu erreichen Objekt- oder Klassensperre.
Entrt Set: Zeigt an, dass die Thread-Anfragen, um die Sperre des Objekts durch Synchronisierung zu erhalten. Wenn das Objekt gesperrt ist, geben Sie den Eigentümer ein; andernfalls warten Sie im Eingangsbereich. Sobald die Objektsperre von anderen Threads aufgehoben wird, nimmt sie sofort am Wettbewerb teil.
Der Besitzer: Zeigt an, dass ein Thread erfolgreich um die Objektsperre konkurriert hat.
Wait Set: Gibt an, dass der Thread die Sperre des Objekts über die Methode object.wait() des Objekts aufhebt und im Wartebereich darauf wartet, geweckt zu werden.
Wie Sie auf dem Bild sehen können, kann ein Monitor zu einem bestimmten Zeitpunkt nur einem Thread gehören, und dieser Thread ist <code><span style='font-family: "Microsoft YaHei"'>Active Thread</span>
Aktiver Thread <span style='font-family: "Microsoft YaHei"'>Waiting</span> <span style='font-family: "Microsoft YaHei"'>Thread</span>
, während andere Threads <code><span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>
Warten<span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>
Thread
Eintrag sind Warten Sie innerhalb von Set<code><span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>
und Wait<code><span style='font-family: "Microsoft YaHei"'>Waiting for monitor entry</span>。
Set. <span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>
Die Thread-Aktion, die in <code><span style='font-family: "Microsoft YaHei"'>in Object.wait()</span>
Entry Set
<p>Warten auf Monitoreintrag<span style="color: #888888">. </span></p>
Die Thread-Aktion, die in <strong>Wait</strong>
wartet, ist in Object.wait(). Wenn ein Thread den Eintritt in den kritischen Abschnitt beantragt, gelangt er in die Eintragssatzwarteschlange.
(Wir nennen das durch synchronisiert geschützte Codesegment den kritischen Abschnitt. Wenn ein Thread beantragt, in den kritischen Abschnitt einzutreten, gelangt er in die Warteschlange „Entry Set“) Threadstatus:
NEU: Nicht gestartet. Wird nicht im Dump angezeigt. RUNNABLE: Wird in der virtuellen Maschine ausgeführt und läuft im Status. Der Besitzerbereich
BLOCKIERT: Blockiert und wartet auf Monitorsperre. Warten Sie auf die Sperre im Bereich „Entry Set“ .
WATING: Warten auf unbestimmte Zeit darauf, dass ein anderer Thread einen bestimmten Vorgang ausführt.
Im Warte-Set-Bereich
warten Sie, bis eine bestimmte Bedingung oder Überwachung eintritt, und bleiben dabei normalerweise bei Anweisungen wie wait().
TIMED_WATING: Zeitlich begrenztes Warten auf eine bestimmte Operation von einem anderen Thread. Im Bereich
WaitSet besteht der Unterschied zwischen und WAITING darin, dass wait() und andere Anweisungen ein Zeitlimit von wait(timeout) hinzufügen.
BEENDET: Beendet. Aufrufänderung weist auf zusätzliche wichtige Vorgänge hin, wenn der Thread eine Methode aufruft. Ändern Sie den obigen Methodenaufruf.
gesperrt
Warten auf Sperre
Ziel: Antrag auf Objektsperre mit Synchronisierung war erfolglos, Warten auf die Sperre im Eintragssatzbereich. Der Thread-Status lautet „Blockiert“Warten auf
Ziel: Nach erfolgreicher Beantragung der Objektsperre mithilfe der Synchronisierung die Sperre aufheben,
auf die Sperre warten im Warte-Set-Bereich. Der Thread-Status ist WAITING oder TIMED_WATING
Parken zum Warten
Ziel: park() wird aufgerufen, befindet sich im Wartebereich und wartet auf Erlaubnis.(Park ist ein grundlegendes Thread-Blockierungsprimitiv, das keine Objekte über den Monitor blockiert.
Park: Geben Sie den Wartezustand ein, vergleichen Sie Durch Warten kann der Thread in den Wartezustand versetzt werden, ohne die Sperre zu erhalten, und durch Entparken aktiviert werden)
Thread-Aktion
Der Grund, warum der Thread-Status generiert wird.
runnable: Der Besitzerbereich, Status RUNNABLEin Object.wait(): Call wait(), Wait Set-Bereich, Status ist WAITING oder TIMED_WAITING, Warten auf Warten auf Monitoreintritt ändern: Warten auf Sperre, Eintragssatzbereich, Status BLOCKIERT, Warten auf Sperren ändernWarten auf Bedingung : Aufgrund bestimmter Bedingungen geparkt, Wartebereich festgelegt, Status ist „Parken zum Warten“Schlafen: Schlafender Thread, genannt Thread.sleep()Zusammenfassung
1. Überprüfen Sie den Thread-Dump. Sehen Sie sich zunächst den Thread-Status/die Thread-Aktion an (intuitiver). Sie können feststellen, in welcher Phase sich der Thread derzeit befindet. Schauen Sie sich dann die Anrufänderung und den Sperrstatus an. Sie können grundsätzlich feststellen, ob ein Problem mit dem sekundären Thread vorliegt.
2. Sie können Thread-Snapshots in einem kurzen Zeitraum (dem Zeitraum, in dem) mehrmals gedruckt werden (es kann ein Problem geben) und dann prüfen, ob ein Problem vorliegt. Diese Situation eines bestimmten Threads kann das Problem effektiv finden.
3. jps
Ähnlich dem Linux-Befehl ps
Referenz Java-Befehlslernreihe (1) - Jps
./jps
./jps -q
./jps -m
./jps -l
./jps -v
4. jmap
Referenz : Java-Befehlslernreihe (3) - Jmap
java command--jmap command use
jmap -heap PID: Heap-Nutzung
jmap -histo PID: Objektsituation
(jmap -histo:live Dieser Befehl wird ausgeführt, die JVM löst zuerst gc aus und sammelt dann statistische Informationen
Konzentrieren Sie sich auf die Klassen im Projekt: [C ist ein String-Array, String wird verwendet; [B ist ein Byte-Array, das von der Netzwerkschicht verwendet wird. Es spielt keine Rolle, ob diese beiden größer sind
[C ist ein Zeichen[]
[S ist ein Short[ ]
[I ist ein Int[]
[B ist ein Byte[]
[ [Ich bin ein int[] []
Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Lernen aller hilfreich sein. Weitere verwandte Tutorials finden Sie unter Java-Video-Tutorial, Java-Entwicklungsgrafik-Tutorial, Bootstrap-Video-Tutorial!
Das obige ist der detaillierte Inhalt vonSo verwenden Sie JVM-Befehle in Java zur Fehlerbehebung bei Servern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Es gibt viele Fragen, die Linux-Anfänger oft stellen: „Verfügt Linux über einen Task-Manager?“, „Wie öffnet man den Task-Manager unter Linux?“ Windows-Benutzer wissen, dass der Task-Manager sehr nützlich ist. Sie können den Task-Manager öffnen, indem Sie in Windows Strg+Alt+Entf drücken. Dieser Task-Manager zeigt Ihnen alle laufenden Prozesse und den von ihnen belegten Speicher, und Sie können einen Prozess aus dem Task-Manager-Programm auswählen und beenden. Wenn Sie Linux zum ersten Mal verwenden, werden Sie auch nach etwas suchen, das einem Task-Manager unter Linux entspricht. Ein Linux-Experte verwendet am liebsten die Befehlszeile, um Prozesse, Speicherverbrauch usw. zu finden, aber Sie müssen das nicht tun

Die Unterstützung für Chinesisch durch Zabbix ist nicht sehr gut, aber manchmal wählen wir Chinesisch für Verwaltungszwecke. In der von Zabbix überwachten Weboberfläche werden unter dem Grafiksymbol kleine Quadrate angezeigt. Dies ist falsch und erfordert das Herunterladen von Schriftarten. Beispiel: „Microsoft Yahei“, „Microsoft Yahei.ttf“ heißt „msyh.ttf“, laden Sie die heruntergeladene Schriftart nach /zabbix/fonts/fonts hoch und ändern Sie die beiden Zeichen in /zabbix/include/defines.inc.php Datei unter define('ZBX_GRAPH_FONT_NAME','DejaVuSans');define('ZBX_FONT_NAME'

Wussten Sie, wie man das Erstellungsdatum eines Kontos auf einem Linux-System überprüft? Wenn Sie es wissen, was können Sie tun? War es Ihnen gelungen? Wenn ja, wie geht das? Grundsätzlich verfolgen Linux-Systeme diese Informationen nicht. Welche alternativen Möglichkeiten gibt es also, an diese Informationen zu gelangen? Sie fragen sich vielleicht, warum ich das überprüfe? Ja, es gibt Situationen, in denen Sie diese Informationen möglicherweise noch einmal überprüfen müssen, und sie werden Ihnen zu diesem Zeitpunkt hilfreich sein. Zur Überprüfung können Sie die folgenden 7 Methoden verwenden. Verwenden Sie /var/log/secure. Verwenden Sie das aureport-Tool. Verwenden Sie .bash_logout. Verwenden Sie den Befehl chage. Verwenden Sie den Befehl useradd. Verwenden Sie den Befehl passwd. Verwenden Sie den letzten Befehl. Methode 1: Verwenden Sie /var/l

Systemweite Installation Wenn Sie eine Schriftart systemweit installieren, steht sie allen Benutzern zur Verfügung. Der beste Weg hierfür ist die Verwendung von RPM-Paketen aus den offiziellen Software-Repositories. Bevor Sie beginnen, öffnen Sie das „Software“-Tool in Fedora Workstation oder andere Tools, die das offizielle Repository verwenden. Wählen Sie in der Auswahlleiste die Kategorie „Add-ons“ aus. Wählen Sie dann innerhalb der Kategorie „Schriftarten“ aus. Sie sehen die verfügbaren Schriftarten ähnlich wie im Screenshot unten: Wenn Sie eine Schriftart auswählen, werden einige Details angezeigt. Abhängig von mehreren Szenarios können Sie möglicherweise eine Vorschau einiger Beispieltexte für die Schriftart anzeigen. Klicken Sie auf die Schaltfläche „Installieren“, um es Ihrem System hinzuzufügen. Abhängig von der Systemgeschwindigkeit und der Netzwerkbandbreite kann dieser Vorgang einige Zeit dauern

1. Suchen Sie die Schriftarten Wingdings, Wingdings2, Wingdings3, Webdings und MTExtra im Internet. 2. Öffnen Sie den Hauptordner, drücken Sie Strg+h (versteckte Dateien anzeigen) und prüfen Sie, ob ein .fonts-Ordner vorhanden ist 1. Kopieren Sie die heruntergeladenen Schriftarten wie Wingdings, Wingdings2, Wingdings3, Webdings und MTExtra in den .fonts-Ordner im Hauptordner. Starten Sie dann wps, um zu sehen, ob immer noch ein Erinnerungsdialogfeld „System fehlt“ angezeigt wird Box. Wenn nicht, nur Erfolg!

Experimentelle Umgebung: Betriebssystem: LinuxCentos7.4x86_641. Sehen Sie sich die aktuelle Serverzeitzone an, listen Sie die Zeitzone auf und legen Sie die Zeitzone fest (wenn es bereits die richtige Zeitzone ist, überspringen Sie sie bitte): #timedatectl#timedatectllist-timezones#timedatectlset-timezoneAsia /Shanghai2. Verständnis der Zeitzonenkonzepte: GMT, UTC, CST, DSTUTC: Die gesamte Erde ist aus Gründen der Vereinheitlichung in vierundzwanzig Zeitzonen unterteilt. Es wird eine einheitliche Zeit verwendet, die als Universal Coordinated Time (UTC) bezeichnet wird

So verwenden Sie ein Netzwerkkabel, um zwei Ubuntu-Hosts mit dem Internet zu verbinden 1. Bereiten Sie Host A: Ubuntu16.04 und Host B: Ubuntu16.042 vor. Host A verfügt über zwei Netzwerkkarten, eine ist mit dem externen Netzwerk verbunden und die andere ist angeschlossen Gastgeber B. Verwenden Sie den Befehl iwconfig, um alle Netzwerkkarten auf dem Host anzuzeigen. Wie oben gezeigt, sind die Netzwerkkarten auf dem A-Host (Laptop) des Autors: wlp2s0: Dies ist eine drahtlose Netzwerkkarte. enp1s0: kabelgebundene Netzwerkkarte, die mit Host B verbundene Netzwerkkarte. Der Rest hat nichts mit uns zu tun, kein Grund zur Sorge. 3. Konfigurieren Sie die statische IP von A. Bearbeiten Sie die Datei #vim/etc/network/interfaces, um eine statische IP-Adresse für die Schnittstelle enp1s0 zu konfigurieren, wie unten gezeigt (wobei #==========

Aufgrund unterschiedlicher CPU-Architekturen ist die Ausführung von DOS auf dem Raspberry Pi zwar nicht einfach, stellt aber auch keine großen Probleme dar. FreeDOS dürfte jedem bekannt sein. Es ist ein vollständiges, kostenloses und gut kompatibles Betriebssystem für DOS. Es kann einige ältere DOS-Spiele oder kommerzielle Software ausführen und auch eingebettete Anwendungen entwickeln. Solange das Programm unter MS-DOS ausgeführt werden kann, kann es auch unter FreeDOS ausgeführt werden. Als Initiator und Projektkoordinator von FreeDOS werden mir viele Anwender als Insider Fragen stellen. Die Frage, die mir am häufigsten gestellt wird, ist: „Kann FreeDOS auf einem Raspberry Pi laufen?“ Diese Frage ist nicht überraschend. Schließlich läuft Linux auf dem Raspberry Pi sehr gut
