Solaris versteht die Hardware - pgstat erklaert sie

Motiviert durch die recht hohen Latenz-Unterschiede beim Zugriff auf Memory innerhalb der E25K wurde Solaris 9 9/02 um die sogenannten Locality Groups (lgrp) erweitert.  Damit wird die Memory-Hierarchie des Systems beschrieben, die je nach Hardware sehr stark verschieden sein kann.   Beim Erzeugen von Prozessen sowie beim Scheduling wird dann versucht, die CPU und den jeweils verwendeten Speicherbereich moeglichst nahe zueinander zu bringen.  Dieses Feature, als Memory Placement Optimization (MPO) bekannt, kann, je nach Anwendungsfall und Hardware, erhebliche Performance-Verbesserungen realisieren.

Der Solaris Kernel bietet, neben vielem Anderem, auch tausende von Zaehlern, die mit kstat, cpustat oder mit bekannteren Kommandos wie mpstat oder iostat abgefragt werden koennen.  Insbesondere die Werte, die cpustat liefert, sind dabei stark von der Hardware abhaengig, da nicht jede CPU jeden Typ Zaehler bietet. Die Auswirkungen auf die Performance, bzw die Auslastung der diversen Hierarchie-Teile konnte bisher jedoch kaum sinnvoll ausgewertet werden.  Hier gab es mit corestat bisher lediglich fuer die T-Serie ein Perl-Skript, das verschiedene Zaehler mit Hilfe von cpustat auswerten konnte.  Das ist mit Solaris 11 Express nun endlich Geschichte.

Es gibt drei neue Kommandos: lgrpinfo, pginfo und pgstat.

lgrpinfo zeigt die Hierarchie der L-Groups an, also die NUMA-Struktur der Hardware.  Immer dann, wenn man bspw. mit Solaris Containern und Resource-Gruppen einzelne CPUs zu Prozessor-Sets verbinden moechte, ist diese Information recht hilfreich.

pginfo zeigt, etwas anders orientiert als lgrpinfo, eine Baum-Sicht des gesamten Systems an.  Die Blaetter dieses Baumes sind die einzelnen Interger- und Floatingpoint Pipelines der einzelnen Kerne.  Hier ein kleines Beispiel aus einer T2 LDom, bestehend aus 16 Strands, die auf verschiedenen Cores ausgefuehrt werden:

# pginfo -v
0 (System [system]) CPUs: 0-15
|-- 3 (Data_Pipe_to_memory [chip]) CPUs: 0-7
| |-- 2 (Floating_Point_Unit [core]) CPUs: 0-3
| | `-- 1 (Integer_Pipeline [core]) CPUs: 0-3
| `-- 5 (Floating_Point_Unit [core]) CPUs: 4-7
| `-- 4 (Integer_Pipeline [core]) CPUs: 4-7
`-- 8 (Data_Pipe_to_memory [core,chip]) CPUs: 8-15
`-- 7 (Floating_Point_Unit [core,chip]) CPUs: 8-15
|-- 6 (Integer_Pipeline) CPUs: 8-11
`-- 9 (Integer_Pipeline) CPUs: 12-15

Hier wird die Zuordnung der verschiedenen Strands zu Pipelines und Cores sehr schoen deutlich.

pgstat letztlich ist ein wuerdiger Nachfolger fuer corestat und zeigt die Auslastung dieser einzelnen Komponenten sehr uebersichtlich an.  Hier wieder ein Beispiel, das gleichzeitig eine fast 100%ige Kern-Auslastung zeigt - etwas, was es recht selten zu beobachten gibt...


# pgstat -Apv 1 2
PG RELATIONSHIP HW UTIL CAP SW USR SYS IDLE CPUS
0 System [system] - - - 100.0% 99.6% 0.4% 0.0% 0-15
3 Data_Pipe_to_memory [chip] - - - 100.0% 99.1% 0.9% 0.0% 0-7
2 Floating_Point_Unit [core] 0.0% 179K 1.3B 100.0% 99.1% 0.9% 0.0% 0-3
1 Integer_Pipeline [core] 80.0% 1.3B 1.7B 100.0% 99.1% 0.9% 0.0% 0-3
5 Floating_Point_Unit [core] 0.0% 50K 1.3B 100.0% 99.1% 0.9% 0.0% 4-7
4 Integer_Pipeline [core] 80.2% 1.3B 1.7B 100.0% 99.1% 0.9% 0.0% 4-7
8 Data_Pipe_to_memory [core,chip] - - - 100.0% 100.0% 0.0% 0.0% 8-15
7 Floating_Point_Unit [core,chip] 0.0% 80K 1.3B 100.0% 100.0% 0.0% 0.0% 8-15
6 Integer_Pipeline 76.4% 1.3B 1.7B 100.0% 100.0% 0.0% 0.0% 8-11
9 Integer_Pipeline 76.4% 1.3B 1.7B 100.0% 100.0% 0.0% 0.0% 12-15
PG RELATIONSHIP HW UTIL CAP SW USR SYS IDLE CPUS
0 System [system] - - - 100.0% 99.7% 0.3% 0.0% 0-15
3 Data_Pipe_to_memory [chip] - - - 100.0% 99.5% 0.5% 0.0% 0-7
2 Floating_Point_Unit [core] 0.0% 76K 1.2B 100.0% 99.5% 0.5% 0.0% 0-3
1 Integer_Pipeline [core] 79.7% 1.2B 1.5B 100.0% 99.5% 0.5% 0.0% 0-3
5 Floating_Point_Unit [core] 0.0% 42K 1.2B 100.0% 99.5% 0.5% 0.0% 4-7
4 Integer_Pipeline [core] 79.8% 1.2B 1.5B 100.0% 99.5% 0.5% 0.0% 4-7
8 Data_Pipe_to_memory [core,chip] - - - 100.0% 99.9% 0.1% 0.0% 8-15
7 Floating_Point_Unit [core,chip] 0.0% 80K 1.2B 100.0% 99.9% 0.1% 0.0% 8-15
6 Integer_Pipeline 76.3% 1.2B 1.5B 100.0% 100.0% 0.0% 0.0% 8-11
9 Integer_Pipeline 76.4% 1.2B 1.5B 100.0% 99.8% 0.2% 0.0% 12-15

SUMMARY: UTILIZATION OVER 2 SECONDS

------HARDWARE------ ------SOFTWARE------
PG RELATIONSHIP UTIL CAP MIN AVG MAX MIN AVG MAX CPUS
0 System [system] - - - - - 100.0% 100.0% 100.0% 0-15
3 Data_Pipe_to_memory [chip] - - - - - 100.0% 100.0% 100.0% 0-7
2 Floating_Point_Unit [core] 76K 1.2B 0.0% 0.0% 0.0% 100.0% 100.0% 100.0% 0-3
1 Integer_Pipeline [core] 1.2B 1.5B 79.7% 79.7% 80.0% 100.0% 100.0% 100.0% 0-3
5 Floating_Point_Unit [core] 42K 1.2B 0.0% 0.0% 0.0% 100.0% 100.0% 100.0% 4-7
4 Integer_Pipeline [core] 1.2B 1.5B 79.8% 79.8% 80.2% 100.0% 100.0% 100.0% 4-7
8 Data_Pipe_to_memory [core,chip] - - - - - 100.0% 100.0% 100.0% 8-15
7 Floating_Point_Unit [core,chip] 80K 1.2B 0.0% 0.0% 0.0% 100.0% 100.0% 100.0% 8-15
6 Integer_Pipeline 1.2B 1.5B 76.3% 76.3% 76.4% 100.0% 100.0% 100.0% 8-11
9 Integer_Pipeline 1.2B 1.5B 76.4% 76.4% 76.4% 100.0% 100.0% 100.0% 12-15

Die Interpretation der diversen Werte ist, nach einem kurzen Blick in die Manpage, eine einfache und klare Angelegenheit.  Damit macht Performance-Analyse, insbesondere auf T2 und T3 Systemen, jetzt noch mehr Spass :-)

Kommentare:

Senden Sie einen Kommentar:
Kommentare sind ausgeschaltet.
About

Neuigkeiten, Tipps und Wissenswertes rund um SPARC, CMT, Performance und ihre Analyse sowie Erfahrungen mit Solaris auf dem Server und dem Laptop.

This is a bilingual blog (most of the time). Please select your prefered language:
.
The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

Search

Categories
Archives
« April 2014
MoDiMiDoFrSaSo
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Heute