Opensim AOT

Ahead of Time Compilation oder AOT ist eine Funktion des Mono-Laufzeitcode-Generators.

Der Mono-Code-Generator kann in zwei Modi betrieben werden: Just-in-Time-Kompilierung oder JIT und Ahead-of-Time-Kompilierung oder AOT.

Die AOT-Kompilierung erfolgt in zwei Schritten. Die erste Stufe besteht aus der Vorkompilierung der Baugruppen. Dies ist ein manueller Prozess, den einzelne Bereitstellungen ausführen müssen. Die zweite Stufe erfolgt automatisch. Die Mono-Laufzeit lädt automatisch den vorkompilierten Code, den Sie generiert haben.

Das Generieren von AOT-Code aus einer Assembly ist sehr einfach. Rufen Sie einfach die Mono-Laufzeit mit dem –aot Flag wie folgt auf :

mono –aot program.exe

mono –aot OpenSim.exe

Dadurch wird eine Datei mit dem Namen „program.exe.so“ generiert, die den nativen Code enthält, der von Mono für die meisten IL-Methoden vorkompiliert wurde. Das –aotFlag beschränkt sich standardmäßig auf IL-Methoden, die Ihnen die meisten Vorteile bieten, aber nicht absolut alles kompilieren, was Sie benötigen. Siehe unten für weitere Details.

Obwohl der JIT-Modus sehr schnell ist und die Standardoptimierungen in Mono optimiert wurden, um ein ausgewogenes Verhältnis zwischen Optimierungen und JIT-Geschwindigkeit zu gewährleisten, bietet die AOT-Kompilierung einige zusätzliche Vorteile:

Reduzierte Startzeit.
Erhöhte Speicherfreigabe.
Potenziell bessere Leistung.

Volle AOT

In einigen Betriebssystemkonfigurationen (meistens eingebettete Systeme) sind die Betriebssystemdienste zum dynamischen Generieren von Code nicht verfügbar. Dies verhindert, dass die JIT von Mono funktioniert. In diesen Systemen können Sie –aot=fullsicherstellen, dass Mono alles vorkompiliert, und dann die Option verwenden, –full-aotum sicherzustellen, dass Mono niemals die JIT-Engine verwendet.

Mach eine volle AOT:

$ mono –aot=full mscorlib.dll
$ mono –aot=full sample.exe

bei OpenSim einfach ./makeaot.sh

Führt aus, aber fordern Sie Mono auf, niemals zu JIT zu versuchen:
$ mono –full-aot sample.exe

Full AOT ist ein ziemlich einfacher Prozess, außer im Fall von generischen Instanziierungen. In diesen Fällen muss Mono eine statische Analyse des Codes durchführen, alle möglichen Instanziierungen eines Typs ermitteln und den erforderlichen Code generieren. Wenn ein Programm beispielsweise a verwendet Listund ein ListMono dies erkennt, werden alle referenzierten Methoden für beide Datentypen generiert.
Bekannte Einschränkungen

Wenn Sie aufgrund von Betriebssystembeschränkungen auf die vollständige AOT-Option angewiesen sind, sollten Sie –full-aotsicherstellen, dass Sie Ihre Software mit dieser Option testen, um sicherzustellen, dass Ihre Anwendung keinen dynamischen Code verwendet.

Dieser Test ist erforderlich, da einige der Klassenbibliotheken von Mono Code dynamisch generieren (z. B. Expression.Compile()LINQs Methode für Ausdrucks-ASTs) oder Code zur Laufzeit laden (z. B. den Standardbetriebsmodus für den XML-Serializer, siehe MONO_XML_SERIALIZER_THS auf der Handbuchseite, um dies zu konfigurieren).
Einschränkung: Plattform

Full AOT funktioniert derzeit nur unter X86 / AMD64 / ARM.
Generische ValueType-Freigabe

Diese Version der AOT-Kompilierung erweitert den AOT-Compiler, um die generische Codegenerierung für Werttypen zu unterstützen. Dies kann entweder eine Optimierung (weniger Versionen von FooX ist ein Werttyp) zum Füllen von Löchern sein, bei denen zuvor ein Laufzeitfehler aufgrund eines nicht FooX implementierten Werttyps von X aufgetreten ist.
Unterstützte Plattformen

AOT ist nur auf wenigen Plattformen verfügbar:

Mono: X86
x86-64
Mono: ARM

Reduzierte Startzeit

Beim Start prüft die Mono-Laufzeit, ob eine AOT-Version der Assembly nebeneinander ausgeführt wird. In diesem Fall wird der native Code aus der Side-by-Side-Datei geladen, anstatt die Methoden in der angegebenen Assembly zu JITEN .

Dies ist besonders nützlich für große Programme, die möglicherweise viel Code ausführen müssen, bevor sie betriebsbereit sind (z. B. große Klassenbibliotheken).
Erhöhte Speicherfreigabe

Der durch die AOT-Kompilierung generierte Code ist positionsunabhängiger Code (PIC). Mono lädt diesen Code mithilfe des Kernelaufrufs „mmap“, und der gesamte Code wird tatsächlich von mehreren Mono-Instanzen im System gemeinsam genutzt.

Die JIT verschwendet nicht nur keine Zeit oder Speicher beim Generieren des Codes, sondern der ausgeführte Code ist dieselbe Kopie des Codes im Speicher, die von mehreren Prozessen in einem System gemeinsam genutzt wird.
Potenziell bessere Leistung

Wenn Sie eine Assembly mit dem –aot Flag „Mono“ vorkompilieren, können Sie auch zusätzliche Optimierungen aktivieren, die nicht Teil der Standardoptimierungen sind, die Mono beim JITing anwendet. JITing muss die Startzeit mit der Leistung des generierten Codes in Einklang bringen. Dies bedeutet, dass die fortschrittlichste Optimierung, die eine gründlichere Code-Analyse erfordert und langsamer ausgeführt wird, standardmäßig nicht aktiviert ist.

Mit AOT können Sie bestimmte Optimierungen aktivieren und deaktivieren, die Sie auf Ihren Code anwenden möchten. Optimierungen, die Sie mit der JIT-Engine nicht verwenden würden, da sie den Start Ihres Programms zu stark verlangsamen würden.

Eine häufige Verwendung ist:

mono –aot -O=all program.exe

mono –desktop -O=all OpenSim.exe

Das Flag „all“ für die Befehlszeilenoption „-O“ aktiviert alle Optimierungen. Wir empfehlen jedoch, dass Sie tatsächlich ein Profil erstellen und testen, ob bestimmte Optimierungen die Leistung Ihres Codes verbessern oder verringern, da nicht alle Optimierungen gleich gut funktionieren alle verschiedenen Codemuster.
Einschränkungen

Der vom AOT-Kompilierungsschritt generierte Code ist im Gegensatz zum JIT-Code, der auf die tatsächliche Ausführung des Prozesses abgestimmt ist, positionsunabhängig. Dies bedeutet, dass bestimmte Programme möglicherweise langsamer ausgeführt werden, da der generierte Code allgemeiner ist als der spezifische Code, den die JIT erzeugen kann.

Wenn Sie die Verwendung des von AOT generierten Codes für eine bestimmte Programmausführung deaktivieren möchten, verwenden Sie das -O=-aotBefehlszeilenflag zur Laufzeit.
Diskussion

Die Dokumentation zur Mono AOT-Implementierung finden Sie auf der Seite Mono: Runtime: Documentation: AOT .
AOTing aller Systembibliotheken

Mit den folgenden Befehlen können Sie alle Bibliotheken auf Ihrem System AOTEN:

sudo mono –aot /usr/lib/mono/4.5/mscorlib.dll
for i in /usr/lib/mono/gac///*.dll; do sudo mono –aot $i; done