Handbuch zur dynamischen Ablaufverfolgung in Solaris

Die Richtlinie fill

Für bestimmte Probleme bietet sich der Einsatz eines einzelnen Puffers im Kernel an. Dieser Ansatz, der sich mit der Richtlinie switch und geeigneten D-Konstrukten durch Inkrementierung einer Variable in D und den angemessenen Einsatz einer exit()-Aktion implementieren lässt, schaltet die Möglichkeit von Auslassungen jedoch nicht ganz aus. Um einen einzelnen, großen Puffer im Kernelinneren anzufordern und die Ablaufverfolgung fortzusetzen, bis mindestens einer der Puffer auf CPU-Ebene angefüllt ist, verwenden Sie die Pufferrichtlinie fill. Sie bewirkt, dass die Ablaufverfolgung fortgesetzt wird, bis ein aktivierter Prüfpunkt versucht, mehr Daten zu protokollieren, als in den verbleibenden Speicherplatz des Hauptpuffers hineinpassen. Wenn nur unzureichender Speicherplatz übrig bleibt, wird der Puffer als gefüllt markiert und der Verbraucher wird benachrichtigt, dass mindestens einer seiner Puffer auf CPU-Ebene voll ist. Sobald dtrace(1M) einen einzigen vollen Puffer entdeckt, wird die Ablaufverfolgung angehalten, alle Puffer werden verarbeitet und dtrace wird beendet. Es werden auch dann keine weiteren Daten in einem als gefüllt markierten Puffer aufgezeichnet, wenn diese eigentlich in den Puffer hineinpassen würden.

Zum Aktivieren der Richtlinie fill setzen Sie die Option bufpolicy auf fill. Der folgende Befehl protokolliert beispielsweise jeden Systemaufrufeintrag in einem CPU-weiten 2K-Puffer, wobei die Pufferrichtlinie auf fill gesetzt ist:


# dtrace -n syscall:::entry -b 2k -x bufpolicy=fill

Die Richtlinie fill und END-Prüfpunkte

END-Prüfpunkte werden normalerweise erst ausgelöst, wenn die Ablaufverfolgung durch den DTrace-Verbraucher ausdrücklich angehalten wird. END-Prüfpunkte werden garantiert nur auf einer CPU ausgelöst. Um welche CPU es sich dabei handelt, ist jedoch unbestimmt. Bei Verwendung von fill-Puffern wird die Ablaufverfolgung explizit angehalten, wenn mindestens einer der CPU-weiten Hauptpuffer als gefüllt markiert wurde. Wurde die Richtlinie fill ausgewählt, kann der END-Prüfpunkt unter Umständen auf einer CPU ausgelöst werden, die einen gefüllten Puffer besitzt. Um die Ablaufverfolgung mit END in fill-Puffern unterzubringen, berechnet DTrace die potenziell von END-Prüfpunkten belegte Speicherplatzmenge und subtrahiert diesen Speicherplatz von der Größe des Hauptpuffers. Ist die Nettogröße negativ, verweigert DTrace den Start und dtrace(1M) gibt eine entsprechende Fehlermeldung aus:


dtrace: END enablings exceed size of principal buffer

Der Reservierungsmechanismus gewährleistet, dass ein als gefüllt gekennzeichneter Puffer stets ausreichend Speicherplatz für einen END-Prüfpunkt bietet.