Ich habe eine ASP.NET-Anwendung, die auf meinem Windows-Entwicklungscomputer gut funktioniert. Der Server läuft jedoch unter Linux, und sobald er hochgeladen wird, läuft derselbe Code dort 4 oder 5 mal langsamer als auf der Windows-Box (für eine Aufgabe etwa 25 Sekunden im Vergleich zu 5 Sekunden).
Ist diese Leistung ein bekanntes Problem mit Mono? Und kann ich irgendetwas dagegen tun? Der Code ist meist Textverarbeitung, String ersetzt, Regexes und dergleichen, wenn das einen Unterschied macht. Ich habe meinen Code mit VS lokal profiliert und debugged, aber ich weiß nicht, ob es möglich ist, Remote-Debugging auf dem Server mit Mono durchzuführen, oder was ich als nächstes tun muss, um es wirklich zu beheben.
Regexes sind ein besonders schwacher Bereich für Mono. Die Regex-Klasse von Mono verwendet immer interpretierten Code, während .Net sie in kompilierte IL umwandeln kann, was zu einer viel schnelleren Ausführung führt.
Die meisten anderen Formen der Textverarbeitung wie Ersetzungen sollten ungefähr ähnlich sein.
Installieren Sie Mono, vorzugsweise auf einem Linux-System, das Ihrem Server ähnelt. Profilieren Sie Ihren Code auf Mono und sehen Sie, wo die Engpässe sind.
Ich habe eine Mono-App auf einem Linux-Server, der den Apache-Protokolldateien folgt. Ich habe es unter Windows entwickelt und beim Testen unter Linux fand ich, dass es bei Mono 2.4 gegenüber .NET 3.5 etwa 8-10 mal langsamer ist. Die meiste Zeit wird in Regex.Match und String-Funktionen verbracht. Ich konnte die Gesamtgeschwindigkeit des Programms in Mono verdoppeln, indem ich StringComparison.Ordinal in 4 Aufrufen von string.EndsWith () spezifizierte. Wenn der Vergleich der Ordinalstrings gewünscht wird, kann das eine Geschwindigkeitssteigerung bedeuten.
Selbst mit StringComparison.Ordinal war string.StartsWith () immer noch langsam. Ich habe eine Steigerung der Gesamtprogrammgeschwindigkeit um 25% erreicht, indem ich meine eigene Version von string.StartsWith () geschrieben habe.
Wenn Ordnungsvergleiche das sind, was Ihre App tun muss, versuchen Sie, StringComparison.Ordinal anzugeben oder eigene String-Funktionen zu schreiben.
Verwenden Sie mod_mono oder mod_proxy dafür? Während es Einschränkungen gibt, was Sie aus Mono herausholen können, werden Sie mit mod_mono weniger allgemeine Verzögerung bekommen als mit mod_proxy.
Bitte lesen Sie den Abschnitt "mod_mono und mod_proxy" unter Mono ASP.NET FAQ
Verwenden Sie StringBuilder-Objekte oder führen Sie eine Kettenverkettung durch. Wenn Sie viel String-Arbeit machen, werden Sie einige Performance-Fehler bekommen.
Aber ich denke, dass leppie es auf den Kopf gestellt hat, hat Microsoft eine Menge Geld damit verbracht, ASP.net in IIS zu testen und zu integrieren, so dass es wirklich, wirklich schnell war. Wenn Sie nicht für die MS-Box bezahlen möchten, müssen Sie sich damit auseinandersetzen, dass Mono Open Source ist und IIS ein getestetes kommerzielles Produkt ist.
Ein gutes Beispiel ist hier, wo Microsoft tatsächlich Windows selbst mit einer Kernel-Modus-Bibliothek modifiziert hat, die mit dem IIS-Server zusammenarbeitet. Richtig gestaltete Anwendungen, die den Cache ordnungsgemäß verwenden, können in diesem Code sehr gute Leistungssteigerungen erzielen: HTTP.sys
Laut dieser akademischen Studie kann die Mono-Performance in einigen Linux-Distributionen aufgrund einiger Linux-Systeme beeinträchtigt sein '' viel schnellere Neigung, auf den Festplatten-Cache / Auslagerungsspeicher zu gehen '[im Vergleich zu Windows].
"Bitte beachten Sie den großen Unterschied in den beiden Betriebssystemen angegeben sogar mit nativem Code. Um 131072 Integer im Array der Fedora Core 4 Test 3 Betriebssystem ausgeführt mehr als 3 mal langsamer als die genau denselben Code in Windows. "
Da die Linux-Kernelkonfigurationskonfigurationen variieren, wäre es nützlich zu wissen, welche Betriebssystemverteilung und -version Sie auf Ihrem Linux-Server ausführen und wie viel Speicher und CPU-Zyklen für Ihre Anwendung verfügbar sind.
Tags und Links c# asp.net performance mono mod-mono