Instruktionsemulation mit dem emstat-Tool erkennen

Um die Kompatibilität mit älteren Binärdateien zu erhalten, enthält der AIX® -Kernel Emulationsroutinen, die Unterstützung für Anweisungen bereitstellen, die möglicherweise nicht in einer bestimmten Chiparchitektur enthalten sind. Der Versuch, eine nicht unterstützte Anweisung auszuführen, führt zu einer Ausnahmebedingung aufgrund einer unzulässigen Anweisung. Der Kernel decodiert die unzulässige Anweisung, und wenn es sich um eine nicht unterstützte Anweisung handelt, führt der Kernel eine Emulationsroutine aus, die die Anweisung funktional emuliert.

Je nach Ausführungshäufigkeit von nicht unterstützten Instruktionen und deren Emulationspfadlängen kann die Emulation zu unterschiedlichen Leistungseinbußen aufgrund des Kernel-Kontextwechsels und des Aufwands für die Instruktionemulation führen. Selbst ein sehr geringer Prozentsatz der Emulation kann zu einem großen Leistungsunterschied führen. Die folgende Tabelle zeigt die geschätzten Instruktionspfadlängen für mehrere der nicht unterstützten Instruktionen:

Anweisung Emuliert in Geschätzte Pfadlänge (Anweisungen)
Abs Assembler 117
Doz Assembler 120
Mul Assembler 127
RLMI C 425
Sle C 447
Clf C 542
Div C 1079

Anweisungen, die nicht auf allen Plattformen üblich sind, müssen aus Code entfernt werden, der in Assembler geschrieben wurde, da die erneute Kompilierung nur für übergeordneten Quellcode wirksam ist. In Assembler codierte Routinen müssen so geändert werden, dass sie keine fehlenden Instruktionen verwenden, da die Neukompilierung in diesem Fall keine Auswirkungen hat.

Der erste Schritt besteht darin, mithilfe des Tools emstat zu ermitteln, ob eine Anweisungsemulation stattfindet.

Führen Sie den folgenden Befehl aus, um festzustellen, ob das Programm emstat installiert und verfügbar ist:
# lslpp -lI bos.perf.tools

Der Befehl emstat funktioniert ähnlich wie der Befehl vmstat , da Sie eine Intervallzeit in Sekunden und optional die Anzahl der Intervalle angeben. Der Wert in der ersten Spalte ist die kumulative Anzahl seit dem Systemboot, während der Wert in der zweiten Spalte die Anzahl der während dieses Intervalls emulierten Anweisungen ist. Emulationen in der Größenordnung von vielen Tausend pro Sekunde können sich auf die Leistung auswirken.

Im Folgenden sehen Sie ein Beispiel für die Ausgabe des Befehls emstat 1 :
# emstat 1

Emulation   Emulation
SinceBoot       Delta
        0           0
        0           0
        0           0

Sobald die Emulation erkannt wurde, besteht der nächste Schritt darin, festzustellen, welche Anwendung Anweisungen emuliert. Dies ist viel schwieriger zu bestimmen. Eine Möglichkeit besteht darin, nur jeweils eine Anwendung auszuführen und mit dem Programm emstat zu überwachen. Manchmal führen bestimmte Emulationen dazu, dass ein Trace-Hook gefunden wird. Dies kann in der ASCII-Traceberichtsdatei mit den WörternPROGRAM CHECK. Der Prozess/Thread, der diesem Traceereignis zugeordnet ist, emuliert Anweisungen entweder aufgrund seines eigenen Codes, der Anweisungen emuliert, oder er führt die Bibliothek oder den Code in anderen Modulen aus, die Anweisungen emulieren.