Handbuch zur dynamischen Ablaufverfolgung in Solaris

Kapitel 24 Der Provider vminfo

Der Provider vminfo stellt Prüfpunkte für die vm-Kernelstatistik zur Verfügung. Da auf diesen statistischen Daten Dienstprogramme zur Systemüberwachung wie etwa vmstat(1M) beruhen, ermöglicht der Provider vminfo eine schnelle Untersuchung beobachteten Fehlverhaltens.

Prüfpunkte

Der Provider vminfo stellt Prüfpunkte für die Felder unter der Bezeichnung vm in der Kernelstatistik bereit: Ein Prüfpunkt von vminfo wird ausgelöst, unmittelbar bevor der entsprechende vm-Wert erhöht wird. Das folgende Beispiel zeigt, wie mithilfe des Befehls kstat(1M) sowohl die Namen als auch die aktuellen Werte der mit vm bezeichneten Kernelstatistiken angezeigt werden können:


$ kstat -n vm
module: cpu                             instance: 0
name:   vm                              class:    misc
        anonfree                        13
        anonpgin                        2620
        anonpgout                       13
        as_fault                        12528831
        cow_fault                       2278711
        crtime                          202.10625712
        dfree                           1328740
        execfree                        0
        execpgin                        5541
        ...

Die vminfo-Prüfpunkte sind in Tabelle 24–1 beschrieben.

Tabelle 24–1 vminfo-Prüfpunkte

anonfree

Prüfpunkt der ausgelöst wird, wenn eine unveränderte, anonyme Speicherseite im Rahmen einer Paging-Aktivität freigegeben wird. Bei anonymen Speicherseiten handelt es sich um Seiten, die keiner Datei zugeordnet sind. Speicher, die solche Seiten enthalten, sind der Heap-, der Stack- oder der Speicher, der durch explizite Zuordnung von zero(7D) erhalten wird.

anonpgin

Prüfpunkt, der ausgelöst wird, wenn eine anonyme Speicherseite aus einem Swap-Gerät eingelagert wird. 

anonpgout

Prüfpunkt, der ausgelöst wird, wenn eine veränderte, anonyme Speicherseite an ein Swap-Gerät ausgelagert wird. 

as_fault

Prüfpunkt, der ausgelöst wird, wenn ein Seitenfehler auftritt, bei dem es sich weder um einen Schutz- noch einen Copy-on-Write-Fehler handelt. 

cow_fault

Prüfpunkt, der mit jedem Copy-on-Write-Fehler für eine Speicherseite ausgelöst wird. arg0 enthält die Anzahl der als Folge des Copy-on-Write-Vorgangs erzeugten Speicherseiten.

dfree

Prüfpunkt, der ausgelöst wird, wenn eine Speicherseite als Folge einer Paging-Aktivität freigegeben wird. Auf jede Auslösung von dfree folgt immer genau eine Auslösung von anonfree, execfree oder fsfree.

execfree

Prüfpunkt, der ausgelöst wird, wenn eine unveränderte, ausführbare Speicherseite als Folge einer Paging-Aktivität freigegeben wird. 

execpgin

Prüfpunkt, der ausgelöst wird, wenn eine ausführbare Speicherseite aus einem Zusatzspeicher eingelagert wird. 

execpgout

Prüfpunkt, der ausgelöst wird, wenn eine veränderte, ausführbare Speicherseite an einen Zusatzspeicher ausgelagert wird. Das Paging ausführbarer Seiten erfolgt meistens in der Form execfree. execpgout kann nur ausgeführt werden, wenn eine ausführbare Seite im Speicher modifiziert wird, was auf den meisten Systemen äußerst ungewöhnlich ist.

fsfree

Prüfpunkt der ausgelöst wird, wenn eine unveränderte Dateisystem-Datenseite im Rahmen einer Paging-Aktivität freigegeben wird. 

fspgin

Prüfpunkt, der ausgelöst wird, wenn eine Dateisystemseite aus einem Zusatzspeicher eingelagert wird. 

fspgout

Prüfpunkt, der ausgelöst wird, wenn eine veränderte Dateisystemseite an einen Zusatzspeicher ausgelagert wird. 

kernel_asflt

Prüfpunkt, der mit jedem Seitenfehler im Adressraum des Kernels ausgelöst wird. Jeder Auslösung von kernel_asflt geht unmittelbar eine Auslösung des Prüfpunkts as_fault voraus.

maj_fault

Prüfpunkt, der ausgelöst wird, wenn ein Seitenfehler auftritt, der E/A von einem Zusatzspeicher oder Swap-Gerät zur Folge hat. Jeder Auslösung von maj_fault geht unmittelbar eine Auslösung des Prüfpunkts pgin voraus.

pgfrec

Prüfpunkt, der ausgelöst wird, wenn eine Seite aus der Liste der freien Seiten gefordert wird. 

pgin

Prüfpunkt, der ausgelöst wird, wenn eine Seite aus dem Zusatzspeicher oder einem Swap-Gerät eingelagert wird. Dieser Prüfpunkt unterscheidet sich insofern von maj_fault, als maj_fault nur ausgelöst wird, wenn eine Seite als Folge eines Seitenfehlers eingelagert wird. pgin wird immer dann ausgelöst, wenn eine Seite eingelagert wird - egal aus welchem Grund.

pgout

Prüfpunkt, der ausgelöst wird, wenn eine Seite an den Zusatzspeicher oder ein Swap-Gerät ausgelagert wird. 

pgpgin

Prüfpunkt, der ausgelöst wird, wenn eine Seite aus dem Zusatzspeicher oder einem Swap-Gerät eingelagert wird. Der einzige Unterschied zwischen pgpgin und pgin besteht darin, dass pgpgin die Anzahl der eingelagerten Seiten als arg0 enthält. pgin enthält in arg0 immer 1.

pgpgout

Prüfpunkt, der ausgelöst wird, wenn eine Seite an den Zusatzspeicher oder ein Swap-Gerät ausgelagert wird. Der einzige Unterschied zwischen pgpgout und pgout besteht darin, dass pgpgout die Anzahl der ausgelagerten Seiten als arg0 enthält. (pgout enthält in arg0 immer 1.)

pgrec

Prüfpunkt, der bei jeder Forderung einer Speicherseite ausgelöst wird. 

pgrrun

Prüfpunkt, der immer dann ausgelöst wird, wenn der Pager eingeplant ist. 

pgswapin

Prüfpunkt, der beim Einlagern von Seiten eines ausgelagerten Prozesses ausgelöst wird. arg0 enthält die Anzahl der eingelagerten Seiten.

pgswapout

Prüfpunkt, der ausgelöst wird, wenn mit dem Auslagern eines Prozesses Seiten ausgelagert werden. arg0 enthält die Anzahl der ausgelagerten Seiten.

prot_fault

Prüfpunkt, der ausgelöst wird, wenn ein Seitenfehler aufgrund einer Schutzverletzung auftritt. 

rev

Prüfpunkt, der ausgelöst wird, wenn der Page-Dämon beginnt, alle Speicherseiten erneut zu durchlaufen. 

scan

Prüfpunkt, der ausgelöst wird, wenn der Page-Dämon eine Speicherseite prüft. 

softlock

Prüfpunkt, der ausgelöst wird, wenn ein Seitenfehler auftritt, weil diese Seite mit einer Softwaresperre belegt wurde. 

swapin

Prüfpunkt, der ausgelöst wird, wenn ein ausgelagerter Prozess wieder eingelagert wird. 

swapout

Prüfpunkt, der bei jeder Auslagerung eines Prozesses ausgelöst wird. 

zfod

Prüfpunkt, der ausgelöst wird, wenn eine mit Nullen gefüllte Seite auf Anfrage erzeugt wird. 

Argumente

arg0

Der Wert, um den die statistische Angabe zu erhöhen ist. Bei den meisten Prüfpunkten beträgt der Wert dieses Arguments stets 1, bei einigen kann das Argument andere Werte annehmen. Diese Prüfpunkte sind in Tabelle 24–1 aufgeführt.

arg1

Ein Zeiger auf den aktuellen Wert der zu erhöhenden statistischen Angabe. Dieser Wert ist eine 64-Bit-Größe, die um den Wert in arg0 erhöht wird. Durch Dereferenzierung dieses Zeigers können die Verbraucher die aktuelle Gesamtzahl der zum Prüfpunkt gehörigen statistischen Angabe ermitteln.

Beispiel

Betrachten Sie die folgende Ausgabe von vmstat(1M):


kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr cd s0 — —   in   sy   cs us sy id
 0 1 0 1341844 836720 26 311 1644 0 0 0  0 216 0  0  0  797  817  697  9 10 81
 0 1 0 1341344 835300 238 934 1576 0 0 0 0 194 0  0  0  750 2795  791  7 14 79
 0 1 0 1340764 833668 24 165 1149 0 0 0  0 133 0  0  0  637  813  547  5  4 91
 0 1 0 1340420 833024 24 394 1002 0 0 0  0 130 0  0  0  621 2284  653 14  7 79
 0 1 0 1340068 831520 14 202 380 0 0  0  0 59  0  0  0  482 5688 1434 25  7 68

Die Spalte pi in der obigen Ausgabe gibt die Anzahl der eingelagerten Seiten an. Der Provider vminfo bietet Ihnen die Möglichkeit, mehr über den Ursprung dieser Einlagerungen zu erfahren:


dtrace -n pgin'{@[execname] = count()}'
dtrace: description 'pgin' matched 1 probe
^C
  xterm                                                             1
  ksh                                                               1
  ls                                                                2
  lpstat                                                            7
  sh                                                               17
  soffice                                                          39
  javaldx                                                         103
  soffice.bin                                                    3065

Die Ausgabe zeigt, dass der mit der StarOfficeTM-Software verbundene Prozess soffice.bin für die meisten Seiteneinlagerungen verantwortlich ist. Um eine genauere Vorstellung von soffice.bin in Bezug auf das virtuelle Speicherverhalten zu erhalten, könnten wir nun alle vminfo-Prüfpunkte aktivieren. Im nächsten Beispiel wird dtrace(1M) beim Starten der StarOffice-Software ausgeführt:


dtrace -P vminfo'/execname == "soffice.bin"/{@[probename] = count()}'
dtrace: description 'vminfo' matched 42 probes
^C

  kernel_asflt                                                      1
  fspgin                                                           10
  pgout                                                            16
  execfree                                                         16
  execpgout                                                        16
  fsfree                                                           16
  fspgout                                                          16
  anonfree                                                         16
  anonpgout                                                        16
  pgpgout                                                          16
  dfree                                                            16
  execpgin                                                         80
  prot_fault                                                       85
  maj_fault                                                        88
  pgin                                                             90
  pgpgin                                                           90
  cow_fault                                                       859
  zfod                                                           1619
  pgfrec                                                         8811
  pgrec                                                          8827
  as_fault                                                       9495

Das folgende Beispielskript liefert zusätzliche Informationen über das virtuelle Speicherverhalten der StarOffice-Software während des Programmstarts:

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin" && start == 0/
{
	/*
	 * This is the first time that a vminfo probe has been hit; record
	 * our initial timestamp.
	 */
	start = timestamp;
}

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin"/
{
	/*
	 * Aggregate on the probename, and lquantize() the number of seconds
	 * since our initial timestamp.  (There are 1,000,000,000 nanoseconds
	 * in a second.)  We assume that the script will be terminated before
	 * 60 seconds elapses.
	 */
	@[probename] =
	    lquantize((timestamp - start) / 1000000000, 0, 60);
}

Führen Sie das Skript aus, während Sie die StarOffice-Software noch einmal starten. Erstellen Sie dann eine neue Zeichnung und eine neue Präsentation, schließen Sie alle Dateien und beenden Sie die Anwendung. Drücken Sie in der Shell, in der das D-Skript ausgeführt wird, Strg-C. Die Ergebnisse gewähren uns einen Einblick in das virtuelle Speicherverhalten im Verlauf der Zeit.


# dtrace -s ./soffice.d
dtrace: script './soffice.d' matched 10 probes
^C

 maj_fault
           value  ------------- Distribution ------------- count
               7 |                                         0
               8 |@@@@@@@@@                                88
               9 |@@@@@@@@@@@@@@@@@@@@                     194
              10 |@                                        18
              11 |                                         0
              12 |                                         0
              13 |                                         2
              14 |                                         0
              15 |                                         1
              16 |@@@@@@@@                                 82
              17 |                                         0
              18 |                                         0
              19 |                                         2
              20 |                                         0

  zfod
           value  ------------- Distribution ------------- count
             < 0 |                                         0
               0 |@@@@@@@                                  525
               1 |@@@@@@@@                                 605
               2 |@@                                       208
               3 |@@@                                      280
               4 |                                         4
               5 |                                         0
               6 |                                         0
               7 |                                         0
               8 |                                         44
               9 |@@                                       161
              10 |                                         2
              11 |                                         0
              12 |                                         0
              13 |                                         4
              14 |                                         0
              15 |                                         29
              16 |@@@@@@@@@@@@@@                           1048
              17 |                                         24
              18 |                                         0
              19 |                                         0
              20 |                                         1
              21 |                                         0
              22 |                                         3
              23 |                                         0

  as_fault
           value  ------------- Distribution ------------- count
             < 0 |                                         0
               0 |@@@@@@@@@@@@@                            4139
               1 |@@@@@@@                                  2249
               2 |@@@@@@@                                  2402
               3 |@                                        594
               4 |                                         56
               5 |                                         0
               6 |                                         0
               7 |                                         0
               8 |                                         189
               9 |@@                                       929
              10 |                                         39
              11 |                                         0
              12 |                                         0
              13 |                                         6
              14 |                                         0
              15 |                                         297
              16 |@@@@                                     1349
              17 |                                         24
              18 |                                         0
              19 |                                         21
              20 |                                         1
              21 |                                         0
              22 |                                         92
              23 |                                         0

Die Ausgabe zeigt einen Teil des StarOffice-Verhaltens in Bezug auf das virtuelle Speichersystem. So wurde beispielsweise der Prüfpunkt maj_fault erst ausgelöst, als eine neue Instanz der Anwendung gestartet wurde. Wie zu erhoffen war, hat der „Warmstart“ von StarOffice keine neuen größeren Seitenfehler verursacht. Die Ausgabe von as_fault zeigt ein anfängliches Aktivitätshoch, eine gewisse Latenz, während der Benutzer das Menü zum Erstellen einer neuen Zeichnung sucht, eine weitere Leerlaufzeit und schließlich ein Aktivitätshoch, als der Benutzer auf eine neue Präsentation klickt. Die Ausgabe von zfod zeigt, dass das Erstellen der neuen Präsentation über einen kurzen Zeitraum einen starken Bedarf an mit Nullen gefüllten Seiten bewirkt hat.

Der nächste Schritt in der DTrace-Nachforschung für dieses Beispiel hängt von der einzuschlagenden Richtung ab. Wenn Sie verstehen möchten, woher der Bedarf an mit Nullen gefüllten Seiten kommt, könnten Sie ustack() in einer zfod-Aktivierung aggregieren. Es bietet sich an, einen Schwellwert für die mit Nullen gefüllten Seiten festzulegen und den verletzenden Prozess durch die destruktive Aktion stop() anhalten zu lassen, wenn der Schwellwert überschritten wird. Dieser Ansatz würde die Verwendung eher herkömmlicher Debugging-Tools wie truss(1) oder mdb(1). Der Provider vminfo macht es möglich, die statistischen Daten in den Ausgaben herkömmlicher Tools wie vmstat(1M) mit den Anwendungen in Verbindung zu bringen, die das systemische Verhalten verursachen.

Stabilität

Der Provider vminfo beschreibt die verschiedenen Stabilitäten anhand des DTrace-Stabilitätsmechanismus gemäß der folgenden Tabelle. Weitere Informationen zum Stabilitätsmechanismus finden Sie in Kapitel 39Stabilität.

Element 

Namensstabilität 

Datenstabilität 

Abhängigkeitsklasse 

Provider 

Evolving 

Evolving 

ISA

Modul 

Private 

Private 

Unknown 

Funktion 

Private 

Private 

Unknown 

Name 

Evolving 

Evolving 

ISA

Argumente 

Private 

Private 

ISA