LPAR-Tool mit Test-Lizenz bis 15.09.2019

Im Download-Bereich steht ab sofort die Version 1.3.0.2 unseres LPAR-Tools mit einer gültigen Test-Lizenz bis 15.09.2019 zum Download bereit. Die Lizenz ist in den Binaries direkt enthalten, es muss also kein Lizenz-Key eingetragen werden. Die enthaltene Test-Lizenz erlaubt die Benutzung des LPAR-Tools für bis zu 10 HMCs, 100 Managed Systems und 1000 LPARs.

ProbeVue in Action: Überwachen der „Queue Depth“ von Platten

Platten und Storage Systeme unterstützen Tagged Command Queueing, d.h. angeschlossene Server können mehrere I/O Aufträge an die Platte oder das Storage-System senden ohne zu Warten das ältere I/O-Aufträge fertig sind. Wieviele I/O-Aufträge man an eine Platte senden darf, bevor man warten muss das ältere I/O-Aufträge abgeschlossen wurden, kann über das hdisk Attribut queue_depth unter AIX konfiguriert werden. Für viele hdisk Typen ist der Wert 20 für die queue_depth der Default-Wert. In der Regel erlauben die meisten Storage-Systeme aber noch größere Werte für die Queue-Depth.

Mit Hilfe von ProbeVue lässt sich die Auslastung der Platten-Queue sehr leicht beobachten.

Ab AIX 7.1 TL4 bzw. AIX 7.2 TL0 unterstützt AIX den I/O Probe Manager. Damit lassen sich auf einfache Weise Ereignisse im I/O Stack von AIX tracen. Wird ein I/O vom Platten-Treiber gestartet, so geschieht dies über die Funktion iostart im Kernel, der Request wird an den Adapter-Treiber weitergegeben und geht dann über den Host-Bus-Adapter an das Storage-System. Das Bearbeiten der Antwort wird von der Funktion iodone im Kernel übernommen. Der I/O Probe-Manager unterstützt (unter anderem) Proben an diesen Stellen:

@@io:disk:iostart:read:<filter>
@@io::disk:iostart:write:<filter>
@@io:disk:iodone:read:<filter>
@@io::disk:iodone:write:<filter>

Als Filter kann z.B. ein Hdisk Name wie hdisk2 angegeben werden. Die Proben-Punkte lösen dann nur Ereignisse für die Platte hdisk2 aus. Damit lässt sich schon einmal eine Aktion durchführen wann immer ein I/O für eine Hdisk beginnt oder endet. Damit könnte man z.B. messen wie lange eine I/O Operation dauert oder auch einfach nur mitzählen wieviele I/Os ausgeführt werden. In unserem Beispiel waren wir aber an der Auslastung der Platten-Queue interessiert, d.h. der Anzahl I/Os die an die Platte gesendet aber noch nicht abgeschlossen wurden. Der I/O Probe-Manager besitzt für die I/O Ereignisse  iostart und iodone die Builtin-Variable __diskinfo mit den folgenden Feldern (https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.genprogc/probevue_man_io.htm):

name          char*     Name der Platte
…
queue_depth   int       Die Queue-Depth der Platte (Wert aus der ODM)
cmds_out      int       Anzahl der ausstehenden I/Os
…

Das Feld cmds_out gibt an wieviele I/Os an die Platte gesendet wurden, für die das I/O noch nicht abgeschlossen ist (Antwort ist noch nicht beim Server angekommen).

Mit dem folgenden Code-Abschnitt ermitteln wir die minimale, maximale und durchschnittliche Anzahl an Einträgen in der Platten-Queue:

@@io:disk:iostart:*:hdisk0     // Nur I/Os für hdisk0 berücksichtigen
{
   queue = __iopath->cmds_out; // Anzahl ausstehende I/Os in Variable queue festhalten
   ++numIO;                    // Anzahl I/Os in der Variablen numIO mitzählen (wegen Durchschnittsbildung)
   avg += queue;               // Variable avg um Anzahl ausstehende I/Os erhöhen
   if ( queue < min )
      min = queue;             // Überprüfen auf Minimum und gegebenenfalls setzen
   if ( queue > max )
      max = queue;             // Überprüfen auf Maximum und gegebenenfalls setzen
}

Die ermittelten Werte geben wir dann einmal pro Sekunde mit Hilfe des Intervall Probe-Managers aus:

@@interval:*:clock:1000
{
   if ( numIO == 0 )
      numIO = 1;    // Verhindert Division durch 0 bei der Durchschnittsbildung
   if ( min > max )
      min = max;
   printf( "%5d  %5d  %5d\n" , min , avg/numIO , max );
   min = 100000;   // Zurücksetzen der Variablen für das nächste Intervall
   avg = 0;
   max = 0;
   numIO = 0;
}

Das vollständige Skript ist auf unserer Webseite zum Download verfügbar: ioqueue.e.

Hier ein Beispiel-Lauf des Skriptes für die Platte hdisk13:

# ./ioqueue.e hdisk13
  min    avg    max
    1      1      2
    1      1      9
    1      1      2
    1      1      8
    1      1      2
    1      1      2
    1      1      8
    1      1     10
    1      1      2
    1      1      1
    1      1     10
    1      1      2
    1      1     11
...

Das Skript erwartet die Angabe einer hdisk als Argument und gibt dann einmal pro Sekunde die ermittelten Werte für die angegebene hdisk aus.

In der Beispiel-Ausgabe sieht man das die maximale Anzahl der Einträge in der Platten-Queue 11 ist. Eine Erhöhung des Attributes queue_depth macht daher aus Performance-Sicht keinen Sinn.

Hier ein anderes Beispiel:

# ./ioqueue.e hdisk21
  min    avg    max
    9     15     20
   11     17     20
   15     19     20
   13     19     20
   14     19     20
   17     18     20
   18     18     19
   16     19     20
   13     18     20
   18     19     19
   17     19     20
   18     19     20
   17     19     19
...

In diesem Fall wird der maximale Wert 20 (die hdisk21 hat eine queue_depth von 20) regelmäßig erreicht. Eine Erhöhung der queue_depth kann in diesem Fall zu einer Verbesserung des Durchsatzes führen.

Das Beispiel-Skript lässt sich natürlich noch beliebig erweitern, man könnte z.B. noch den Durchsatz erfassen, oder die Wartezeit von I/Os in der Wait-Queue oder auch die Position und Größe jedes I/Os auf der Platte. Das dargestellte Beispiel zeigt wie einfach man Informationen zu I/Os mit Hilfe von ProbeVue ermitteln kann.

 

Zahlen: FC World Wide Names (WWNs)

Die meisten kennen WWNs als 64-bit WWNs, geschrieben als 16 hexadezimale Ziffern. Die Kenntnis das es verschiedene Formate bei den WWNs gibt und es auch 128-bit WWNs gibt ist nicht ganz so bekannt. In diesem Artikel sollen daher die verschiedenen Formate von WWNs kurz vorgestellt werden.

Der grundlegende Aufbau von 64-bit WWNs sieht wie folgt aus:

+---+----------------+
|NAA| NAME           |
+---+----------------+
4-bit 60-bit

Das 4-bit NAA (Network Address Authority) Feld gibt dabei den Typ der Adresse und das Format der Adresse vor.

Für das 60-bit NAME Feld gibt es eine Reihe von verschiedenen Möglichkeiten.

1. Format 1 Adresse (NAA = 0001)

+---+--------+------------------------+
|NAA|Reserved| 48-bit IEEE MAC Address|
+---+--------+------------------------+
4-bit 12-bit   48-bit

Im Feld Reserved (12-bit) müssen alle Bits auf 0 gesetzt sein!

Beispiel:

1 000 00507605326d (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

2. Format 2 Adresse (NAA = 0010)

+---+---------------+-----------------------+
|NAA|Vendor Assigned|48-bit IEEE MAC Address|
+---+---------------+-----------------------+
4-bit  12-bit         48-bit

Das 12-bit “Vendor Assigned” Feld kann vom Hersteller beliebig verwendet werden.

Beispiel:

2 001 00507605326d (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

3. Format 3 Adresse (NAA = 0011)

+---+-----------------+
|NAA|Vendor Assigned  |
+---+-----------------+
4-bit 60-bit

Das Feld „Vendor Assigned“ (60-bit) wird vom Hersteller beliebig vergeben. Damit ist diese Art von Adresse nicht weltweit eindeutig und ist daher in der Praxis eher nicht anzutreffen.

Beispiel:

3 0123456789abcde (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

4. Format 4 Adresse (NAA = 0100)

+---+---------+--------------+
|NAA|Reserved | IPv4 Address |
+---+---------+--------------+
4-bit 28-bit     32-bit

Das Feld “IPv4 Address” (32-bit) enthält eine 32-bit IPv4 Adresse.

Beispiel für IP 10.0.0.1:

4 0000000 0a000001 (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

5. Format 5 Adresse (NAA = 0101)

+---+-------+-----------------+
|NAA| OUI   | Vendor Assigned |
+---+-------+-----------------+
4.bit 24-bit 36-bit

Das Feld OUI (24-bit) enthält die 24-bit vom IEEE zugewiesene ID (Organizational Unique ID).

Das Feld „Vendor Assigned“ (36-bit) kann wieder vom Hersteller beliebig vergeben werden.

Beispiel:

5 005076 012345678 (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

6. Format 6 Adresse (NAA = 0110)

Format 6 Adressen sind 128-bit Adressen und werden häufig für LUNs im SAN verwendet.

+---+-------+---------------+-------------------------+
|NAA|  OUI  |Vendor Assigned|Vendor Assigned Extension|
+---+-------+---------------+-------------------------+
4.bit 24-bit  36-bit          64-bit

Das Feld OUI (24-bit) enthält die 24-bit vom IEEE zugewiesene ID.

Das Feld „Vendor Assigned“ (36-bit) kann vom Hersteller beliebig vergeben werden.

Das Feld „Vendor Assigned Extension“ (64-bit) kann ebenso vom Hersteller beliebig vergeben werden.

Beispiel:

6 005076 012345678 0123456789abcdef (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

7. IEEE EUI-64 Adresse (NAA=11)

Bei diesem Adress-Format ist das Feld NAA auf lediglich 2-bit verkürzt, wobei NAA den Wert 11 hat.

+---+-------------+---------------+
|NAA|OUI shortened|Vendor Assigned|
+---+-------------+---------------+
2-bit 22-bit       40-bit

Das Feld “OUI shortened” (22-bit) ist dabei eine auf 22-bit gekürzte Version der vom IEEE zugewiesenen 24-bit ID.

(Die beiden niederwertigsten Bit des 1 Byte werden hierbei weggelassen und die verbleibenden 6-Bit werden um 2 Bit-Positionen nach rechts verschoben um Platz für die beiden NAA Bits zu machen.)

Das Feld „Vendor Assigned“ (40-bit) kann vom Hersteller beliebig vergeben werden.

Diese Art von Adressen werden häufig im Bereich Virtualisierung verwendet, z.B. wenn es um NPIV (N_Port ID Virtualization) geht.

Beispiel:

C05076 0123456789 (Zur Verdeutlichung des Formats sind die Felder durch Leerzeichen getrennt)

 

 

Volles Filesystem: df und du zeigen unterschiedliche Belegung

Volle Filesysteme kommen in der Praxis immer wieder vor, jeder kennt dies. Üblicherweise sucht man dann nach großen Dateien oder Verzeichnissen und überprüft ob ältere Daten gelöschte werden können um wieder Platz zu schaffen (manchmal wird aber auch einfach das Filesystem vergrößert ohne genauere Untersuchung). In manchen Fällen lassen sich aber keine größeren Dateien finden die man löschen könnte oder man entdeckt das scheinbar Filesystem-Platz weg ist, kann aber nicht identifizieren wo dieser Platz verwendet wird. Das Kommando du zeigt dann einen kleineren Wert für den verwendeten Filesystem-Platz an als df. Im folgenden ist ein solches Beispiel gezeigt, und auch der Hinweis wie sich identifizieren lässt wo der Filesystem-Platz abgeblieben ist und wie er sich dann letztlich auch wiedergewinnen lässt. AIX hat hier eine schöne Möglichkeit zu bieten, die man nicht in jedem UNIX-Derivat findet.

Das Filesystem /var/adm/log ist zu 91% gefüllt, aktuell sind 3.6 GB des Filesystems in Benutzung:

# df -g  /var/adm/log
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/varadmloglv      4.00      0.39   91%      456     1% /var/adm/log
#

Eine Überprüfung mit dem Kommando du zeigt das scheinbar wesentlich weniger Platz belegt ist:

# du –sm /var/adm/log
950.21   /var/adm/log
#

Das Kommando “disk usage” kommt lediglich auf 950 MB belegten Platz! Das sind 2.7 GB weniger als der Wert aus dem Kommando df. Doch wo ist der fehlende Platz?

Der Unterschied kommt von Dateien die gelöscht wurden, aber noch von mindestens einem Prozeß geöffnet sind. Der Eintrag für solche Dateien wird aus dem zugehörigen Directory entfernt, womit auf die Datei nicht mehr zugegriffen werden kann. Daher zählt das Kommando du diese Dateien bei der Aufsummierung auch nicht mit und kommt auf den kleineren Wert. Solange ein Prozeß die gelöschte Datei noch in Benutzung hat, werden die zugehörigen Blöcke im Filesystem aber nicht freigegeben, daher zeigt df diese auch als belegt an.

Es gibt also mindestens eine Datei in dem Filesystem /var/adm/log welche gelöscht wurde, aber noch von einem Prozeß geöffnet ist. Es stellt sich die Frage wie man den betreffenden Prozeß und die Datei identifizieren kann.

AIX bietet eine einfache Möglichkeit Prozesse zu identifizieren die gelöschte Dateien geöffnet haben, das Kommando fuser besitzt hierfür die Option -d um Prozesse aufzulisten, die gelöschte Dateien geöffnet haben:

# fuser -d /var/adm/log
/var/adm/log:  9110638
#

Verwendet man zusätzlich die Option –V, dann werden auch noch Informationen zu den gelöschten Dateien angezeigt, wie Inode-Nummer und Dateigröße:

# fuser -dV /var/adm/log
/var/adm/log:
inode=119    size=2882647606   fd=12     9110638
#

Die Ausgabe zeigt das hier die Datei mit der Inode-Nummer 119 mit der Größe ca 2.8 GB gelöscht wurde, aber vom Prozeß mit der PID 9110638 über den File Descriptor 12 immer noch geöffnet ist.

Mittels ps lässt sich schnell herausfinden um welchen Prozeß es sich handelt:

# ps -ef|grep 9110638
    root  9110638  1770180   0   Nov 20      - 28:28 /usr/sbin/syslogd
    root  8193550  8849130   0 09:13:35  pts/2  0:00 grep 9110638
#

Es handelt sich hier um den syslogd. Vermutlich wurde hier eine Log-Datei mittels mv rotiert, ohne den syslogd zu informieren (refresh –s syslogd). Wir holen dies kurz nach und überprüfen dann noch einmal das Filesystem:

# refresh -s syslogd
0513-095 The request for subsystem refresh was completed successfully.
#
# df -g /var/adm/log
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/varadmloglv      4.00      3.07   24%      455     1% /var/adm/log
#

Die Ausgabe zeigt das die Filesystem-Blöcke jetzt freigegeben wurden.