Erläuterung der Werte in Linux htop/top (2019)
(peteris.rocks)- Ausgehend vom htop-Bildschirm unter Ubuntu Server 16.04 x64 wird anhand von
/procund Befehlsausgaben nachverfolgt, was uptime, load average, Tasks, PID, Prozessbaum, Status, CPU-Zeit, Priorität und Speicherkennzahlen tatsächlich bedeuten - Viele Werte auf dem Bildschirm stammen aus procfs und Systemdateien wie
/etc/passwd,/etc/group,/etc/shadowund/etc/nsswitch.conf; mitstracelässt sich prüfen, welche Dateien ein Programm liest - Load average ist nicht dasselbe wie CPU-Auslastung, sondern ein exponentiell gedämpfter gleitender Durchschnitt, der laufende Prozesse, Prozesse in der Ausführungswarteschlange und Prozesse im uninterruptible-Zustand umfasst
- Statuscodes wie
R,S,D,Z,Tundthängen mit Signalen,killsowie dem Verhalten vonfork/exec/waitzusammen und liefern Hinweise darauf, warum ein Prozess angehalten ist oder bestehen bleibt VIRT,RES,SHRundMEM%zeigen virtuellen Speicher, physischen Speicher und gemeinsam nutzbaren Speicher aus unterschiedlichen Perspektiven; aus einer einzelnen Zahl lässt sich die tatsächliche Speichernutzung daher schwer eindeutig ableiten
Woher kommen die htop-Werte?
uptimezeigt, wie lange das System bereits läuft; dieselbe Information lässt sich auch mit dem Befehluptimeanzeigen- Das Programm
uptimeliest/proc/uptime- Die erste Zahl ist die gesamte Zeit in Sekunden, seit der das System eingeschaltet ist
- Die zweite Zahl ist die Zeit in Sekunden, in der das System im Idle-Zustand war
- Auf Mehrkernsystemen wird die Idle-Zeit pro Core aufsummiert und kann daher größer sein als die gesamte Uptime
- Mit
strace uptime 2>&1 | grep openoderstrace -e open uptimekann man sehen, welche Dateienuptimeöffnet- Beispielausgaben enthalten
/proc/uptime,/var/run/utmpund/proc/loadavg
- Beispielausgaben enthalten
- Die Zahlen in
/proc/uptimeeignen sich gut für Programme oder Skripte, während die Ausgabe vonuptimemenschenlesbar formatiert ist
Load average und CPU-Auslastung
- Die ersten drei Werte in
/proc/loadavggeben die System-Load-Average der letzten 1, 5 und 15 Minuten an - Der vierte Wert zeigt die Zahl der aktuell laufenden Prozesse und die Gesamtzahl der Prozesse in einer Form wie
1/120; der letzte Wert ist die zuletzt verwendete PID - Wenn ein neuer Prozess gestartet wird, wird ihm eine PID zugewiesen; PIDs steigen normalerweise an und werden wiederverwendet, wenn der Wertebereich erschöpft ist
- PID 1 gehört zu
/sbin/init, das beim Booten gestartet wird
- PID 1 gehört zu
- Wenn in
htopnur ein laufender Prozess zu sehen ist, kann dieser eine Prozesshtopselbst sein sleep 30läuft nicht aktiv, sondern befindet sich im Sleep-Zustand und erhöht daher nicht die Zahl der running processes- Eine Aufgabe, die wie
cat /dev/urandom > /dev/nulldauerhaft CPU verwendet, erhöht die Zahl der running processes und die load average - Die Load number zählt Prozesse, die laufen oder auf Ausführung warten, sowie Prozesse im uninterruptible-Zustand
- Die load average ist kein einfacher Durchschnitt, sondern ein exponentiell gedämpfter gleitender Durchschnitt
- Auch die 1-Minuten-Load-Average berücksichtigt nicht nur die letzten 60 Sekunden, sondern gewichtet die letzte Minute stärker und bezieht frühere Aktivität teilweise mit ein
- Auf einem Ein-CPU-System kann man bei einem einzelnen CPU-bound-Prozess eine load average von
1.00vereinfacht als 100 % CPU-Auslastung betrachten- Auf einem 2-Core-System entspräche dieselbe Situation vereinfacht 50 % CPU-Auslastung
- Die load average, die auf einem 2-Core-System einer CPU-Auslastung von 100 % entspricht, lässt sich vereinfacht als
2.00ansetzen
- Diese Vereinfachung stimmt nicht immer, weil Prozesse im uninterruptible-Zustand in die Load einfließen
- Es kann also auch Situationen mit hoher load average geben, in denen die CPU-Auslastung nicht hoch ist
- Die momentane CPU-Auslastung lässt sich mit
mpstatprüfensudo apt install sysstat -ympstat 1
Tasks, PID, Prozessbaum
- Tasks oben rechts in
htopzeigt die Gesamtzahl der Prozesse und die Zahl der laufenden Prozesse an - Der Linux-Kernel bezeichnet Prozesse intern als Tasks;
htopverwendet Tasks statt Processes, um Platz auf dem Bildschirm zu sparen - Mit
Shift+Hkann die Anzeige von Threads umgeschaltet werden- Wenn etwas wie
Tasks: 23, 10 thrzu sehen ist, werden Threads angezeigt
- Wenn etwas wie
- Mit
Shift+Kkann die Anzeige von Kernel-Threads umgeschaltet werden- Wenn etwas wie
Tasks: 23, 40 kthrzu sehen ist, werden Kernel-Threads angezeigt
- Wenn etwas wie
- Jedes Mal, wenn ein neuer Prozess startet, wird eine PID zugewiesen
- Bei einer Ausführung im Hintergrund wie
sleep 1000 &werden Job-Nummer und PID angezeigt $!inbashwird zur ID des letzten Hintergrundprozesses erweitert
- Bei einer Ausführung im Hintergrund wie
- Prozessbezogene Informationen befinden sich unter
/proc/<pid>//proc/<pid>/cmdlineenthält den ausgeführten Befehl; Argumente sind durch\0-Bytes getrennt- Mit
tr '\0' '\n' < /proc/<pid>/cmdlineoderstrings /proc/<pid>/cmdlinelässt sich das lesbarer anzeigen /proc/<pid>/cwdist ein Link auf das aktuelle Arbeitsverzeichnis, und/proc/<pid>/exeist ein Link auf das ausgeführte Binary
- Diagnosewerkzeuge wie
htop,topundpslesen Prozessdetails aus/proc/<pid>/<file> - Der Erzeuger eines neuen Prozesses ist der parent process, der neu erzeugte Prozess ist der child process; diese Beziehung bildet den Prozessbaum
- Drückt man in
htopF5, sieht man die Prozesshierarchieps fundpstree -azeigen dieselbe Beziehung
- Wenn man in
bashdateausführt, erstelltbashmitforkeine Kopie von sich selbst, lädt mitexec/bin/datein den Speicher und wartet dann als Parentbashauf das Ende des Child-Prozesses /sbin/initstartet beim Booten und startetsshd; bei einer SSH-Verbindung erzeugtsshdeinen Sitzungsprozess, und diese Sitzung führt einebash-Shell aus
Prozessbenutzer und Berechtigungen
- Jeder Prozess gehört einem Benutzer; Benutzer werden durch numerische IDs dargestellt
- Die Benutzer-ID eines Prozesses lässt sich über den Eintrag
Uidin/proc/<pid>/statusprüfen - Ein Befehl wie
id 1000zeigt den Benutzernamen und die Gruppen zur entsprechenden numerischen ID an idwählt die Quellen für die Namensauflösung gemäß der Konfiguration in/etc/nsswitch.confaus- Im Beispielsystem werden
/etc/passwdund/etc/groupgelesen compatist der Compatibility mode und entsprichtfiles, erlaubt aber spezielle Einträge- Benutzerinformationen können auch in anderen Datenbanken oder Diensten wie LDAP gespeichert sein
- Im Beispielsystem werden
/etc/passwdund/etc/groupsind Klartextdateien, die numerische IDs auf menschenlesbare Namen abbilden- Die eigentlichen Passwortinformationen befinden sich in
/etc/shadow$6$steht für den Hashing-Algorithmussha512- Danach folgen ein zufälliger Salt zum Schutz vor Rainbow-Table-Angriffen und der Hash aus Passwort+Salt
- Programme laufen standardmäßig mit den Berechtigungen des Benutzers, der sie gestartet hat
- Das gilt auch dann, wenn der Besitzer der ausführbaren Datei ein anderer Benutzer ist
- Um etwas als anderer Benutzer oder als
rootauszuführen, verwendet mansudosudo idwird mit der UID 0 vonrootausgeführt- Mit
sudo -u daemon idkann man es als bestimmter Benutzer ausführen
- Wenn man versucht, per direkter Umleitung in
/etc/sudoerszu schreiben, kann es fehlschlagen, weil nurechoals root ausgeführt wird, das Anhängen aber als aktueller Benutzer erfolgtecho "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoerssudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
/etc/sudoerssollte mitsudo visudobearbeitet werden- Der Inhalt wird vor dem Speichern geprüft, um Fehler zu vermeiden, durch die
sudonicht mehr nutzbar wäre
- Der Inhalt wird vor dem Speichern geprüft, um Fehler zu vermeiden, durch die
/usr/bin/passwdkann auch dann in/etc/shadowschreiben, wenn es von einem normalen Benutzer ausgeführt wird- Da in den Dateiberechtigungen ein
sgesetzt ist, läuft es als setuid-Executable - Es wird mit den Rechten des Besitzers der ausführbaren Datei, also
root, ausgeführt - Root-eigene setuid-Executables lassen sich mit
find /bin -user root -perm -u+sfinden
- Da in den Dateiberechtigungen ein
Prozessstatus-Codes
- Die Statusspalte in
htopwird mit dem NamenSangezeigt; die wichtigsten Werte sind folgendeR: running oder runnable, läuft gerade oder wartet in der Run QueueS: interruptible sleep, wartet auf den Abschluss eines EreignissesD: uninterruptible sleep, meist Warten auf I/OZ: defunct zombie, beendet, aber vom Parent noch nicht gereaptT: durch ein Job-Control-Signal angehaltent: während des Tracings durch einen Debugger angehaltenX: dead, ein Zustand, der nicht sichtbar sein sollte
pszeigt auch Substates wieSs,R+undSs+an-
R: läuft oder ausführbar
- Der Status
Rbedeutet, dass ein Prozess gerade läuft oder in der Ausführungswarteschlange wartet - Der Quellcode eines Programms wird nach dem Kompilieren zu CPU-Instruktionen; beim Ausführen wird er in den Speicher geladen, und die CPU führt diese Instruktionen aus
- „Läuft“ bedeutet, dass die CPU physisch Instruktionen ausführt
- Der Status
-
S: unterbrechbarer Sleep
- Im Status
Swerden die Instruktionen des Prozesses nicht auf der CPU ausgeführt; der Prozess wartet auf ein Ereignis oder eine Bedingung - Wenn das Ereignis eintritt, setzt der Kernel den Status auf running
sleep 1000ist ein Beispiel für das Warten über eine angegebene Zeit- Dieser Zustand kann durch ein Signal unterbrochen werden
- In
htopkann man mitF9ein Signal senden killist ein Systemaufruf zum Senden eines Signals;/bin/killist ein Userland-Programm, das diesen aufruft- Das Standard-Signal ist
TERMund fordert die Beendigung des Prozesses an - Signale sind Zahlen; ihre Namen werden meist in Großbuchstaben geschrieben und können das Präfix
SIGtragen - Beispiele:
INT,KILL,STOP,CONT,HUP kill -INT 10089,kill -2 10089und/bin/kill -2 10089bewirken dasselbe- Wenn man
CTRL+Cdrückt, sendetbasheinSIGINTan den foreground process - Ein Prozess beendet sich nicht zwingend, nur weil man
SIGINToderSIGTERMsendet - Programme können einen Signal-Handler einrichten und das Signal etwa so behandeln, dass sie nach Aufräumarbeiten beendet werden
SIGKILLbzw.9veranlasst den Kernel, den Prozess zwangsweise zu beenden, ohne ihm Gelegenheit zur Reaktion zu geben
- Im Status
-
D: nicht unterbrechbarer Sleep
- Der Status
Dkann nicht durch Signale geweckt werden; da auchSIGKILLein Signal ist, kann man einen solchen Prozess nicht killen - Dieser Zustand wird verwendet, wenn ein Prozess ohne Unterbrechung warten muss oder wenn erwartet wird, dass ein Ereignis schnell eintritt
- Beispiel: Lesen/Schreiben auf der Festplatte
- Ein uninterruptible process kann sich typischerweise in einem Zustand befinden, in dem er nach einem Page Fault auf I/O wartet
- Bei Verzögerungen beim Lesen/Schreiben über NFS kann dieser Zustand auftreten
- Er kann auch auftreten, wenn zu wenig verfügbarer Speicher vorhanden ist und Prozesse stark swappen
- Führt man als Beispiel
sudo mount 8.8.8.8:/tmp /tmp &aus, geht/sbin/mount.nfsin den StatusD - Mit
stracesieht man, dass der Systemaufrufmountden Prozess blockiert - Mit der Option
intrfürmountkann man ihn interruptible ausführen sudo mount 8.8.8.8:/tmp /tmp -o intr
- Der Status
-
Z: Zombie-Prozess
- Der Status
Zbedeutet, dass ein Prozess beendet wurde, der Parent ihn aber noch nicht gereapt hat - Wenn Zombie-Prozesse nur kurz existieren, kann das normal sein
- Länger verbleibende Zombie-Prozesse können auf einen Programmfehler hinweisen
- Zombie-Prozesse verbrauchen keinen Speicher, sondern belegen nur eine PID
- Der Zombie-Prozess selbst kann nicht mit
killbeendet werden - Man kann dem parent process
SIGCHLDsenden, um ihn aufzufordern, den Zombie zu reap’en - Wenn man den parent process beendet, kann man den Parent und dessen Zombies entfernen
- Der Zombie-Zustand lässt sich mit einem C-Programm reproduzieren, in dem nach
forkdas Childexit(0)aufruft und der Parentsleep(20)ausführt - Wenn der Parent endet, verschwindet der Zombie
- Der Grund dafür, dass der Zombie erhalten bleibt, ist, dass der Parent den Exit-Code des Childs über den Systemaufruf
waitabfragen können muss
- Der Status
-
T und t: angehaltene Prozesse
- Der Status
Tbedeutet, dass der Prozess durch ein Job-Control-Signal angehalten wurde - Wenn man während der Ausführung von
cat /dev/urandom > /dev/nullCTRL+Zdrückt, wechselt er in den StatusT - Mit
fgkann man ihn wieder ausführen - Man kann ihn auch mit dem Signal
STOPanhalten und mit dem SignalCONTfortsetzen - Der Status
tbedeutet, dass der Prozess während des Tracings durch einen Debugger angehalten ist - Wenn man mit
sudo gdb -p <pid>an einen pernc -l 1234 &gestarteten Prozess attacht, wechselt er in den Statust
- Der Status
CPU-Zeit, Niceness, Priority
- Linux ist ein Multitasking-Betriebssystem; daher wirkt es selbst auf einer einzelnen CPU so, als würden mehrere Prozesse gleichzeitig laufen
- Tatsächlich kann eine einzelne CPU immer nur eine Anweisung auf einmal ausführen, daher wird Time Sharing verwendet
- Ein Prozess läuft kurz und wird dann angehalten
- Andere Prozesse, die auf Ausführung warten, werden der Reihe nach ausgeführt
- Der kurze Abschnitt, in dem ein Prozess läuft, wird Time Slice genannt
- Eine Time Slice dauert meist nur wenige Millisekunden und fällt daher kaum auf, solange die Systemlast nicht hoch ist
- Liegt der Load Average auf einem einzelnen Core bei
1.0, kann man davon ausgehen, dass die CPU zu 100 % ausgelastet war- Liegt er über
1.0, gibt es mehr Prozesse, die laufen wollen, als die CPU verarbeiten kann; dadurch können Slowdowns oder Delays entstehen - Liegt er unter
1.0, ist die CPU zeitweise idle
- Liegt er über
- Auch warum die Running Time eines Prozesses nicht exakt der tatsächlich verstrichenen Zeit entsprechen muss, lässt sich durch Time Sharing erklären
- Wenn es mehr auszuführende Tasks gibt als verfügbare CPU-Cores, muss entschieden werden, welcher Task zuerst läuft
- Der Scheduler des Linux-Kernels wählt den nächsten Prozess aus der Run Queue aus; das hängt vom Scheduler-Algorithmus des Kernels ab
- Im Allgemeinen kann man den Scheduler nicht direkt steuern, aber man kann angeben, welche Prozesse wichtiger sind
- Die als
NIangezeigte Niceness ist die User-Space-Priority- Der Bereich reicht von
-20bis19 -20ist die höchste Priorität,19die niedrigste- Ein „nicerer“ Prozess gibt weniger „nicen“ Prozessen eher den Vortritt
- Der Bereich reicht von
PRIist die vom Linux-Kernel verwendete Kernel-Space-Priority- Der Bereich reicht von
0bis139 0~99ist für Real Time,100~139ist der Bereich für User-Prozesse
- Der Bereich reicht von
- Die Beziehung zwischen Nice-Wert und Priority lässt sich mit
PR = 20 + NIerklären-20~+19vonNIwird zu0~39vonPR, was wiederum auf100~139gemappt wird
- Die Niceness vor dem Start wird mit
nice -n niceness programgesetzt - Die Niceness eines laufenden Prozesses wird mit
renice -n niceness -p PIDgeändert - Die Farben der CPU-Auslastung bedeuten Folgendes
- Blue: Thread mit niedriger Priorität,
nice > 0 - Green: Thread mit normaler Priorität
- Red: Kernel-Thread
- Blue: Thread mit niedriger Priorität,
Speicherkennzahlen: VIRT, RES, SHR, MEM%
- Ein Prozess wirkt so, als existiere er allein im Speicher; umgesetzt wird das über virtuellen Speicher
- Ein Prozess greift nicht direkt auf den physischen Speicher zu, sondern besitzt einen eigenen virtuellen Adressraum
- Der Kernel kann virtuelle Speicheradressen in physischen Speicher übersetzen oder Teile davon auf Disk mappen
- Deshalb kann es so aussehen, als würde ein Prozess mehr Speicher verwenden, als im Computer installiert ist
- Die Speichernutzung eines Prozesses hängt davon ab, ob die folgenden Elemente einbezogen werden
- Shared Library
- Disk-mapped Memory
- Swapped-out Memory
- Die Farben der Speichernutzung bedeuten Folgendes
- Green: used memory
- Blue: buffers
- Orange: cache
-
VIRT/VSZ
VIRTist die gesamte Menge an virtuellem Speicher, die ein Task verwendet- Enthalten sind Code, Daten, Shared Libraries, ausgelagerte Pages sowie gemappte, aber nicht verwendete Pages
- Fordert eine Anwendung 1 GB an und nutzt nur 1 MB, kann
VIRTtrotzdem als 1 GB erscheinen - Auch wenn eine 1-GB-Datei per
mmapeingebunden, aber tatsächlich nicht genutzt wird, kannVIRTals 1 GB angezeigt werden - In den meisten Fällen ist
VIRTkeine nützliche Zahl
-
RES/RSS
RESist nicht ausgelagerter physischer Speicher, also die Nutzung von Resident Memory, der sich aktuell im physischen Speicher befindetRESkann die tatsächliche Speichernutzung besser abbilden alsVIRT, hat aber Einschränkungen- Swapped-out Memory ist nicht enthalten
- Ein Teil des Speichers kann mit anderen Prozessen geteilt sein
- Wenn ein Prozess 1 GB Speicher nutzt und danach
fork()aufruft, kannRESbei beiden Prozessen jeweils als 1 GB erscheinen; wegen Copy-on-Write in Linux kann tatsächlich aber nur 1 GB verwendet werden
-
SHR
SHRist die Menge an Shared Memory, die ein Task verwendet- Es spiegelt Speicher wider, der potenziell mit anderen Prozessen geteilt werden kann
- Das Beispiel-C-Programm zeigt, wie sich die Werte
VIRT,RESundSHRdurchmalloc, teilweise Speichernutzung,forkund zusätzliche Schreibzugriffe auf Speicher verändern - Der entsprechende Abschnitt mit dem Speicherbeispiel ist als TODO belassen
-
MEM%
MEM%ist der Anteil des aktuell von einem Task verwendeten verfügbaren physischen Speichers- Er entspricht
RESgeteilt durch den gesamten RAM - Beispiel: Wenn
RES400Mbeträgt und der RAM 8 GB groß ist, ergibt sich400/8192*100 = 4.88%
Standardprozesse von Ubuntu Server 16.04
-
Untersucht wurden die Prozesse, die auf einem frischen Ubuntu Server 16.04.1 LTS x64 auf einem Digital-Ocean-Droplet gestartet werden
-
/sbin/init/sbin/initkoordiniert den restlichen Boot-Prozess und richtet die Benutzerumgebung ein- Wird zum Parent oder Grandparent automatisch gestarteter Prozesse
dpkg -S /sbin/initergibtsystemd-sysv: /sbin/init; auf diesem System ist es also systemd- Auch wenn man ihn killt, passiert nichts
-
/lib/systemd/systemd-journaldsystemd-journaldist ein Systemdienst, der Logging-Daten sammelt und speichert- Erstellt und pflegt ein strukturiertes, indiziertes Journal auf Basis von Log-Informationen aus verschiedenen Quellen
- Verwendet statt einfacher Klartext-Logdateien ein spezielles, für Lognachrichten optimiertes Dateiformat
- Wird mit
journalctlabgefragt journalctl _COMM=sshdjournalctl _COMM=sshd -o json-prettyjournalctl --since yesterdayjournalctl -bjournalctl -fjournalctl --disk-usagejournalctl --vacuum-size=1G- Entfernen oder Deaktivieren scheint nicht möglich zu sein; man kann lediglich das Logging abschalten
-
/sbin/lvmetad -flvmetadcached LVM-Metadaten, damit LVM-Befehle Metadaten ohne Disk-Scan lesen können- Disk-Scans kosten Zeit und können den normalen Betrieb von System und Festplatte stören
- LVM kann man als „dynamische Partitionen“ verstehen, mit denen sich Logical Volumes erstellen, vergrößern/verkleinern und löschen lassen, während Linux läuft
- Fazit: Wenn LVM verwendet wird, sollte man ihn beibehalten
-
/lib/systemd/udevdsystemd-udevdlauscht auf Kernel-uevents und führt für jedes Event die passenden Anweisungen aus den udev-Rules aus- udev ist der Device Manager des Linux-Kernels und verwaltet hauptsächlich die Device Nodes im Verzeichnis
/dev - Ob es auf einem virtuellen Server nötig ist, ist unklar
-
/lib/systemd/timesyncdsystemd-timesyncdist ein Systemdienst, der die lokale Systemuhr mit einem entfernten NTP-Server synchronisiert- Ersetzt
ntpd - Im Beispielsystem zeigt
timedatectl statusfür network time und NTP synchronized jeweilsyesan - In der Ausgabe von
netstatist nur der SSH-Port im Listening-Zustand zu sehen; anders alsntpdunter Ubuntu 14.04 öffnet es nicht mehrere UDP-123-Ports
-
/usr/sbin/atd -fatdführt Jobs aus, die für eine spätere Ausführung in eine Queue gestellt wurdenatundbatchlesen Befehle von stdin oder aus einer Datei und führen sie später aus- Anders als cron, das wiederholte Ausführungen plant, führt
ateinmalig zu einem bestimmten Zeitpunkt aus - Im Beispiel wird mit
echo "touch /tmp/yolo.txt" | at now + 1 minuteeine Datei nach einer Minute erstellt - Wenn es nicht verwendet wird, entfernt man es mit
sudo apt remove at -y --purge
-
/usr/lib/snapd/snapd- Snappy Ubuntu Core wird als Ubuntu-Variante mit transactional updates vorgestellt
- snap wird als universelles Linux-Paketformat beschrieben, mit dem ein einziges Binary Package auf Linux-Desktop, Server, Cloud und Devices läuft
- Man kann es sich als vereinfachtes deb-Paket vorstellen, bei dem Dependencies in einem einzelnen Snap gebündelt und verteilt werden
- Da auf Servern keine Anwendungen per snappy deployed oder distributed wurden, wurde es mit
sudo apt remove snapd -y --purgeentfernt
-
/usr/bin/dbus-daemon- D-Bus ist ein IPC- und RPC-Mechanismus zwischen mehreren Prozessen, die gleichzeitig auf derselben Machine laufen
- Für Desktop Environments ist er nötig, bei einem Server, der eine Web-App ausführt, ist fraglich, ob er gebraucht wird
- Nach dem Entfernen von
dbusschlugtimedatectl statusmitFailed to create bus connection: No such file or directoryfehl - Deshalb lautet das Fazit: besser beibehalten
-
/lib/systemd/systemd-logindsystemd-logindist ein Systemdienst, der Benutzer-Logins verwaltet
-
/usr/sbin/cron -fcronist ein Daemon, der geplante Befehle ausführt-fbedeutet Foreground Mode, also nicht daemonisieren- Regelmäßig auszuführende Aufgaben können mit cron geplant werden
crontab -e- Unter Ubuntu werden häufig
/etc/cron.hourly,/etc/cron.dailyusw. verwendet - Logs kann man auf folgende Weise ansehen
grep cron /var/log/syslogjournalctl _COMM=cronjournalctl _COMM=cron --since="date" --until="date"- cron wird man wahrscheinlich beibehalten
- Wenn man ihn nicht entfernt, kann man ihn mit
sudo systemctl stop cronundsudo systemctl disable cronstoppen bzw. deaktivieren apt remove cronkann dazu führen, dass postfix oder Ähnliches installiert werden soll- Grund ist, dass cron einen Mail Transport Agent suggestet
-
/usr/sbin/rsyslogd -nrsyslogdist ein System-Utility zur Unterstützung von Message Logging- Es befüllt Logdateien unter
/var/log/, etwa/var/log/auth.log - Die Konfigurationsdateien liegen in
/etc/rsyslog.d - Es kann Logs an einen Remote-Server senden und so centralized logging ermöglichen
- Mit dem Befehl
loggerkann ein Background Script Nachrichten in/var/log/syslogschreiben - Auch wenn
systemd-journaldbereits vorhanden ist, haben rsyslog und das Journal unterschiedliche Eigenschaften; der gemeinsame Einsatz kann daher sinnvoll sein - Deshalb vorerst beibehalten
-
/usr/sbin/acpidacpidist der ACPI Event Daemon- Er ist dafür ausgelegt, User-Space-Programme über ACPI-Events zu informieren
- ACPI wird unter anderem für Hardware Component Discovery/Configuration, Power Management und Status Monitoring verwendet
- Da auf dem virtuellen Server kein Suspend/Resume beabsichtigt war, wurde testweise entfernt
rebootfunktionierte, aber nachhaltwurde der Digital-Ocean-Server weiterhin als eingeschaltet erkannt, sodass im Webinterface Power Off ausgeführt werden musste- Daher lautet das Fazit: besser beibehalten
-
/usr/bin/lxcfs /var/lib/lxcfs/lxcfsist ein für LXC-Container entwickeltes FUSE-Filesystem- Es bietet eine virtualisierte Sicht auf einige Dateien unter
/procsowie gefilterten Zugriff auf das cgroup-Filesystem des Hosts - Dadurch liefern uptime, top usw. innerhalb eines Containers „korrektere“ Ergebnisse
- Wenn keine LXC-Container verwendet werden, kann man es mit
sudo apt remove lxcfs -y --purgeentfernen
-
/usr/lib/accountservice/accounts-daemon- AccountsService stellt ein D-Bus-Interface und eine Implementierung zum Abfragen und Manipulieren von Benutzerkonto-Informationen bereit
- Die Implementierung basiert auf den Befehlen
usermod(8),useradd(8)unduserdel(8)
-
Was nach der Entfernung kaputtgeht, bleibt unter „Time will tell“ offen
-
/sbin/mdadmmdadmist ein Linux-Utility zum Verwalten und Überwachen von Software-RAID-Devices- RAID ist eine Methode, mehrere Festplatten wie eine einzige zu nutzen
- RAID 0 erweitert die Drive Capacity
- RAID 1, RAID 5, RAID 6 und RAID 10 dienen dazu, bei einem Drive Failure Datenverlust zu verhindern
- Es kann mit
sudo apt remove mdadm -y --purgeentfernt werden
-
/usr/lib/policykit-1/polkitd --no-debugpolkitdist der PolicyKit-Daemon; polkit ist ein Authorization Framework- Es lässt sich als fein abgestuftes sudo verstehen
- Damit kann einem nicht privilegierten User das Recht gegeben werden, bestimmte Actions als root auszuführen
- Beispiel: Reboot auf einem Desktop-Linux erlauben
- Für Server wird zusammengefasst, dass es mit
sudo apt remove policykit-1 -y --purgeentfernt werden kann - Was dadurch kaputtgeht, bleibt weiterhin offen
-
/usr/sbin/sshd -Dsshdist der OpenSSH-Daemon- Die Option
-Dsorgt dafür, dass er sich nicht detacht und nicht als Daemon in den Hintergrund geht, was Monitoring erleichtert
-
/sbin/iscsidiscsidist ein Background-Daemon, der gemäß der iSCSI-Konfiguration arbeitet und Connections verwaltet- iSCSI ist ein IP-basierter Storage-Networking-Standard, der SCSI-Commands über ein IP-Network überträgt und so Remote Storage wie eine lokale Disk nutzbar macht
- Es kann mit
sudo apt remove open-iscsi -y --purgeentfernt werden
-
/sbin/agetty --noclear tty1 linuxagettyist ein alternatives Linux-getty- getty verwaltet physische oder virtuelle Terminals; wenn eine Verbindung erkannt wird, zeigt es einen Username-Prompt an und startet anschließend das Programm
login - Bei Digital Ocean kann man über
Consolein den Droplet Details im Browser mit diesem Terminal interagieren - Nach dem Entfernen der zu
getty@tty1.servicegehörenden Dateien und einem Reboot war SSH-Zugriff möglich, über die Web Console von Digital Ocean konnte man sich jedoch nicht einloggen
-
SSH-Session, bash, htop
sshd: root@pts/0bedeutet, dass die SSH-Session des Usersrootdem Pseudoterminalpts/0zugeordnet wurde- Ein Pseudoterminal emuliert ein echtes Textterminal
bashist die verwendete Shell- Wenn wie bei
-bashvorne ein Dash steht, wurde sie als Login-Shell gestartet - Eine Shell, bei der das erste Zeichen von Argument zero
-ist oder die mit der Option--logingestartet wurde, ist eine Login-Shell - In diesem Fall liest sie ein anderes Set von Configuration Files
htopist der im Screenshot laufende interaktive Process Viewer
Experiment zum Entfernen von Diensten
- Die reguläre Entfernungsliste sieht wie folgt aus
sudo apt remove lvm2 -y --purgesudo apt remove at -y --purgesudo apt remove snapd -y --purgesudo apt remove lxcfs -y --purgesudo apt remove mdadm -y --purgesudo apt remove open-iscsi -y --purgesudo apt remove accountsservice -y --purgesudo apt remove policykit-1 -y --purge
- Die Extreme Edition umfasst die folgenden Schritte
sudo apt remove dbus -y --purgesudo apt remove rsyslog -y --purgesudo apt remove acpid -y --purgesudo systemctl stop cron && sudo systemctl disable cronsudo rm /etc/systemd/system/getty.target.wants/getty@tty1.servicesudo rm /lib/systemd/system/getty@.service
- Die Konfiguration von nginx, PHP7 und MySQL gemäß der Anleitung unattended installation of WordPress on Ubuntu Server funktioniert
Anhang: Recherchewerkzeuge und Shell-Verhalten
-
Quellcode finden
- Wenn
straceallein nicht ausreicht, kann man sich den source code ansehen - Mit
which uptimefindet man den binary-Speicherort, mitdpkg -S /usr/bin/uptimedas Ubuntu-Package - Im Beispiel gehört
uptimezum Packageprocps - Auf packages.ubuntu.com kann man nach dem Package suchen und den Link zum Source Repository finden
- Wenn
-
File Descriptors und Redirection
- Um stderr nach stdout umzuleiten, verwendet man
2>&1 echo something > fileschreibt stdout in file und entsprichtecho something 1> fileecho something 2> fileschreibt stderr in fileecho something 2>1bedeutet, stderr in eine Datei mit dem Namen1umzuleiten- Bei
2>&1mit&ist1kein Dateiname, sondern eine Stream-ID
- Um stderr nach stdout umzuleiten, verwendet man
-
Farbproblem in PuTTY
- Wenn Elemente von
htopin PuTTY zu fehlen scheinen, lässt sich das in den Einstellungen unter Window → Colours beheben - Rechtsklick auf die title bar
- Change settings...
- Window → Colours
- Both radio button auswählen
- Apply
- Wenn Elemente von
-
Einfache Shell in C
- Eine einfache in C geschriebene Shell zeigt die Verwendung der Systemaufrufe
fork,execundwait - Wenn die Eingabe
exitlautet, beendet sie sich als Shell-Built-in - Andere Befehle werden nach
forkim Child mitexeclpausgeführt, und der Parent wartet mitwaitpidauf den Exit-Status - Ausführungsbeispiele mit
date,trueundfalsegeben jeweils den Exit-Code des Child aus - Der Grund, warum die Beendigungsnachricht eines Background Process wie
sleep 1 &erst nach dem Drücken von Enter erscheint, ist, dass die Shell auf Eingabe wartet und beim Eingeben eines Befehls den Status des Background Process prüft
- Eine einfache in C geschriebene Shell zeigt die Verwendung der Systemaufrufe
Offene Recherchepunkte und Änderungshistorie
- Punkte, die noch weiter untersucht werden sollen, sind Process State Substatus, Kernel Thread,
/dev/pts,CODE-/DATA-/SWAP-Speicher, Time-Slice-Länge, Linux-Scheduler-Algorithmen, Core Pinning, Manual Page, Farben der CPU-/Memory-Bars, Process-ID-Limit und Fork Bomb,lsof,ionice,schedtoolusw. - Zu den wichtigsten Korrekturen und Updates gehören die folgenden
- Die Idle Time von
/proc/uptimeist die Summe aller Cores - Die
printf-Ausgaben von Parent/Child im Zombie-C-Beispiel wurden korrigiert - Es wurde ergänzt, dass
apt remove cronwegen einer MTA-Dependency versucht,postfixzu installieren idkann über/etc/nsswitch.confInformationen auch aus anderen Quellen als/etc/passwdladen- Eine Erklärung des Password-Hash-Formats von
/etc/shadowwurde ergänzt /etc/sudoerssollte sicher mitvisudobearbeitet werden- Die Erklärung zu
MEM%wurde ergänzt - Der Abschnitt zu Load Average wurde neu geschrieben
- Das Standardsignal von
kill 1234wurde vonINTaufTERMkorrigiert - Eine Erklärung der CPU- und Memory-Color-Bars wurde ergänzt
- Die Idle Time von
1 Kommentare
Meinungen auf Hacker News
In letzter Zeit bin ich zu btop gewechselt; die Oberfläche ist so modern und nützlich wie nötig und liefert ausreichend viele Informationen.
Wie andere schon sagten, scheint es auch den Stromverbrauch (Watts) anzuzeigen, dazu Netzwerk-, GPU- und Festplatteninformationen.
https://github.com/aristocratos/btop
Die Balken für die Festplattenauslastung lassen sich nicht abschalten, sodass die I/O-Geschwindigkeitsdiagramme stark zusammengedrückt wirken, wenn das Konsolenfenster nicht sehr groß ist.
Die CPU/GPU-Diagramme sind viel zu groß angelegt, und insgesamt würde ich mir wünschen, dass die Tabelle der geöffneten Dateien mehr Platz bekommt.
Es gibt zwei Einstellungen, die ich jedes Mal ändere, wenn ich htop benutze, und sie machen einen großen Unterschied.
Erstens schalte ich User-Threads aus. Meist machen sie die htop-Ansicht nur unübersichtlich und liefern kaum nützliche Informationen.
Zweitens schalte ich die Prozessbaumansicht ein. Oft ist wichtiger, wo ein Prozess gestartet wurde, als andere Informationen; außerdem lassen sich Dinge wie Compiler-Prozesse, die viele Dateien verarbeiten und CPU fressen, leichter nachverfolgen.
Meiner Meinung nach sollten beide Verhaltensweisen in htop die Standardeinstellung sein.
Ich finde die Erklärung gut, dass man virtuellem Speicher nur schwer trauen kann. Der Windows-Task-Manager zeigt standardmäßig genau diese Art von Wert an, und das ist ziemlich schlecht.
Die Resident Set Size (RSS) ist die verlässlichste Kennzahl; andere Werte können durch Dinge wie Memory-mapped Files, die tatsächlich kein Problem verursachen, fälschlich aufgebläht werden.
Wenn man zum Beispiel eine 2-GB-Logdatei per Memory Mapping einbindet, werden Seiten nur dann geladen, wenn der entsprechende Abschnitt gelesen wird; realer Speicher wird dadurch nicht einfach belegt. Trotzdem schaut ein Nutzer auf den Prozess und fragt: „Warum verbraucht diese App so viel Speicher?“
Auch Chrome hatte eine Zeit lang dieses Problem und reduzierte deshalb die Nutzung von Memory-mapped Files — nicht weil Memory-mapped Files schlecht wären, sondern weil Nutzer auf einen Wert überreagierten, der nicht die tatsächliche Nutzung des physischen Speichers zeigte.
Im Web gibt es sogar Guides, die empfehlen, die Nutzung anhand der Menge des allokierten virtuellen Speichers zu beurteilen; dieser Artikel stellt zumindest diesen Punkt richtig dar.
Siehe: https://en.wikipedia.org/wiki/Proportional_set_size
Bei normalem Datei-I/O ist das nicht der Fall. In HPC-Clustern, die den Speicherverbrauch einzelner Jobs überwachen und sie beenden, wenn sie die angeforderte Menge überschreiten, führt das zu ziemlich interessanten Ergebnissen.
Sobald Speicherdruck einsetzt, ist sie nicht mehr repräsentativ. Wegen dieses Missverständnisses habe ich einige falsche Entscheidungen gesehen und diesen Wert einmal aus Charts entfernt, um zu verhindern, dass ein Teammitglied in die falsche Richtung entscheidet.
Wie der Name sagt, zeigt es nur den Teil, der auf prozessprivat allokierten physischen Speicher gemappt ist, und liegt näher am Resident Set unter Unix.
Vermutlich war die Speichernutzung im Performance-Tab gemeint, aber da man das als alle Speicherverbrauchswerte missverstehen kann, wollte ich es getrennt klarstellen.
Wenn man in top das Zeichen
>verwendet, wird nach Speicherverbrauch sortiert.Ich nutze das gelegentlich, wenn ich herausfinden will, warum ein Host langsam wird, und man kann auch sehen, wenn
swapdCPU frisst.M, für CPU den GroßbuchstabenP.Wenn ich solche Artikel lese, merke ich, dass ich Linux zwar seit über 20 Jahren täglich nutze, aber immer noch nur einen Teil seines Potenzials ausschöpfe. Guter Artikel.
Es fühlt sich an, als würde HN wieder zu sich kommen.
Ich hoffe, das ist nicht die Phase, in der HN als wandelnder Geist unterwegs ist.
Wer
nmonnicht kennt, sollte sich das auch einmal ansehen.Mit
herscheint die Liste der verfügbaren Monitore, erneutes Drücken blendet sie wieder aus, und mitqbeendet man das Programm.https://nmon.sourceforge.io/pmwiki.php
Besonders der über die Tasten
dundDsichtbare Festplattendurchsatz und I/O ist ziemlich nützlich.Das Wide-CPU-Auslastungsdiagramm gefällt mir, weil es mit hohen Core-Zahlen gut zurechtkommt.
Im Unterschied zur Nutzung von
*top-Tools bevorzuge ich inzwischen eher ruhige differenzielle Reports im Stil vonpsund systemweite Reports wie beivmstat.So bleibt alles im Scrollback-Puffer des Terminals erhalten: https://github.com/c-blake/procs
Es ist in der ungewöhnlich effizienten und ausdrucksstarken Sprache Nim geschrieben.
Ich habe diesen Artikel seit 2016 als Lesezeichen gespeichert und über die Jahre mehrfach wieder zurate gezogen.