PowerShell Universal permet aux utilisateurs de créer des API avec PowerShell. Ces API peuvent servir à créer des webhooks, à s’intégrer à d’autres systèmes ou à offrir une API REST pour vos scripts PowerShell. Dans cet article, nous verrons quelques changements que vous pouvez apporter pour améliorer les performances des points de terminaison d’API.
Dans cet article, nous avons utilisé West Wind WebSurge pour tester les performances des API. Cet outil permet d’envoyer un certain nombre de requêtes vers une URL et de mesurer leurs performances. Nous exécutons un test de 60 secondes avec 10 threads.
Pour ce test, nous exécutons une version non licenciée de PowerShell Universal avec un seul point de terminaison d’API. Ce point de terminaison est un script simple qui retourne une chaîne.
New-PSUEndpoint -Url "/hello" -Method @('GET') -Endpoint {
"hello"
}
Nous utilisons LiteDB pour la persistance.
Mettre à jour vers la 4.1.5 ou une version ultérieure
La première chose à faire est de mettre à jour vers PowerShell Universal 4.1.5 ou une version ultérieure. Cette version inclut plusieurs améliorations de performance du système d’API. Nous observons environ 300 % d’amélioration des performances d’API avec cette version et les paramètres par défaut.
Résultats :
- 4.1.4 avec les paramètres par défaut : 150 requêtes par seconde
- 4.1.5 avec les paramètres par défaut : 470 requêtes par seconde
Ajuster les cibles de journalisation et les paramètres du journal système
Par défaut, PowerShell Universal a des journaux verbeux configurés. Nous apporterons les changements suivants à la configuration de la journalisation.
Désactiver les journaux système verbeux
Dans appsettings.json, définissez SystemLogLevel sur Error plutôt que Verbose.
{
"SystemLogPath": "%ProgramData%\\PowerShellUniversal\\systemLog.txt",
"SystemLogLevel": "Error"
}
Désactiver la journalisation de portée utilisateur pour les API
Plutôt que d’envoyer des messages de journal à la base de données et au système de fichiers, nous désactiverons la journalisation de portée utilisateur pour les API. Vous pouvez envoyer des messages de journal pour des fonctions précises, comme les Apps.
New-PSULoggingTarget -Type "Database" -Properties @{
} -Feature "App"
New-PSULoggingTarget -Type "File" -Properties @{
path = "C:\ProgramData\PowerShellUniversal\log.txt"
} -Feature "App"
Il est aussi possible de réduire le niveau de journal des cibles plutôt que de les désactiver complètement.
New-PSULoggingTarget -Type "Database" -Properties @{
} -Level "Error"
New-PSULoggingTarget -Type "File" -Properties @{
path = "C:\ProgramData\PowerShellUniversal\log.txt"
} -Level "Error"
Résultats :
- 4.1.4 : 980 requêtes par seconde
- 4.1.5 : 1 200 requêtes par seconde
Paramètres d’environnement
Certaines fonctions des environnements PowerShell Universal peuvent influer sur les performances. Nous apporterons les changements suivants aux paramètres d’environnement.
Runspaces persistants
La réinitialisation de l’état du runspace prend du temps, donc l’éviter peut améliorer les performances. Notez que les runspaces persistants conservent la valeur des variables, des fonctions et des alias définis pendant l’exécution du point de terminaison. Selon l’implémentation de votre point de terminaison, cela peut ne pas être souhaitable.
Augmenter le nombre maximal de runspaces
Par défaut, PowerShell Universal crée 25 runspaces par environnement. Nous augmenterons ce nombre à 100. Cela augmentera l’utilisation de la mémoire, mais améliorera légèrement les performances.
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."
Résultats :
- 4.1.4 : 1 025 requêtes par seconde
- 4.1.5 : 1 300 requêtes par seconde
Une note sur les environnements externes
Ci-dessus, vous remarquerez que nous utilisons l’environnement Integrated. C’est un environnement intégré à PowerShell Universal. C’est un environnement PowerShell qui s’exécute directement dans le processus PowerShell Universal. Même si nous ajustions les points de terminaison pour utiliser un environnement externe, les résultats sont similaires. Ceci s’exécute dans un environnement PowerShell 7.3.7.
- 4.1.4 : 1 015 requêtes par seconde
- 4.1.5 : 1 250 requêtes par seconde
Utiliser la persistance SQL
La persistance SQL peut grandement améliorer le débit des API. Ce test a été effectué contre une base de données SQL locale, avec tous les paramètres ci-dessus configurés, et uniquement sur la version 4.1.5.
Résultats :
- 4.1.5 : 2 900 requêtes par seconde
Conclusion
Avec ces changements, nous avons amélioré les performances de notre API d’environ 1 900 %. Nous sommes passés de 150 requêtes par seconde à environ 2 900 requêtes par seconde. La persistance SQL a donné la plus grande hausse de performance. Combinée surtout aux changements du système de journalisation, elle permet un gain significatif.
N’hésitez pas à nous écrire pour vos commentaires ou questions sur les forums.
Prêt à construire? Téléchargez PowerShell Universal.

Adam Driscoll