- Erste Schritte
- Anforderungen
- Best Practices
- Installation
- Wird aktualisiert
- Identity Server
- Fehlerbehebung bei Startfehlern
Best Practices für Leistung
Auf der folgenden Seite werden die empfohlenen Anforderungen für große Produktionsumgebungen beschrieben und eine Reihe von bewährten Methoden zur Verbesserung ihrer Leistung beschrieben.
Für die Ausführung von 10.000 Attended-Robotern oder 1.000 Unattended-Robotern benötigen Sie:
- Ein F5-Lastausgleich
- Orchestrator – mindestens 6 Knoten, die auf Maschinen mit 8 CPU-Kernen und 16 GB RAM ausgeführt werden
- Roboter – Maschinen mit 4 CPU-Kernen und 16 GB RAM
-
SQL Server - Maschinen mit 4 Sockets/16 CPU-Kernen (Standard 8 Sockets/16 CPU-Kerne) und 64 GB RAM
Hinweis: Um SQL Server-Zuweisungskonflikte in einer sehr gleichzeitigen Umgebung zu reduzieren, stellen Sie sicher, dass Sie eine optimale Anzahl von tempdb-Datendateien mit gleicher Größe verwenden.
UiPathOrchestrator.dll.config
von Orchestrator vornehmen können, um die Leistung in einer großen Produktionsumgebung zu verbessern.
<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>
- Fügen Sie das Protokollierungsziel für Elasticsearch mithilfe der folgenden Parameter hinzu oder ändern Sie es.
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> - Fügen Sie die Roboterprotokollregel hinzu oder ändern Sie sie, um Protokolle nur in das im vorherigen Beispiel gezeigte Ziel zu schreiben. Dadurch wird das Standard-Datenbankziel automatisch deaktiviert.
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> - Konfigurieren Sie Orchestrator, um Protokolle aus ElasticSearch zu lesen.
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
Sie können sich zu diesem Zweck für Azure Blob Storage entscheiden.
<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>
Wenn Sie die Webhooks-Funktion nicht verwenden, können Sie sie deaktivieren.
<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>
Wenn Sie den Wartungsmodus nicht verwenden, können Sie ihn deaktivieren.
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
Sie können Orchestrator so konfigurieren, dass einige In-Memory-Caches verwendet werden, die die Anzahl der Aufrufe von Redis reduzieren. Wenn Sie sie z. B. so konfigurieren, dass sie alle 30 Minuten ablaufen, bedeutet dies, dass eine Änderung an einer Einstellung auf Anwendungsebene möglicherweise erst nach dem 30-Minuten-Intervall widergespiegelt wird.
Die hier festgelegte Ablaufzeit kann variieren, je nachdem, welche Verzögerung Sie tolerieren können, aber selbst eine Zwischenspeicherungszeit von 5 Minuten kann die Leistung erheblich verbessern.
<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
hilft in Anlaufszenarien.
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
Dieser Schritt ist nur notwendig, wenn Sie eine sehr hohe Anzahl von Triggern haben, die ausgelöst werden, z. B. in der Größenordnung von 2.000 pro 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>
Wenn Sie sich nicht in einem Unternehmensnetzwerk befinden oder die DNS-Namen von IPs, die in der Prüfung aufgezeichnet wurden, nicht sehen müssen, können Sie die Lösung deaktivieren.
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
Directory.ActiveDirectory.GroupMembershipFetchStrategy
und Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
gelten nur für den Legacy AD-Adapter. Sie sollten diese Einstellungen nur verwenden, wenn Sie von einer Orchestrator-Version mit aktiviertem AD auf 2021.10 oder höher aktualisiert haben.
Directory.ActiveDirectory.GroupMembershipFetchStrategy
in der Tabelle [identity].[Settings]
auf TokenGroups
festzulegen, führen Sie Folgendes aus:
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
in der Tabelle [identity].[Settings]
auf vier Stunden festzulegen, führen Sie Folgendes aus:
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
gilt nur für den Legacy AD-Adapter. Sie sollten diese Einstellung nur verwenden, wenn Sie von einer Orchestrator-Version mit aktiviertem AD auf 2021.10 oder höher aktualisiert haben.
Directory.ActiveDirectory.CacheExpirationSeconds
in der Tabelle [identity].[Settings]
verwenden. Der Standardwert dieser Einstellung ist 43200 Sekunden (12 Stunden). Um das AD Domänen-Caching zu deaktivieren, müssen Sie diese Einstellung auf 0 festlegen.
Um diese Einstellung auf sieben Tage festzulegen, führen Sie Folgendes aus:
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)
So deaktivieren Sie das AD Domänen-Caching:
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)
Während einer offensiven Anlaufphase würden die Lizenzerwerbsereignisse die SignalR Redis-Backplane erheblich unter Druck setzen. Um dies zu mildern, kann das Ereignis deaktiviert werden, was dazu führt, dass die Lizenzierungsbenutzeroberfläche nicht mehr in Echtzeit aktualisiert wird. Wenn Sie jedoch 100.000 Roboter haben, ist diese Bildschirmaktualisierung in Echtzeit von geringem Wert.
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
Diese Änderung stellt sicher, dass der Paketinhalt serverseitig zwischengespeichert wird, und kann sich als nützlich erweisen, wenn die Dateifreigabe nicht mit dem Paket-Download-Durchsatz mithalten kann.
<<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
sollte ausreichen, um die Funktion zu aktivieren. Sie müssen nur die restlichen Einstellungen anpassen, die im obigen Beispiel angezeigt werden, wenn Sie die Standardeinstellungen ändern möchten, z. B. die Größe des Caches oder der Paketgrößenbeschränkungen erhöhen möchten.
Legen Sie die folgende Konfiguration für den Produktionsslot des Orchestrator App Service als angeheftet fest.
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
Legen Sie die folgende Konfiguration sowohl für die Produktions- als auch für die Hotswap-Bereitstellungsslots des Orchestrator App Service fest. Während der Bereitstellung wird die Anwendung aufgewärmt, wodurch die Leistungseinbußen minimiert werden, die durch die Umleitung von Datenverkehr an eine kalte App verursacht werden.
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
Die Verwendung von Azure SignalR Service in einer Azure-Bereitstellung kann die Last auf den Webservern erheblich reduzieren. Weitere Informationen zu dieser Einstellung finden Sie unter Scalability.AzureSignalR.ConnectionString .
<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
und konfigurieren Sie sie entsprechend Ihren Anforderungen:
-
RobotsLogs.Flush.Interval
<add key="RobotsLogs.Flush.Interval" value="0" />
<add key="RobotsLogs.Flush.Interval" value="0" />
Weitere Informationen zu dieser Einstellung finden Sie unter RobotsLogs.Flush.Interval.
-
RobotsLogs.Flush.BatchSize
<add key="RobotsLogs.Flush.BatchSize" value="100" />
<add key="RobotsLogs.Flush.BatchSize" value="100" />
Weitere Informationen zu dieser Einstellung finden Sie unter RobotsLogs.Flush.BatchSize.
AppSettings.Production.json
von Identity Server sollten zu einer verbesserten Leistung in großen Produktionsumgebungen führen.
"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"
}
Auf der Benutzeroberfläche von Orchestrator können Sie die folgenden Schritte ausführen, um die Leistung in großen Produktionsumgebungen zu verbessern:
- Deaktivieren des persönlichen Arbeitsbereichs;
- Deaktivieren von Webanmeldung zulassen für Roboterbenutzer;
- Weisen Sie Roboterbenutzern die Rollen Roboter und Automation User zu.
- Empfohlene Anforderungen für große Produktionsumgebungen
- Orchestrator-Änderungen für verbesserte Leistung
- Aktivieren von Redis
- Geben Sie eine große maximale Poolgröße in der Verbindungszeichenfolge an.
- Schreiben von Roboterprotokollen in Elasticsearch und Verwenden von AsyncWrapper
- Verwenden eines Speichers mit hohem Durchsatz
- Deaktivieren von Webhooks und Ledger
- Wartungsmodus deaktivieren
- Erhöhen der Zwischenspeicherungszeit von Anwendungseinstellungen
- MinWorkerThreads-Wert erhöhen
- Optimieren von Quarz für sehr hohen Durchsatz
- Deaktivieren von IP-zu-DNS-Auflösung in der Prüfung
- Wechseln zu einer schnelleren Strategie zum Abrufen der Gruppenmitgliedschaft
- Ablaufzeit des AD Domänen-Cache anpassen
- Deaktivieren von SignalR für Roboter-Lizenzänderungsereignisse
- Aktivieren der NuGet-Paketzwischenspeicherung
- Aktivieren des lokalen Caches in Azure PaaS-Bereitstellungen
- Konfigurieren von Slot Warm-Up in Azure PaaS-Bereitstellungen
- Verwenden von Azure SignalR Service in Azure PaaS-Bereitstellungen
- Anpassen des Flush-Intervalls und der Größe für den SubmitLogs-Endpunkt
- Identity Server-Änderungen für verbesserte Leistung
- Geben Sie eine große maximale Poolgröße in der Verbindungszeichenfolge an.
- Aktivieren von Redis
- Benutzeroberflächenkonfigurationsänderungen für verbesserte Leistung