- Démarrage
- Prérequis
- Meilleures pratiques
- Installation
- Mise à jour en cours
- Serveur d'identité
- Résolution des erreurs de démarrage
Guide d'installation d'Orchestrator
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>
Directory.ActiveDirectory.GroupMembershipFetchStrategy
et Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
ne s'appliquent qu'à l'adaptateur AD hérité. Vous ne devez utiliser ces paramètres que si vous avez effectué une mise à niveau depuis une version d'Orchestrator dans laquelle AD était activé vers 2021.10 ou une version ultérieure.
Directory.ActiveDirectory.GroupMembershipFetchStrategy
vers TokenGroups
dans la table [identity].[Settings]
, exécutez :
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='TokenGroups' WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.GroupMembershipFetchStrategy', 'TokenGroups', 1)
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='TokenGroups' WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.GroupMembershipFetchStrategy', 'TokenGroups', 1)
Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
sur 4 heures dans la table [identity].[Settings]
, exécutez :
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='4' WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours', '4', 1)
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='4' WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours', '4', 1)
Directory.ActiveDirectory.CacheExpirationSeconds
ne s'applique qu'à l'adaptateur AD hérité. Vous ne devez utiliser ce paramètre que si vous avez effectué une mise à niveau depuis une version d'Orchestrator dans laquelle AD était activé vers 2021.10 ou une version ultérieure.
Directory.ActiveDirectory.CacheExpirationSeconds
dans la table [identity].[Settings]
. La valeur par défaut de ce paramètre est de 43 200 secondes (12 heures). Pour désactiver la mise en cache du domaine AD, vous devez définir ce paramètre sur 0.
Pour définir ce paramètre sur 7 jours, exécutez :
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='604800' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '604800', 1)
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='604800' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '604800', 1)
Pour désactiver la mise en cache du domaine AD, exécutez :
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='0' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '0', 1)
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='0' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '0', 1)
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
- Ajuster le délai d'expiration du cache du domaine AD
- 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