Kategorien
Shared Hosting

RSS Feeds reloaded – der Selfoss Feed Reader

RSS Feeds gibt es seit fast 20 Jahren und vermutlich sind auch Sie schon mal über den Begriff „gestolpert“. Grundsätzlich geht es darum, Inhalte ohne Layoutfunktionen automatisiert für andere Programme zur Verfügung zu stellen.

Viele Nachrichten-Websites nutzen RSS Feeds um ihre Informationen kostenlos anzubieten. Beispielsweise bietet der Tagesanzeiger verschiedene Feeds an. In der Blogosphäre sind RSS-Feeds ebenfalls weit verbreitet und auch unser Blog hat natürlich ein Feed, in dem die Artikel ohne Layout zur Verfügung gestellt werden.

Um die Informationen lesen zu können, benötigen sie einen Feed-Reader. Dem Feed-Reader teilen Sie mit, welche Feeds Sie lesen wollen. Danach werden die Informationen automatisiert abgeholt und Sie können sie in Ruhe durchblättern.

Weit verbreitet sind Dienste wie beispielsweise Feedly und Flipboard. Sie bieten eine komfortable Auswahl an Feeds und bieten Telefon-Apps an. Diese Services sind kommerziell und haben ein Geschäftsmodell. Entweder wird Ihnen Werbung angezeigt oder sie müssen für den Dienst bezahlen. Ausserdem gibt es immer einen zentralen Server auf dem Ihre Informationen liegen.

Open Source Feed Reader

Es gibt natürlich auch Open Source Alternativen zu den oben genannten Services. Ich möchte Ihnen heute am Beispiel des Projekts selfoss zeigen, wie Sie Ihren Server zum universellen News-Aggregator machen. selfoss bezeichnet sich selbst als

The new multipurpose rss reader, live stream, mashup, aggregation web application

und bietet auch Apps für iOS und Android an, die ihre Inhalte mit Ihrem Server synchronisieren. Das Programm benötigt einen LAMP Stack und ist einfach zu installieren.

Installation

Sie können das Programm in einem virtuellen Server oder in einem Unterverzeichnis eines bestehenden Servers installieren. In meinem Fall nehme ich das Unterverzeichnis /selfoss auf serverblogger.ch.

Erstellen Sie das Unterverzeichnis

sudo mkdir selfoss

Laden Sie das Quellcodepaket von der selfoss Website (http://selfoss.aditu.de/)

sudo wget http://selfoss.aditu.de/selfoss-2.12.zip

und entpacken Sie es

sudo unzip selfoss-2.12.zip

kopieren Sie die Datei default.ini in config.ini bevor Sie Änderungen an der Konfiguration vornehmen

sudo cp defaults.ini config.ini

Wenn Sie die Datenbank MySQL nutzen wollen, müssen Sie Ihre Datenbank-Parameter in der config.ini Datei eintragen.

sudo nano config.ini
...
[globals]
db_type=mysql
db_host=localhost
db_database=selfoss
db_username=selfoss
db_password=IHR_PASSWORT
db_port=3306
...

Folgende Verzeichnisse müssen mit Schreibrechten versehen werden

chmod -R 0777 data/cache
chmod -R 0777 data/favicons
chmod -R 0777 data/logs
chmod -R 0777 data/thumbnails
chmod -R 0777 data/sqlite
chmod -R 0777 public

Damit ist die Installation beendet.

Wenn Sie selfoss nun im Browser aufrufen, sollten Sie dieses Bild sehen:

Erfolgreiche Installation
Erfolgreiche Installation

Feeds hinzufügen

Damit Sie Inhalte sehen können, müssen Sie Feeds hinzufügen.

Klicken Sie auf das Icon mit der Wolke (unten links) und danach auf add source.

Hinzufügen von Feeds
Hinzufügen von Feeds
Sie finden bereits vordefinierte Feeds, die Sie einfach auswählen können (Heise, Golem, etc.) und weitere Möglichkeiten wie Facebook Pages, Twitter Timelines und Tumblr User. Wählen Sie beispielsweise den Heise Open Source Feed und klicken auf save. Sie können Feeds auch taggen und damit später die Artikel filtern.
Feed Auswahl
Feed Auswahl
Eingelesen werden die Feeds über einen Cronjob oder den Aufruf von /update, In meinem Fall also https://serverblogger.ch/selfoss/update.

Die Startseite sieht nun so aus

Heise Open Source Feed
Heise Open Source Feed
Durch einen Klick auf die Überschrift können Sie die Einträge lesen und auch wieder auf anderen sozialen Netzwerken teilen oder per E-Mail verschicken. Über die Tags filtern Sie die Einträge.

Cron Job erstellen

Damit Ihre Feeds alle 15 Minuten automatisch aktualisiert werden, müssen Sie der Crontab einen Eintrag hinzufügen.

sudo crontab -e
*/15 * * * * wget --quiet --delete-after http://serverblogger.ch/selfoss/update

Individuelle Feeds eintragen

Nicht vordefinierte Feeds tragen Sie ein, indem Sie als Typ RSS Feed wählen und im URL Feld die Feed URL eintragen.

Feed eintragen
Feed eintragen
Diesmal sollte die Aktualisierung automatisch, abhängig von Ihrem gewählten Zeitraum, erfolgen.

Mobile Apps

Für Android und iOS gibt es Apps in den entsprechenden Stores

Die Apps benötigen nur die URL zu Ihrem Feed Server und aktualisieren sich dann automatisch. Die Texte werden heruntergeladen, so dass Sie sie auch offline lesen können. Hier ein Screenshot der Android App.

Android selfoss App
Android selfoss App

Passwortschutz und weitere Konfigurationsoptionen

Sie können den Zugriff auf Ihre Feeds mit einem Passwort schützen. Die Benutzer/Passwort Kombination muss in der Datei config.ini auf Ihrem Server eingetragen werden.

[globals]
username=MEINNAME
password=MEINPASSWORT
salt=1291929_UNDNOCHMEHRZIFFERN

Twitter Feeds

Um ein Twitterfeed einzubinden, müssen Sie sich mit Ihrem Twitter Benutzerkonto im Browser einloggen und dann die URL https://apps.twitter.com/ aufrufen. Dort müssen Sie eine neue App erzeugen und den Consumer Key und den Secret key in das entsprechende Feld in selfoss eintragen.

Twitter Feeds
Twitter Feeds
Nach der Aktualisierung tauchen die Tweets dann in Ihrer Übersicht im Web und auf dem Telefon auf
Feed Timeline mit Tweets
Feed Timeline mit Tweets

Link

http://selfoss.aditu.de/


tl;dr: Hosten und synchronisieren Sie Ihre Web-, Twitter-, GitHub-, Tumblr- und Facebook Feeds doch einfach selbst mit selfoss.

Kategorien
Performance Server

Serverauslastung mit Munin aufzeichnen

In den letzten zwei Blogeinträgen haben wir uns mit dem Thema Serverauslastung beschäftigt. Die dazu notwendigen Linux Befehle geben einen guten Überblick über die Serverauslastung zum aktuellen Zeitpunkt. Wenn Sie aber Ihren Server über einen längeren Zeitraum beobachten wollen, so kommen Sie mit den vorgestellten Methoden nicht sehr weit.

Deshalb wollen heute wir das Ganze mal auf einen anderen Level heben :).

Das Zauberwort heisst Server-Monitoring oder ganz allgemein Netzwerk-Management und es gibt zahlreiche Programme für ebenso zahlreiche Einsatzzwecke. Allein im Open Source Segment gibt es beispielsweise die Programme BigSister, Cacti, Icinga, Multi Router Traffic Grapher, Munin, Nagios, OpenNMS, Opsview, Op5 Monitor, Xymon, Zabbix und Zenoss.

Wir wollen uns in diesem Artikel exemplarisch mit Munin beschäftigen.

Der Ursprung vieler Progamme ist der Multi Router Traffic Grapher (MRTG), der HTML-Seiten erzeugt, die Grafiken enthalten. Mit Hilfe von MRTG kann so ziemlich jede Reihe von Zahlen visualisiert werden („von der Temperatur im Serverraum bis zur Anzahl der eigehenden SPAM-Mails“).

Das RRDtool bietet ein clevere Methode um Daten zu sammeln. RRD steht für Round Robin Database. Round Robin lässt sich im Deutschen mit „Rundlauf-Verfahren“ übersetzen. In unserem Fall wird eine Datenbank mit einer festen Grösse und für eine feststehende Zeitspanne angelegt (RRD-Datei). Wenn die Zeitspanne vorbei ist, wird die Datei nicht vergrössert, sondern die ältesten Einräge werden gelöscht. Man kann also beispielsweise die Daten der letzten Tage alle 5 Minuten speichern, die der letzten Monate alle 30 Minuten und die der letzten Jahre alle 6 Stunden.

Munin nutzt RRDtool zum Sammeln von Daten und besteht aus einem Server und beliebig vielen Clients. Wenn Sie nur einen Server überwachen wollen, liegen Client und Server auf einer Maschine.

In unserem Fall nutzen wir den Apache2 Webserver unter Ubuntu 14.04, Munin funktioniert aber auch mit anderen Webservern wie beispielsweise Nginx.

Installation

Zunächst muss das Paket Munin installiert werden

sudo apt-get install munin

Konfiguration

Munin muss die HTML-Dateien erzeugen, in einem Verzeichnis ablegen und der Webserver Apache muss die Seiten bei Bedarf ausliefern. Da alle Websites auf unserem Server im Verzeichnis /var/www/[domainname] liegen, werde ich die Konfigurationsdatei /etc/munin/munin.conf und die /etc/munin/apache.conf entsprechend anpassen.

sudo nano /etc/munin/munin.conf

Entfernen Sie das Kommentarzeichen # für die folgenden vier Zeilen und ändern Sie den Pfad des htlmdir .

dbdir   /var/lib/munin
htmldir /var/www/munin/
logdir /var/log/munin
rundir  /var/run/munin

Entfernen Sie ebenfalls das Kommentarzeichen für die Zeile

tmpldir /etc/munin/templates

Am Ende der Konfigurationsdatei müssen Sie noch einen Namen für den munin Dienst festlegen. Wenn Sie nur einen Server überwachen, können Sie die IP-Adresse 127.0.0.1 stehen lassen, wenn Sie mehrere Maschinen überwachen wollen, müssen Sie die IP-Adresse Ihres Servers hier eintragen.

# a simple host tree
[NOVATREND-Serverblogger-Munin]
    address 127.0.0.1
    use_node_name yes

Als nächstes müssen Sie das Verzeichnis /var/www/munin erstellen und den Benutzer munin zum Eigentümer machen.

sudo mkdir /var/www/munin
sudo chown munin:munin /var/www/munin

Dann müssen Sie in der /etc/munin/apache.conf noch ein paar Änderungen vornehmen:

sudo nano /etc/munin/apache.conf

Ändern Sie dem Pfad im Alias und im Directory Container und das Allow Kommando.

Alias /munin /var/www/munin
<Directory /var/www/munin>
  Order allow,deny
  #Allow from localhost 127.0.0.0/8  ::1 
  Allow from all 
  Options None
  ...

Nun können Sie den munin-node Client (der mitinstalliert wurde) und den Apache Webserver neu starten.

sudo service munin-node restart
sudo service apache2 restart

Wenn Sie in Ihrem Browser Ihre IP-Adresse oder einen auf Ihren Server zeigenden Domainamen eingeben, gefolgt von /munin sollte Sie die generierten HTML-Seiten mit den Auswertungen sehen. Es kann sein, dass es fünf Minuten braucht, bis die HTML Dateien erstellt sind.

In meinem Fall ist die URL https://serverblogger.ch/munin und das Ergebnis sieht so aus (Benutzer: serverblogger, Passwort serverblogger):

munin Server Monitoring
munin Server Monitoring
In den Kategorien stehen die Auswertungen basierend auf Tag, Woche, Monat und Jahr (d für day, w für week, m für month und y für year).

Die wichtigsten Antworten auf Fragen der Systemauslastung finden Sie in den Kategorien system und disk.

Zugriff schützen

Nun soll ja vermutlich nicht jeder Ihre Auswertungen sehen und darum ist in den Munin/Apache Konfigurationsdateien bereits ein Verzeichnisschutz vorbereitet. Damit das funktioniert, müssen Sie das Paket apache2-utils installieren.

sudo apt-get install apache2-utils

Nach der Installation ist es möglich, eine Datei zu erstellen, die eine Benutzer/Passwort Kombination enthält, die beim Aufruf der Munin Seiten abgefragt wird. Die Datei wird mit dem folgenden Befehl erzeugt.

sudo htpasswd -c /etc/munin/munin-htpasswd serverblogger

Als Benutzernamen und Passwort wähle ich serverblogger.

In der Konfigurationsdatei für den Apache

sudo nano /etc/munin/apache.conf

müssen noch die entsprechenden Befehle auskommentiert werden.

AuthUserFile /etc/munin/munin-htpasswd
AuthName "NOVATREND Serverblogger Munin"
AuthType Basic
require valid-user

Nun sind Ihre Daten geschützt und nur mit der Benutzername/Passwort Kombination einsehbar.

https://serverblogger.ch/munin

Benutzername/Passwort Schutz
Benutzername/Passwort Schutz
Hinweis: Der angegebene Server ist der Testserver, auf dem die Dinge, die ich hier im Blog vorstelle, ausprobiert werden. Die anzeigten Daten können daher etwas „eigentümlich“ sein ;).

Munin kann durch viele Plugins erweitert werden, beispielsweise für Apache und MySQL, aber auch für Content Management Systeme wie Drupal oder das bereits angesprochene Raspberry Pi Temperatur Plugin für die Temperatur im Serverraum oder im Gartenbeet 🙂

Links


tl;dr: Munin visualisert fast alles und bringt Erkenntnis und Farbe in den Administratoren-Alltag

Kategorien
Server

Wie ausgelastet ist mein Server? Teil 2

In der letzten Woche haben wir uns mit Prozessen, deren Metadaten und dem Befehl ps beschäftigt (Wie ausgelastet ist mein Server? Von Zombies und Waisen). Als Bild habe ich eine Dampflok gewählt.

Viele Server laufen jedoch tatsächlich eher vor sich hin, daher diesmal der entspannende Blick aufs Meer.

Heute wollen wir uns mit der Systemauslastung an sich beschäftigen. Fragen wie: Ist die CPU ausgelastet? Ist genug Arbeitsspeicher vorhanden? Sind andere Komponenten wie die Festplatte ausreichend dimensioniert?

Um sich an die Antworten heranzutasten, muss man sich mindestens mit einem Programm namens top näher beschäftigen.

Grundlegendes

Beim Befehl ps sollte man in etwa wissen, wonach man sucht, um ihn sinnvoll nutzen zu können. Bevor wir uns mit weiteren Befehlen beschäftigen, möchte ich daher ein paar grundlegende Dinge ansprechen.

Warum ist der Arbeitsspeicher immer voll?

Egal wieviel Arbeitsspeicher vorhanden ist, er ist immer voll. Die Betriebssysteme versuchen soviel wie irgend möglich in den physischen Arbeitsspeicher (RAM) zu legen. Wenn der dann irgendwann knapp wird, wird vom Betriebssystem bei Bedarf „aufgeräumt“, bzw. nicht unbedingt benötigte Daten aus dem physischen Arbeitsspeicher in den Swapspeicher ausgelagert. Der Swapspeicher ist ein Teil der Festplatte und langsamer im Zugriff als der physische Arbeitsspeicher.

Physischer Arbeitsspeicher ist schnell und eher klein und teuer, Festplattensspeicher ist langsamer, aber gross und billig.

Arbeitsspeicher und Swapspeicher zusammen ergeben den virtuellen Speicherraum. Für Programmierer (und Programmiersprachen und Compiler und eigentlich für alle) ist es viel einfacher, mit logischen, linearen und unfragmentierten Speicheradressen in virtuellem Arbeitsspeicher zu arbeiten, als mit fragmentierten, nicht linearen, physikalischen Adressen im RAM oder auf der Festplatte. Das Betriebssystem übernimmt die Übersetzung der logischen in die physikalischen Ebene.

Schemabild der Anwendung des virtuellen Speichermanagement: links: virtueller Speicherraum pro Prozess, Speicher ist linear und unfragmentiert rechts: reale Speicherquellen, typischerweise RAM oder Festplatte, mehrere, auch kleine Speicherfragmente können verwendet werden; in rot Speicherverwendung anderer Prozesse, unsichtbar im virtuellen Speicherraum - https://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung

Durch Swapping wird versucht eine akzeptable Balance aus Zugriffsgeschwindigkeit und Grösse zu erhalten. Wenn beispielsweise ein Prozess aktiviert wird, wird ein anderer Prozess in den Hintergrund (auf die Festplatte in eine Auslagerungsdatei) geswappt. Ausser dem Begriff swapping gibt es auch das paging. Swapping ist die ältere Methode, paging die neuere Technik.

Ein virtueller Arbeitsspeicher ermöglicht auch Speicherschutzmechanismen, so dass sich einzelne Prozesses „nicht ins Gehege“ kommen oder Daten auslesen, die nicht für sie bestimmt sind.

Die Antwort auf die Frage „Ist genug Arbeitsspeicher vorhanden?“ ist also gar nicht so einfach …

Hier noch ein paar Notizen zum Swap unter Linux.

Wie schnell ist meine Festplatte?

Auch so ein Thema. Mit dem Befehl

sudo time sh -c "dd if=/dev/zero of=ddfile bs=8k count=250000 && sync"; rm ddfile

kopieren Sie 2GB Daten in die Datei ddfile und löschen diese anschliessend wieder.

So sehen die Ergebnisse auf unterschiedlichen Servern aus

Normale Festplatte

250000+0 records in
250000+0 records out
2048000000 bytes (2.0 GB) copied, 7.05998 s, 290 MB/s

SSD

250000+0 records in
250000+0 records out
2048000000 bytes (2.0 GB) copied, 0.78132 s, 2.6 GB/s

Die Werte unterscheiden sich gravierend. Der Server mit der SSD kann also zehnmal schneller eine Datei kopieren, als der Server mit der herkömmlichen Festplatte.

Es gibt zahlreiche Benchmarks für Festplatten und es geht auch nicht drum, welche nun die schnellste ist. Es geht eher darum, die Gesamtsituation Ihres Servers einzuordnen. Ist Ihr Server beispielsweise eine „eigene“ Maschine mit einer eigenen Festplatte oder handelt es sich um einen virtualisierten Cloud Server, der sich Ressourcen mit anderen Nutzern teilt? Im letzten Fall kann der Zugriff mal extrem schnell gehen und mal eher langsam.

Tools

Nach der Vorrede wollen wir nun aber doch einen Blick auf die beiden nützlichen Tools top und free werfen, bevor Sie alle Illusionen verlieren 🙂

top

Wenn Sie den Befehl top aufrufen, dann sehen Sie so etwas …

top
top

Die Sache sieht zwar unspektalär aus, enthält aber alles wissenswerte über Ihren Server.

Lassen Sie uns die Anzeige Zeile für Zeile durchgehen

1. Zeile

top - 16:29:18 up 401 days,  6:34,  1 user,  load average: 0.49, 0.30, 0.25
  • top: Der Name des Programms
  • 16:29:18: Die Zeit auf Ihrem Server
  • up 401 days, 6:34: Die sogenannte Uptime. Dieser Server läuft seit 401 Tagen und 6 Stunden ohne Neustart. Sie können diese Zeile auch separat ausgeben, indem Sie den befehl uptime aufrufen
  • 1 user: Ein Benutzer ist momentan angemeldet
  • load average: 0.49, 0.30, 0.25: Die durchschnittliche Last des Systems in den letzten 1, 5, 15 Minuten. In diesem Fall war die Last vor 15 Minuten 0.25, in der letzten Minute war sie fast doppelt so hoch, nämlich 0.49. Vermutlich gab es gerade ein paar Besucher mehr auf den Websites, die dieser Server hosted. Die Zahlen, die angegeben werden, sind die Anzahl der Prozesse, die auf eine Ausführung warten. Je höher der Wert, desto ausgelasteter das System. Die untere Grenze ist 0 und stellt den Idealzustand dar. Ein unbelastetes System, dass mit voller Kraft arbeiten kann. Eine obere Grenze gibt es nicht. Die load average ist die einfachste Art festzustellen, wie es um das System bestellt ist. Die drei Werte werden auch in eine Datei geschrieben, die Sie beispielsweise mit dem Befehl cat /proc/loadavg auslesen können.

2. Zeile

Tasks: 119 total,   1 running, 118 sleeping,   0 stopped,   0 zombie

In der zweiten Zeile geht es um Prozesse (Tasks). Auf dem System laufen gerade 188 Prozesse, von denen 118 schlafen, keiner gestoppt ist und es existieren auch keine Zombieprozesse

3. Zeile

%Cpu(s):  1.2 us,  0.2 sy,  0.0 ni, 98.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st

Hier wird es etwas kryptischer, es geht um die prozentuale CPU-Auslastung verschiedener Prozesse.

  • us 1.2: Nutzung von User-Prozessen
  • sy 0.2: Nutzung von System/Kernel- Prozessen
  • ni 0.0: Prozesse, die mit einem hohen nice Wert laufen (also hoher Priorität)
  • id 98,6: Der Leerlaufanteil des Prozessors heisst idle. Der Zustand idle bedeutet, dass das Gerät untätig ist und auf Arbeit wartet, in diesem Fall immerhin 98,6 % der CPU-Zeit! Das hört sich sehr viel an, ist aber kein unüblicher hoher Wert.
  • wa 0.1: Die Zeit, die das System auf Eingaben (meist die Festplatte) warten muss (IO-wait).
  • hi 0.0: Die Zeit, die für das Bearbeiten von Hardware Interrupts verwendet wird
  • si 0.0: Die Zeit, die für das Bearbeiten von Software Interrupts verwendet wird
  • st 0.0: Die Zeit, die von einer virtuellen Maschineauf dem System „gestohlen“ wird (stolen).

4. und 5. Zeile

KiB Mem:  32878736 total, 30528192 used,  2350544 free,   291408 buffers
KiB Swap: 16768892 total,    63940 used, 16704952 free, 28728220 cached

Mem steht für physikalischen Speicher, Swap für Auslagerungen auf der Festplatte. Angezeigt werden die Werte für freien (free) und genutzten (used) Speicher. Der physikalische Speicher wird hier fast komplett genutzt, der Swap eher nicht.

Die Werte für buffers und cached geben die Daten an, die zwischengespeichert werden und müssen prinzipiell vom used Wert noch abgezogen werden. Falls mehr Speicher gebraucht wird, würde Linux diese Bereiche sofort freigeben.

Restliche Zeilen

PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
18935 www-data  20   0  248m  39m 3900 S   9.0  0.1   0:00.27 apache2
18891 www-data  20   0  250m  40m 4016 S   0.7  0.1   0:00.38 apache2
18949 root      20   0 69924 3548 2772 S   0.7  0.0   0:00.02 sshd
31786 mysql     20   0  728m 277m 5308 S   0.7  0.9 947:53.22 mysqld

Die Überschriften kennen Sie grösstenteils schon aus dem ps Artikel

  • PID – Prozess-ID
  • USER – Benutzer, der den Prozess gestartet hat
  • PR – Prioritätsscheduling
  • NI – Nice-Wert
  • VIRT – Der gesamte virtuelle Speicher
  • RES – der physikalische (reservierte) Arbeitsspeicher
  • SHR – der „gesharte“ und „geswappte“ Speicher
  • S – Der Status des Prozesses (D = ununterbrechbarer Schlaf, R = läuft, S = schläft, T = getraced oder gestoppt, Z = Zombie)
  • %CPU – Prozentzahl der CPU-Zeit, die der Prozess verwendet hat
  • %MEM – Prozentzahl des physikalischen Arbeitsspeichers, die der Prozess verwendet hat
  • TIME+ – Die CPU-Zeit, die der Prozess benutzt hat (Minuten:Sekunden.hunderstelSekunden). Der MySQL Prozess benötigt beispielsweise viel CPU Zeit.
  • COMMAND – Der Befehl oder der Name des Prozesses

Top gibt einen wirklich guten ersten Eindruck eines Systems. Da es sich ständig aktualisiert, können Sie es auch laufen lassen und immer mal wieder draufgucken. Die Anzeige kann auch dynamisch verändert werden durch das Drücken verschiedener Tasten (Hot-Keys) – Hier eine Auswahl

  • Z – Färbt die Ausgabe ein
  • i – Idle Prozesse ausblenden
  • P – Sortierung nach CPU-Last
  • M – Sortierung nach Speicherverbrauch
  • N – Sortierung nach PID (numerisch)
  • A – Sortierung nach Alter
  • T – Sortierung nach Zeit
  • U – BENUTZERNAME bzw. UID Zeigt nur die Prozesse des entsprechenden Benutzers an

free

Der Befehl free stellt die Speicherbelegung übersichtlicher dar als top.

             total       used       free     shared    buffers     cached
Mem:      32878736   30603948    2274788          0     291596   28771460
-/+ buffers/cache:    1540892   31337844
Swap:     16768892      63940   16704952

In der zweiten Zeile werden buffers/cache bereits herausgerechnet, so dass man sieht, das der Arbeitsspeicher eigentlich kaum belegt ist und auf jeden Fall ausreicht.

htop

Zusätzlich zu top gibt es noch die Komfortvariante htop.

htop
htop

Hier sind die Daten etwas übersichtlicher aufbereitet und man kann über Funktionstasten die Anzeige konfigurieren.

vmstat

Mit dem Programm vmstat können genauere Werte abgerufen werden, beispielweise die Festplattenstatistik mit dem Parameter -a.

novatrend@server1:~$ vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
0  0  15184 718304 359120 821620    0    0     8    56   84  223  2  1 98  0  0

Mehr Info, siehe http://wiki.ubuntuusers.de/vmstat


tl;dr: Um eine Übersicht über die Auslastung Ihres Servers zu erhalten, benötigen Sie den Befehl top und ein wenig Hintergrundwissen

Kategorien
Betriebssysteme

Wie ausgelastet ist mein Server? Von Zombies und Waisen

Ihr Root-Server ist manchmal mehr und manchmal weniger ausgelastet. Verglichen mit der Dampflokomotive im Bild ist es gar nicht so einfach zu sagen, wie ausgelastet das System nun ist. Bei der Lokomotive sieht man den Dampf, bei Ihren PC zuhause hören Sie vielleicht den Lüfter surren, aber bei einem Root-Server in einem Rechenzentrum?

Um einen Überblick über die aktuelle Auslastung zu bekommen gibt es zwei Kommandos: ps und top.

Heute schauen wir uns ps an.

ps

Das Kommando ps erzeugt eine Liste von Prozessen. Der Name ps ist die Abkürzung von process status.

Stellt sich die Frage: Was ist überhaupt ein Prozess?

Zunächst mal ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, das zur Ausführung einen Prozessor benötigt. Zu einem Prozess gehören auch die notwendigen Daten im zugewiesenen Adressraum, die Inhalte von CPU Registern, wenn der Prozess ausgeführt wird und die Systemdaten (Metadaten), die das Betriebssystem aus seiner Sicht über den Prozess speichert, beispielsweise die laufende Nummer des Prozesses, die Startzeit, die verbrauchte CPU Zeit und den aktuellen Status des Prozesses. Das Kommando ps kann alle Metadaten aller Prozesse anzeigen.

Zu den laufenden Prozessen, die von ps angezeigt werden, gehören auch sogenannte Zombie Prozesse. Ein Zombie Prozess ist ein beendeter Prozess, der aber trotzdem noch in der Prozesstabelle auftaucht und Systemressourcen belegt.

Beispiel für einen Zombie Prozess:

Wenn Sie Ihren Apache Webserver automatisch bei einem Neustart des Rechners starten lassen, aber beim TLS Zertifikat ein Passwort verlangen, das per Hand eingeben werden muss, so führt dies zu einem Zombie Prozess. Der Webserver versucht zu starten, kann aber nicht, weil das Passwort fehlt. Sie können die Aufforderung nicht sehen, weil Sie die Konsolenmeldungen normalerweise nicht sehen.

Ausser den Zombie Prozessen gibt es noch verwaiste Prozesse.

Ein Prozess kann einen neuen Prozess starten. Man nennt diese Kombination Eltern-Kind Prozesse.

Beispiel für einen verwaisten Prozess:

Wir bleiben beim Apache Webserver. Wenn der Webserver gestartet wird startet damit normalerweise ein einzelner Steuerprozess. Wenn nun viele Besucher die Websites besuchen, die der Apache Webserver ausliefert, startet dieser Steuerprozess zusätzliche Kind-Prozesse um mehr Systemressourcen verwalten zu können und schneller auf Anfragen zu reagieren. Wenn die Last nachlässt und/oder der Webserver neugestartet wird, müssen alle Kind-Prozesse wieder beendet werden. Normalerweise klappt das gut, aber manchmal bleibt einer der Kind-Prozesse aus unterschiedlichsten Gründen erhalten. Dieser Waise hat keinen Eltern-Prozess mehr und kann zu erheblichen Problemen im System führen, weil einfach nicht berechenbar ist, was passieren kann.

Aber lassen Sie uns zunächst die Ausgaben des Befehls etwas näher ansehen.

Parameter

Das Kommando ps kann mit unterschiedlichen Parametern aufgerufen werden. Diese Parameter können auch kombiniert werden.

l – Langes Format

novatrend@server1:~$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  2352  2351  20   0  26912  7980 wait   Ss   pts/0      0:00 -bash
0  1000  2450  2449  20   0  12676  1220 wait   Ss+  pts/1      0:00 bash -c cd /srv/pump.io; npm start
0  1000  2451  2450  20   0 964624 35396 ep_pol Sl+  pts/1      0:00 npm
0  1000  2457  2451  20   0   4448   660 wait   S+   pts/1      0:00 sh -c ./bin/pump
0  1000  2458  2457  20   0 674584 37712 ep_pol Sl+  pts/1      0:00 node ./bin/pump
0  1000  2460  2458  20   0 859432 66768 ep_pol Sl+  pts/1      0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
0  1000  4642  2352  20   0  10240  1004 -      R+   pts/0      0:00 ps l

u – User Format (Mit User und Startzeit)

novatrend@server1:~$ ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
novatre+  2352  0.0  0.3  26912  7980 pts/0    Ss   11:00   0:00 -bash
novatre+  2450  0.0  0.0  12676  1220 pts/1    Ss+  11:01   0:00 bash -c cd /srv/pump.io; npm start
novatre+  2451  0.0  1.7 964624 35396 pts/1    Sl+  11:01   0:00 npm
novatre+  2457  0.0  0.0   4448   660 pts/1    S+   11:01   0:00 sh -c ./bin/pump
novatre+  2458  0.0  1.8 674584 37712 pts/1    Sl+  11:01   0:00 node ./bin/pump
novatre+  2460  0.0  3.2 859432 66768 pts/1    Sl+  11:01   0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
novatre+  4651  0.0  0.0  18672  1212 pts/0    R+   15:47   0:00 ps u

a – Alle Prozesse, auch die anderer User

Hier werden auch die TTY-Prozesse angezeigt. TTY bezeichnet das Text-Terminal aus dem der Prozess gestartet wurde. Linux hat normalerweise sechs Text-Terminals, auch virtuelle Konsolen oder Terminalemulationen genannt, an denen man sich anmelden kann.

novatrend@server1:~$ ps a
  PID TTY      STAT   TIME COMMAND
  743 tty4     Ss+    0:00 /sbin/getty -8 38400 tty4
  746 tty5     Ss+    0:00 /sbin/getty -8 38400 tty5
  751 tty2     Ss+    0:00 /sbin/getty -8 38400 tty2
  752 tty3     Ss+    0:00 /sbin/getty -8 38400 tty3
  755 tty6     Ss+    0:00 /sbin/getty -8 38400 tty6
1975 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
2352 pts/0    Ss     0:00 -bash
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00 npm
2457 pts/1    S+     0:00 sh -c ./bin/pump
2458 pts/1    Sl+    0:00 node ./bin/pump
2460 pts/1    Sl+    0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
4668 pts/0    R+     0:00 ps a

x – Auch Daemon-Prozesse (Ohne eigene TTY-Leitung)

Daemon Prozesse sind so etwas wie der Webserver Prozess. Diese Prozesse werden normalerweise mit Root-Rechten gestartet und tauchen hier nicht auf. Wenn Sie den Befehl mit root Rechten aufrufen sudo ps x, sehen Sie auch die Daemon Prozesse

novatrend@server1:~$ sudo ps x
[sudo] password for novatrend:
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
    2 ?        S      0:00 [kthreadd]
...
1441 ?        S      0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA
1918 ?        Ss     0:00 /usr/sbin/apache2 -k start
1975 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
2303 ?        Ss     0:00 sshd: novatrend [priv]
4129 ?        S<     0:00 [kworker/u3:1]
4800 pts/0    S+     0:00 sudo ps x
4801 pts/0    R+     0:00 ps x

f – Forest (Wald) Format – Der Prozessbaum wird dargestellt

Hier sieht man gut die Eltern und Kind Struktur.

novatrend@server1:~$ ps f
  PID TTY      STAT   TIME COMMAND
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00  \_ npm
2457 pts/1    S+     0:00      \_ sh -c ./bin/pump
2458 pts/1    Sl+    0:00          \_ node ./bin/pump
2460 pts/1    Sl+    0:01              \_ /usr/bin/nodejs /srv/pump.io/bin/pump
2352 pts/0    Ss     0:00 -bash
4686 pts/0    R+     0:00  \_ ps f

w – Wide (breite) Ausgabe – Zeilen werden nicht abgeschnitten

Hat in diesem Fall keinen Effekt, da die Zeilen relativ kurz sind

novatrend@server1:~$ ps w
  PID TTY      STAT   TIME COMMAND
2352 pts/0    Ss     0:00 -bash
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00 npm
2457 pts/1    S+     0:00 sh -c ./bin/pump
2458 pts/1    Sl+    0:00 node ./bin/pump
2460 pts/1    Sl+    0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
4687 pts/0    R+     0:00 ps w

Ausgabe einschränken

Hier ein Beispiel für alle Prozesse, auch die anderer User und die Daemon Prozesse, mit dem Komando grep gefiltert auf Apache. In diesem erhalten wir keine Überschrift, da nur die Zeile, die den String „apache“ enthalten, ausgegeben werden.

novatrend@server1:~$ sudo ps ax | grep apache
1441 ?        S      0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA
1918 ?        Ss     0:00 /usr/sbin/apache2 -k start
1928 ?        S      0:20 /usr/sbin/apache2 -k start
1929 ?        S      0:20 /usr/sbin/apache2 -k start
1988 ?        S      0:19 /usr/sbin/apache2 -k start
2126 ?        S      0:19 /usr/sbin/apache2 -k start
2127 ?        S      0:19 /usr/sbin/apache2 -k start
2129 ?        S      0:19 /usr/sbin/apache2 -k start
2132 ?        S      0:20 /usr/sbin/apache2 -k start
2299 ?        S      0:19 /usr/sbin/apache2 -k start
2300 ?        S      0:19 /usr/sbin/apache2 -k start
2302 ?        S      0:19 /usr/sbin/apache2 -k start
4809 pts/0    S+     0:00 grep --color=auto apache

Die 10 Prozesse, die am meisten Speicher benötigen

ps -auxf | sort -nr -k 4 | head -10

Die 10 Prozesse, die am meisten CPU Zeit benötigen

ps -auxf | sort -nr -k 3 | head -10

Ausgabe verstehen und einordnen

Am Beispiel des u – Parameters (Mit User und Startzeit) gehe ich mal die Ausgabe durch

novatrend@server1:~$ ps u

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
novatre+  2352  0.0  0.3  26912  7980 pts/0    Ss   11:00   0:00 -bash
novatre+  2450  0.0  0.0  12676  1220 pts/1    Ss+  11:01   0:00 bash -c cd /srv/pump.io; npm start
novatre+  2451  0.0  1.7 964624 35396 pts/1    Sl+  11:01   0:00 npm
  • User: Der Benutzername der den Prozess gestartet hat
  • PID: Prozess-ID
  • %CPU: Auslastung der CPU. Der Wert ist die gesamte CPU Zeit geteilt durch die Laufzeit des Prozesses ausgedrückt als Prozentzahl (Auf dem Testserver ist also wenig los 🙂 )
  • %MEM. Das Verhältnis zwischen den vom Prozess genutzen Speicher und dem gesamten Speicher der Maschine ausgedrückt in Prozent
  • VSZ: Die Grösse des virtuellen Speichers in KiloBytes.
  • RSS: Die Grösse des residenten Speichers in KiloBytes.
  • TTY: Terminal von dem aus der Prozess aufgerufen wurde
  • STAT: Der Status des Prozesses. D für uninterruptable sleep (wartet auf Eingabe), R für running (laufend), S für sleeping (schlafend), T für traced (angehalten), X für dead (tot) und Z für einen Zombie-Prozess. In unserem Fall steht da Ss, Ss+ und Sl+. Das grosse S steht dafür, dass diese Prozesse schlafen, das kleine sagt aus, dass diese Prozesse ein session leader Prozesse sind (also potentielle Eltern). Das + Zeichen steht für einen Prozess der im Vordergrund läuft, das l für einen multi-threaded Prozess
  • START: Die Zeit, wann der Prozess gestartet wurde. Je nachdem, wie lange der Zeitpunkt her ist, wird er in Minuten, Stunde oder Tagen angegeben.
  • TIME: Die CPU Zeit, die dieser Prozess bisher „verbraucht“ hat
  • COMMAND: Das ist die Programmzeile, mit der der Prozess aufgerufen worden ist

Die wirklich gute und komplette Übersicht über die einzelnen Parameter, Ausgaben und deren Bedeutungen gibt die die Handbuchseite des Debian Projekts – http://manpages.debian.org/cgi-bin/man.cgi?query=ps

Was kann ich mit den Prozessen machen?

Ich kann mit den Prozessen kommunizieren indem ich Ihnen Signale schicke. Dazu bietet Linux Befehle wie kill, skill, renice und viele andere mehr.

kill

Wie der Name schon andeutet, geht es darum einen Prozess zu beenden. Um ihn zu nutzen, muss ich die Prozess-ID kennen. Allerdings weiss ich als Administrator nicht, wie das Programm auf verschiedene Parameter des kill Befehls reagieren wird, da die Reaktion abhängig von der Programmierung ist. Einzig das Signal 9 ist festgelegt und beendet einen Prozess. Der Befehl, der einen Prozess beendet lautet also

kill -9 [pid]

skill

In diesem Fall brauche ich keine Prozess-ID sondern den Namen von Benutzern, Programmen oder TTY Leitungen.

skill -9 [name]

renice

Der nice Wert gibt die Priorität von Prozessen im Bereich von -20 bis 19 an.

renice 15 -p 5678

verändert beispielsweise die Priorität des Prozesses mit der pid 5678 auf 15.

Interprozesskommunikation

Unter Interprozesskommunikation versteht man alle Methoden zum Informationsaustausch zwischen Prozessen. Da geht es um solche Buzzwords wie Multitasking, Multithreading, Shared memory, Pipes und Datenströme im Allgemeinen.

Im Grunde geht es also um fast alles, was mit Betriebssystemen zu tun hat. Und der Befehl ps listet all diese Prozesse auf. Zum Glück werden Sie vermutlich nur den „kill -9“ Befehl hin- und wieder brauchen


tl;dr: Der Befehl ps bietet Ihnen eine Übersicht über alle Prozesse Ihres Systems.