MAIN MENU
Devolutions Blog

Ankündigungen, Aktualisierungen und Einsichten von Devolutions

Devolutions PowerShell Universal optimizing API performance illustration for the blog.

API-Leistung in PowerShell Universal optimieren: wichtige Verbesserungen und Ergebnisse

Gehen Sie West-Wind-WebSurge-Tests eines /hello-Endpunkts durch und vergleichen Sie LiteDB-Standardwerte, SystemLogLevel, New-PSULoggingTarget, persistente Runspaces, MaxRunspaces und SQL-Persistenz von 150 auf etwa 2.900 Anfragen pro Sekunde.

PowerShell Universal ermöglicht es Benutzern, APIs mit PowerShell zu erstellen. Diese APIs können Webhooks erstellen, andere Systeme anbinden oder eine REST-API für Ihre PowerShell-Skripte bereitstellen. In diesem Beitrag sehen wir uns einige Änderungen an, mit denen Sie die Leistung von API-Endpunkten verbessern können.

In diesem Beitrag haben wir West Wind WebSurge verwendet, um die API-Leistung zu testen. Dieses Tool sendet eine Reihe von Anfragen an eine URL und misst deren Leistung. Wir führen einen 60-Sekunden-Test mit 10 Threads aus.

West Wind WebSurge session sending GET requests to localhost:5000/hello.
West-Wind-WebSurge-Lasttest gegen den PowerShell-Universal-Endpunkt /hello

Für diesen Test führen wir eine unlizenzierte Version von PowerShell Universal mit einem einzelnen API-Endpunkt aus. Der API-Endpunkt ist ein einfaches Skript, das eine Zeichenfolge zurückgibt.

New-PSUEndpoint -Url "/hello" -Method @('GET') -Endpoint {
    "hello"
}

Wir verwenden LiteDB für die Persistenz.

Auf 4.1.5 oder neuer aktualisieren

Als Erstes können Sie auf PowerShell Universal 4.1.5 oder neuer aktualisieren. Diese Version enthält mehrere Leistungsverbesserungen am API-System. Mit den Standardeinstellungen sehen wir etwa 300 % Verbesserung der API-Leistung.

Ergebnisse:

  • 4.1.4 mit Standardeinstellungen: 150 Anfragen pro Sekunde
  • 4.1.5 mit Standardeinstellungen: 470 Anfragen pro Sekunde

Logging-Ziele und Systemprotokolleinstellungen anpassen

Standardmäßig sind in PowerShell Universal ausführliche Protokolle konfiguriert. Wir nehmen die folgenden Änderungen an der Logging-Konfiguration vor.

Ausführliche Systemprotokolle deaktivieren

Setzen Sie in appsettings.json SystemLogLevel auf Error statt auf Verbose.

{
    "SystemLogPath": "%ProgramData%\\PowerShellUniversal\\systemLog.txt",
    "SystemLogLevel": "Error"
}

Benutzerbezogenes Logging für APIs deaktivieren

Anstatt Protokollmeldungen an die Datenbank und das Dateisystem zu senden, deaktivieren wir das benutzerbezogene Logging für APIs. Sie können Protokollmeldungen für bestimmte Features senden, etwa Apps.

New-PSULoggingTarget -Type "Database" -Properties @{
} -Feature "App"

New-PSULoggingTarget -Type "File" -Properties @{
    path = "C:\ProgramData\PowerShellUniversal\log.txt"
} -Feature "App"

Es ist auch möglich, die Protokollebene für Ziele zu senken, statt sie vollständig zu deaktivieren.

New-PSULoggingTarget -Type "Database" -Properties @{
} -Level "Error"

New-PSULoggingTarget -Type "File" -Properties @{
    path = "C:\ProgramData\PowerShellUniversal\log.txt"
} -Level "Error"

Ergebnisse:

  • 4.1.4: 980 Anfragen pro Sekunde
  • 4.1.5: 1.200 Anfragen pro Sekunde

Umgebungseinstellungen

Bestimmte Funktionen von PowerShell-Universal-Umgebungen können die Leistung beeinflussen. Wir nehmen die folgenden Änderungen an den Umgebungseinstellungen vor.

Persistente Runspaces

Das Zurücksetzen des Runspace-Zustands kostet Zeit. Das zu vermeiden kann die Leistung verbessern. Beachten Sie, dass persistente Runspaces die Werte von Variablen, Funktionen und Aliasen behalten, die während der Ausführung des Endpunkts definiert wurden. Je nach Implementierung Ihres Endpunkts ist das möglicherweise nicht erwünscht.

Maximale Runspaces erhöhen

Standardmäßig erstellt PowerShell Universal 25 Runspaces pro Umgebung. Wir erhöhen das auf 100. Das erhöht den Speicherverbrauch, verbessert die Leistung aber leicht.

New-PSUEnvironment -Name "Integrated" -Version "7.3.6" -Path "Universal.Server" -Variables @('*') -PersistentRunspace -MaxRunspaces 100 -Description "An environment for running scripts directly in the PowerShell Universal server."

Ergebnisse:

  • 4.1.4: 1.025 Anfragen pro Sekunde
  • 4.1.5: 1.300 Anfragen pro Sekunde

Hinweis zu externen Umgebungen

Oben sehen Sie, dass wir die Umgebung Integrated verwenden. Das ist eine in PowerShell Universal integrierte Umgebung. Es ist eine PowerShell-Umgebung, die direkt im PowerShell-Universal-Prozess läuft. Selbst wenn wir die Endpunkte auf eine externe Umgebung umstellen würden, sind die Ergebnisse ähnlich. Das läuft in einer PowerShell-7.3.7-Umgebung.

  • 4.1.4: 1.015 Anfragen pro Sekunde
  • 4.1.5: 1.250 Anfragen pro Sekunde

SQL-Persistenz verwenden

SQL-Persistenz kann den API-Durchsatz stark verbessern. Dieser Test wurde gegen eine lokale SQL-Datenbank mit allen oben konfigurierten Einstellungen und nur unter Version 4.1.5 ausgeführt.

Ergebnisse:

  • 4.1.5: 2.900 Anfragen pro Sekunde

Fazit

Mit diesen Änderungen haben wir die Leistung unserer API um etwa 1.900 % verbessert. Wir sind von 150 Anfragen pro Sekunde auf etwa 2.900 Anfragen pro Sekunde gekommen. SQL-Persistenz brachte den größten Leistungsgewinn. Besonders in Kombination mit Änderungen am Logging-System können Sie eine deutliche Steigerung erreichen.

Bitte senden Sie Feedback oder Fragen in den Foren.

Bereit zum Bauen? PowerShell Universal herunterladen.