Bei Verwendung von NPIV teilen sich mehrere Client-LPARs einen physikalischen FC-Port eines Virtual-I/O-Servers. Für Performance-Untersuchungen wäre es natürlich schön, wenn man den Durchsatz der einzelnen Client-LPARs leicht feststellen könnte um diese vergleichend anzuschauen. Damit könnten Fragen wie
- wieviel Durchsatz erzielt eine bestimmte LPAR gerade
- welche LPARs haben den höchsten Durchsatz und produzieren den meisten FC-Verkehr
- treten Resource-Engpässe auf
beantwortet werden.
Es gibt natürlich verschiedene Möglichkeiten diese Daten zu gewinnen. Eine besonders einfache Möglichkeit stellt der Virtual-I/O-Server über das padmin Kommando ‚fcstat‚ bereit. Das Kommando erlaubt die Ausgabe von NPIV-Client-Statistiken bei Verwendung der Option ‚-client‚:
(0)padmin@aixvio1:/home/padmin> fcstat -client hostname dev wwpn inreqs outreqs ctrlreqs inbytes outbytes DMA_errs Elem_errs Comm_errs aixvio1 fcs0 0x100000XXXXXXXXXX 49467894179 50422150679 947794529 1861712755360927 1451335312750576 0 0 0 C050760YYYYYYYYY 0 0 0 0 0 0 0 0 C050760ZZZZZZZZZ 0 0 0 0 0 0 0 0 aix01 fcs0 0xC050760XXXXXXXXX 22685402 101956075 10065757 699512617896 1572578056704 0 0 0 aix02 fcs0 0xC050760XXXXXXXXX 28200473 82295158 12051365 387847746448 626772151808 0 0 0 aix03 fcs0 0xC050760XXXXXXXXX 376500672 255163053 21583628 22619424512608 3786990844928 0 0 0 aix04 fcs0 0xC050760XXXXXXXXX 116450405 504688524 14020031 4037786527400 9929289617408 0 0 0 blbprodora22 fcs0 0xC050760XXXXXXXXX 1341092479 580673554 37458927 44288566807072 12166718497792 0 0 0 ... aixvio1 fcs1 0x100000XXXXXXXXXX 391131484 1090556094 156294130 71031615240217 87642294572864 0 0 0 aixtsm01 fcs2 0xC050760XXXXXXXXX 334020900 785597352 74659821 62072552942128 83284555980288 0 0 0 aixtsm02 fcs0 0xC050760XXXXXXXXX 2943054 40921231 11617552 107317697968 289142333440 0 0 0 aixvio1 fcs2 0x210000XXXXXXXXXX 403180246 5877180796 236998 105482699300998 1540608710446612 0 0 0 aixtsm01 fcs6 0xC050760XXXXXXXXX 146492419 392365162 74250 38378099796342 102844775468007 0 0 0 aixtsm02 fcs2 0xC050760XXXXXXXXX 19 192848 20 1090 50551063184 0 0 0 aixvio1 fcs3 0x210000XXXXXXXXXX 405673338 7371951499 260575 105969796271246 1932388891128304 0 0 0 aixtsm02 fcs3 0xC050760XXXXXXXXX 0 0 4 0 0 0 0 0 aix02 fcs7 0xC050760XXXXXXXXX 42624 2677470211 34211 2382280 701864613402184 0 0 0 ... Invalid initiator world wide name Invalid initiator world wide name (0)padmin@aixvio1:/home/padmin>
Die Zeile mit der WWPN C050760YYYYYYYYY und C050760ZZZZZZZZZ gehören zu NPIV-Adaptern von nicht aktivierten LPARs. Daher werden als Zähler auch nur Nullen angezeigt. Für jeden physikalischen (NPIV-fähigen) FC-Port des Virtual-I/O-Servers wird der physikalische FC-Port, sowie die NPIV Client-LPARs angezeigt. Anhand des fett-markierten Blocks soll hier kurz die Ausgabe beschrieben werden. Als erstes wird immer der physikalische Port des Virtual-I/O-Servers ausgegeben, hier aixvio1 und FC-Port fcs1. In den darauffolgenden Zeilen kommen dann die NPIV-Clients, jeweils mit dem LPAR-Namen und dem zugehörigen virtuellen FC-Port der LPAR, hier aixtsm01 und aixtsm02. Die virtuellen FC-Ports der LPARs fcs2 (aixtsm01) und fcs0 (aixtsm02) sind auf den physikalischen FC-Port fcs1 von aixvio1 gemappt. Nach einer Leerzeile kommt der nächste physikalische FC-Port des Virtual-I/O-Servers.
In den Spalten werden die WWPN der physikalischen bzw. virtuellen FC-Ports augelistet. Außerdem werden die Anzahl der Ein- und Ausgehenden Requests, sowie die übertragenen Bytes, ebenfalls ein- und ausgehend, aufgelistet. In den 3 verbleibenden Spalten werden Fehler aufgeführt. Gibt es für einen Request keinen DMA Puffer mehr, wird DMA_errs hochgezählt, ist die Queue des FC-Adapters voll, wird Elem_errs hochgezählt, bei Übertragungs-Fehlern wird Comm_errs hochgezählt. Tauchen regelmäßig Zähler bei DMA_errs oder Elem_errs auf, kann das ein Hinweis auf zu kleine Werte bei einigen Tuning-Attributen sein.
Aufgrund der Länge der Ausgabe und den absoluten Zählern die ausgegeben werden, ist die Ausgabe etwas unübersichtlich. Mit einem kleinen Skript kann man aber leicht Delta-Werte errechnen und die Ausgabe auf MB pro Sekunde skalieren. Mit dem nachfolgenden Beispiel-Skript haben wir dies getan:
$ cat npivstat #! /bin/ksh93 # # Copyright (c) 2019 by PowerCampus 01 GmbH # Author: Dr. Armin Schmidt # delta=5 # seconds typeset -A dataInreqs typeset -A dataOutreqs typeset -A dataInbytes typeset -A dataOutbytes typeset -A dataDMA_errs typeset -A dataElem_errs typeset -A dataComm_errs bc |& # start bc as coroutine print -p "scale=2" # get first sample /usr/ios/cli/ioscli fcstat -client 2>/dev/null | \ while read hostname dev wwpn inreqs outreqs ctrlreqs inbytes outbytes DMA_errs Elem_errs Comm_errs rest do case "$wwpn" in 0x*) dataInreqs[${hostname}_${dev}]=$inreqs dataOutreqs[${hostname}_${dev}]=$outreqs dataInbytes[${hostname}_${dev}]=$inbytes dataOutbytes[${hostname}_${dev}]=$outbytes dataDMA_errs[${hostname}_${dev}]=$DMA_errs dataElem_errs[${hostname}_${dev}]=$Elem_errs dataComm_errs[${hostname}_${dev}]=$Comm_errs ;; esac done sleep $delta while true do /usr/ios/cli/ioscli fcstat -client 2>/dev/null | \ while read hostname dev wwpn inreqs outreqs ctrlreqs inbytes outbytes DMA_errs Elem_errs Comm_errs rest do case "$wwpn" in 0x*) prevInreqs=${dataInreqs[${hostname}_${dev}]} prevOutreqs=${dataOutreqs[${hostname}_${dev}]} prevInbytes=${dataInbytes[${hostname}_${dev}]} prevOutbytes=${dataOutbytes[${hostname}_${dev}]} prevDMA_errs=${dataDMA_errs[${hostname}_${dev}]} prevElem_errs=${dataElem_errs[${hostname}_${dev}]} prevComm_errs=${dataComm_errs[${hostname}_${dev}]} dataInreqs[${hostname}_${dev}]=$inreqs dataOutreqs[${hostname}_${dev}]=$outreqs dataInbytes[${hostname}_${dev}]=$inbytes dataOutbytes[${hostname}_${dev}]=$outbytes dataDMA_errs[${hostname}_${dev}]=$DMA_errs dataElem_errs[${hostname}_${dev}]=$Elem_errs dataComm_errs[${hostname}_${dev}]=$Comm_errs print -p "(${inreqs}-${prevInreqs})/$delta" read -p inreqs print -p "(${outreqs}-${prevOutreqs})/$delta" read -p outreqs print -p "(${inbytes}-${prevInbytes})/${delta}/1024/1024" read -p inbytes print -p "(${outbytes}-${prevOutbytes})/${delta}/1024/1024" read -p outbytes print -p "(${DMA_errs}-${prevDMA_errs})/$delta" read -p DMA_errs print -p "(${Elem_errs}-${prevElem_errs})/$delta" read -p Elem_errs print -p "(${Comm_errs}-${prevComm_errs})/$delta" read -p Comm_errs printf "%15s %5s %16s %6.2f %7.2f %7.2f %8.2f %8.2f %9.2f %9.2f\n" "$hostname" "$dev" "$wwpn" "$inreqs" "$outreqs" \ "$inbytes" "$outbytes" "$DMA_errs" "$Elem_errs" "$Comm_errs" ;; "wwpn") printf "%15s %5s %16s %6s %7s %7s %8s %8s %9s %9s\n" "$hostname" "$dev" "$wwpn" "$inreqs" "$outreqs" \ "$inbytes" "$outbytes" "$DMA_errs" "$Elem_errs" "$Comm_errs" ;; "") [ -n "$hostname" ] && continue printf "%15s %5s %16s %6s %7s %7s %8s %8s %9s %9s\n" "$hostname" "$dev" "$wwpn" "$inreqs" "$outreqs" \ "$inbytes" "$outbytes" "$DMA_errs" "$Elem_errs" "$Comm_errs" ;; esac done print sleep $delta done $
Das Skript steht zum Download in unserem Download-Bereich zur Verfügung.
Hier noch ein Auszug von einem Lauf des Skriptes (stark gekürzt, nur einer der physikalischen Ports ist dargestellt):
aixvio1 # ./npivstat
hostname dev wwpn inreqs outreqs inbytes outbytes DMA_errs Elem_errs Comm_errs
...
aixvio1 fcs2 0x210000XXXXXXXXXX 0.00 1019.00 0.00 254.75 0.00 0.00 0.00
aixtsm01 fcs6 0xC0507605E5890074 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aixtsm02 fcs2 0xC0507609A6C70004 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aix05 fcs6 0xC0507609A6C7001C 0.00 1018.20 0.00 254.55 0.00 0.00 0.00
...
aixvio1 fcs2 0x210000XXXXXXXXXX 0.00 1020.20 0.00 255.05 0.00 0.00 0.00
aixtsm01 fcs6 0xC050760XXXXXXXXX 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aixtsm02 fcs2 0xC050760XXXXXXXXX 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aix05 fcs6 0xC050760XXXXXXXXX 0.00 1019.80 0.00 254.95 0.00 0.00 0.00
...
aixvio1 fcs2 0x210000XXXXXXXXXX 0.00 984.80 0.00 246.20 0.00 0.00 0.00
aixtsm01 fcs6 0xC050760XXXXXXXXX 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aixtsm02 fcs2 0xC050760XXXXXXXXX 0.00 0.00 0.00 0.00 0.00 0.00 0.00
aix05 fcs6 0xC050760XXXXXXXXX 0.00 985.00 0.00 246.25 0.00 0.00 0.00
...
^Caixvio1 #
Im obigen Beispiel generiert der NPIV-Client aix05 ca 250 MB/s an Daten, wärend die anderen beiden NPIV-Clients aixtsm01 und aixtsm02 während dieser Zeit keinen FC-Verkehr produzieren.
Das Skript muss als root auf einem Virtual-I/O-Server gestartet werden. Natürlich kann man das Skript auf die eigenen Bedürfnisse anpassen.