- Démarrage
- Prérequis
- Prérequis matériels
- Prérequis logiciels
- Serveur Web sur une seule machine (Web Server on a Single Machine)
- Déploiement multinœud
- Haute disponibilité (High Availability)
- Récupération d'urgence (Disaster Recovery) - Active/Passive
- Récupération d'urgence (Disaster Recovery) - Deux centres de données actifs (Two Active Data Centers)
- Déploiement dans le cloud (Deployment in the Cloud)
- Meilleures pratiques
- Installation
- Mise à jour en cours
- Serveur d'identité
- Module complémentaire haute disponibilité
Bonnes pratiques de performance
La page suivante décrit les exigences recommandées pour les environnements de production à grande échelle et fournit un ensemble des meilleures pratiques visant à améliorer leurs performances.
Pour exécuter 10K de Attended Robot ou 1K de Unattended Robot , vous avez besoin de :
- Un équilibreur de charge F5
- Orchestrator : au moins 6 nœuds qui s'exécutent sur des machines avec un processeur 8 cœurs et 16 Go de RAM.
- Robots : machines avec processeur 4 cœurs et 16 Go de RAM
-
SQL Server - machines avec 4 prises / 16 cœurs processeur CPU (par défaut 8 prises/16 cœurs processeur cpu) et 64 Go de RAM
Remarque : Pour réduire les conflits d'allocation du serveur SQL dans un environnement hautement concourant, veillez à utiliser un nombre optimal de fichiers de données tempdb de taille égale.
UiPathOrchestrator.dll.config
Orchestrator afin d’améliorer les performances dans un environnement de production à grande échelle.
<appSettings>
<add key="LoadBalancer.UseRedis" value="true"/>
<add key="LoadBalancer.Redis.ConnectionString" value="your.redis.cache.windows.net:6379,password=***"/>
</appSettings>
<appSettings>
<add key="LoadBalancer.UseRedis" value="true"/>
<add key="LoadBalancer.Redis.ConnectionString" value="your.redis.cache.windows.net:6379,password=***"/>
</appSettings>
<connectionStrings>
<add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings>
<connectionStrings>
<add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings>
- Ajoutez ou modifiez la cible d’enregistrement pour Elasticsearch en utilisant les paramètres suivants.
xml <nlog> <targets> <target name="robotElasticBuffer" xsi:type="AsyncWrapper" overflowAction="Grow" queueLimit="10000" batchSize="1000" timeToSleepBetweenBatches="1"> <target xsi:type="ElasticSearch" name="robotElastic" uri="elastic.example.com:9200" requireAuth="true" username="***" password="***" index="${event-properties:item=indexName}-${date:format=yyyy.MM}" documentType="logEvent" includeAllProperties="true" layout="${message}" excludedProperties="agentSessionId,tenantId,indexName" /> </target> </targets> </nlog>
xml <nlog> <targets> <target name="robotElasticBuffer" xsi:type="AsyncWrapper" overflowAction="Grow" queueLimit="10000" batchSize="1000" timeToSleepBetweenBatches="1"> <target xsi:type="ElasticSearch" name="robotElastic" uri="elastic.example.com:9200" requireAuth="true" username="***" password="***" index="${event-properties:item=indexName}-${date:format=yyyy.MM}" documentType="logEvent" includeAllProperties="true" layout="${message}" excludedProperties="agentSessionId,tenantId,indexName" /> </target> </targets> </nlog> - Ajoutez ou modifiez la règle des journaux de robots pour écrire des journaux uniquement sur la cible indiquée dans l’exemple précédent. Cela désactive automatiquement la cible de base de données par défaut.
xml <nlog> <rules> <logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="robotElasticBuffer" /> </rules> </nlog>
xml <nlog> <rules> <logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="robotElasticBuffer" /> </rules> </nlog> - Configurez Orchestrator pour lire les journaux de ElasticSearch.
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
Vous pouvez opter pour Azure Blob Storage à cette fin.
<appSettings>
<add key="Storage.Type" value="Azure" />
<add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings>
<appSettings>
<add key="Storage.Type" value="Azure" />
<add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings>
Si vous n’utilisez pas la fonction Webhooks, vous pouvez la désactiver.
<appSettings>
<add key="Webhooks.Enabled" value="false" />
<add key="Ledger.Enabled" value="false"/>
<add key="Webhooks.LedgerIntegration.Enabled" value="false" />
</appSettings>
<appSettings>
<add key="Webhooks.Enabled" value="false" />
<add key="Ledger.Enabled" value="false"/>
<add key="Webhooks.LedgerIntegration.Enabled" value="false" />
</appSettings>
Si vous n’utilisez pas le mode maintenance, vous pouvez le désactiver.
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
Vous pouvez configurer Orchestrator pour utiliser des caches en mémoire qui réduisent le nombre d'appels à Redis. Par exemple, si vous les configurez pour qu'ils expirent toutes les 30 minutes, cela signifie que, lorsque vous modifiez un paramètre au niveau de l'application, il peut ne pas être pris en compte avant la fin de l'intervalle de 30 minutes.
Le délai d'expiration que vous fixez ici peut varier en fonction du délai que vous pouvez tolérer, mais même une mise en cache de 5 minutes peut améliorer considérablement les performances.
<appSettings>
<add key="Caching.MultiTier[AbpApplicationSettingsCache]" value="Memory" />
<add key="Caching.MultiTier[AbpApplicationSettingsCache].ExpiresAfter" value="0:30:00" />
<add key="Caching.MultiTier[AbpTenantSettingsCache]" value="Memory"/>
<add key="Caching.MultiTier[AbpTenantSettingsCache].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[AbpZeroTenantFeatures]" value="Memory"/>
<add key="Caching.MultiTier[AbpZeroTenantFeatures].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[AbpZeroRolePermissions]" value="Memory"/>
<add key="Caching.MultiTier[AbpZeroRolePermissions].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[LicenseKeys]" value="Memory"/>
<add key="Caching.MultiTier[LicenseKeys].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[TenantLicense]" value="Memory"/>
<add key="Caching.MultiTier[TenantLicense].ExpiresAfter" value="0:30:00"/>
</appSettings>
<appSettings>
<add key="Caching.MultiTier[AbpApplicationSettingsCache]" value="Memory" />
<add key="Caching.MultiTier[AbpApplicationSettingsCache].ExpiresAfter" value="0:30:00" />
<add key="Caching.MultiTier[AbpTenantSettingsCache]" value="Memory"/>
<add key="Caching.MultiTier[AbpTenantSettingsCache].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[AbpZeroTenantFeatures]" value="Memory"/>
<add key="Caching.MultiTier[AbpZeroTenantFeatures].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[AbpZeroRolePermissions]" value="Memory"/>
<add key="Caching.MultiTier[AbpZeroRolePermissions].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[LicenseKeys]" value="Memory"/>
<add key="Caching.MultiTier[LicenseKeys].ExpiresAfter" value="0:30:00"/>
<add key="Caching.MultiTier[TenantLicense]" value="Memory"/>
<add key="Caching.MultiTier[TenantLicense].ExpiresAfter" value="0:30:00"/>
</appSettings>
MinWorkerThreads
aide avec les scénarios de montée en puissance.
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
Cette étape n'est nécessaire que si vous disposez d'un nombre très élevé de déclencheurs de tir, comme par exemple de l'ordre de 2.000 par minute.
<quartz>
<add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="15" />
<add key="quartz.threadPool.threadCount" value="15" />
<add key="quartz.jobStore.misfireThreshold" value="3600000" />
<add key="quartz.jobStore.clusterCheckinInterval" value="60000" />
<add key="quartz.jobStore.clustered" value="true" />
</quartz>
<quartz>
<add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="15" />
<add key="quartz.threadPool.threadCount" value="15" />
<add key="quartz.jobStore.misfireThreshold" value="3600000" />
<add key="quartz.jobStore.clusterCheckinInterval" value="60000" />
<add key="quartz.jobStore.clustered" value="true" />
</quartz>
Si vous n'êtes pas dans un réseau d'entreprise ou si vous n'avez pas besoin de voir les noms DNS des IP enregistrés dans l'Audit, vous pouvez désactiver la résolution.
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
TokenGroups
peut augmenter les performances de connexion. Ce paramètre n’est pas affiché par défaut dans UiPathOrchestrator.dll.config
, et la stratégie n’est pas activée par défaut, implicitement.
<appSettings>
<add key="WindowsAuth.GroupMembershipFetchStrategy" value="TokenGroups" />
</appSettings>
<appSettings>
<add key="WindowsAuth.GroupMembershipFetchStrategy" value="TokenGroups" />
</appSettings>
Lors d'une montée en puissance agressive, les événements d'acquisition de licence exerceraient une pression importante sur le fond de panier SignalR Redis. Pour atténuer cela, l'événement peut être désactivé, ce qui fait que l'interface utilisateur d'acquisition de licence n'est plus mise à jour en temps réel. Cependant, lorsque vous avez des robots de 100 000 tonnes de capacité, la mise à jour de l'écran en temps réel n'a que peu de valeur.
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
Cette modification assure la mise en cache côté serveur du contenu des packages. Cela peut s’avérer utile lorsque le partage de fichiers ne peut pas suivre le rythme du débit de téléchargement des packages.
<<add key="NuGet.Caching.Enabled" value="true" />
<add key="NuGet.Caching.MaxCacheSize" value="104857600" /><!-- (100 MiB) -->
<add key="NuGet.Caching.MaxPackageSize" value="4194304" /><!-- (4 MiB) -->
<add key="NuGet.Caching.AbsoluteExpirationRelativeToNow" value="00:10:00" /><!-- (1 min) -->
<<add key="NuGet.Caching.Enabled" value="true" />
<add key="NuGet.Caching.MaxCacheSize" value="104857600" /><!-- (100 MiB) -->
<add key="NuGet.Caching.MaxPackageSize" value="4194304" /><!-- (4 MiB) -->
<add key="NuGet.Caching.AbsoluteExpirationRelativeToNow" value="00:10:00" /><!-- (1 min) -->
NuGet.Caching.Enabled
devrait suffire à activer la fonctionnalité. Vous n’avez qu’à ajuster le reste des paramètres affichés dans l’exemple ci-dessus si vous souhaitez modifier les valeurs par défaut, par exemple, augmenter la taille du cache ou les limites de taille des packages.
Définissez la configuration suivante comme un "sticky slot" sur le créneau de production du service Orchestrator App Service.
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
Définissez la configuration suivante sur les créneaux de production et de déploiement Hotswap de l'Orchestrator App Service. Pendant le déploiement, cela permettra de démarrer l'application, en minimisant l'impact sur les performances causé par la redirection du trafic vers une application figée.
WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200
WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200
L'utilisation du service Azure SignalR dans un déploiement Azure peut réduire considérablement la charge sur les serveurs Web. Voir Scalability.AzureSignalR.ConnectionString pour plus de détails sur le paramètre.
<appSettings>
<add key="LoadBalancer.UseRedis" value="true"/>
<add key="Scalability.AzureSignalR.ConnectionString" value="**myAzureSignalRConnectionString" />
</appSettings>
<appSettings>
<add key="LoadBalancer.UseRedis" value="true"/>
<add key="Scalability.AzureSignalR.ConnectionString" value="**myAzureSignalRConnectionString" />
</appSettings>
UiPath.Orchestrator.dll.config
et configurez-les en fonction de vos besoins :
-
RobotsLogs.Flush.Interval
<add key="RobotsLogs.Flush.Interval" value="0" />
<add key="RobotsLogs.Flush.Interval" value="0" />
Pour plus d'informations sur ce paramètre, consultez RobotsLogs.Flush.Interval.
-
RobotsLogs.Flush.BatchSize
<add key="RobotsLogs.Flush.BatchSize" value="100" />
<add key="RobotsLogs.Flush.BatchSize" value="100" />
Pour en savoir plus sur ce paramètre, voir RobotsLogs.Flush.BatchSize.
AppSettings.Production.json
devraient se traduire par une amélioration des performances dans les environnements de production à grande échelle.
"ConnectionStrings": {
"DefaultConnection": "Data Source=dbServer;Initial Catalog=UiPath_is;User ID=username;Password=****;Max Pool Size=1000"
}
"ConnectionStrings": {
"DefaultConnection": "Data Source=dbServer;Initial Catalog=UiPath_is;User ID=username;Password=****;Max Pool Size=1000"
}
L’interface utilisateur d’Orchestrator vous permet de prendre les mesures suivantes afin d’améliorer les performances dans les environnements de production à grande échelle :
- Désactivez l’espace de travail personnel ;
- Désactivez Autoriser la connexion Web pour les utilisateurs de robots ;
- Attribuez des rôles de Robot et d’Automation User aux utilisateurs de robots.
- Exigences recommandées pour les environnements de production à grande échelle
- Modifications Orchestrator pour une meilleure performance
- Activez Redis
- Spécifiez une taille maximale de pool dans la chaîne de connexion
- Écrivez des journaux de Robot à Elasticsearch et utilisez AsyncWrapper
- Utilisez un stockage à haut débit
- Désactivez Webhooks et Ledger
- Désactivez le mode maintenance
- Augmentez le temps de mise en cache des paramètres d’application
- Augmenter la valeur MinWorkerThreads
- Réglez Quartz pour un débit très élevé
- Désactivez l'IP pour DNS Resolving dans Audit
- Passez à une stratégie plus rapide pour aller chercher l’adhésion aux groupes
- Désactivez Signalr pour les événements de changement de licence de Robot
- Activer la mise en cache des packages NuGet
- Activez le cache local dans les déploiements Azure PaaS
- Configurez le démarrage des créneaux dans les déploiements Azure PaaS
- Utilisez Azure SignalR Service dans les déploiements Azure PaaS
- Ajuster l’intervalle et la taille de vidage pour le point de terminaison SubmitLogs
- Changements de serveur d’identité pour une performance améliorée
- Spécifiez une taille maximale de pool dans la chaîne de connexion
- Activez Redis
- Modifications Orchestrator pour une meilleure performance