- Primeros pasos
- Requisitos
- Mejores prácticas
- Instalación
- Actualizando
- Servidor de identidad
- Solución de problemas de errores de inicio
Mejores prácticas de rendimiento
La siguiente página describe los requisitos recomendados para entornos de producción a gran escala y proporciona un conjunto de prácticas recomendadas para mejorar su rendimiento.
Para ejecutar 10000 robots atendidos o 1000 robots no atendidos, necesitarás:
- Un equilibrador de carga F5
- Orchestrator: al menos 6 nodos ejecutados en máquinas con 8 núcleos de CPU y 16 GB de RAM
- Robots: máquinas con 4 núcleos de CPU y 16 GB de RAM
-
SQL Server: máquinas con 4 ranuras/16 núcleos de CPU (8 ranuras/16 núcleos de CPU por defecto) y 64 GB de RAM
Nota: para reducir el contenido asignado de SQL Server en un entorno altamente concurrente, asegúrate de emplear un número óptimo de archivos de datos tempdb que tengan el mismo tamaño.
UiPathOrchestrator.dll.config
de Orchestrator para mejorar el rendimiento en un entorno de producción a gran escala.
<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>
- Añade o modifica el destino de registro para Elasticsearch utilizando los siguientes parámetros.
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> - Añade o modifica la regla de registros de robot para escribir registros solo en el destino que se muestra en el ejemplo anterior. Esto deshabilita automáticamente el destino de la base de datos predeterminada.
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> - Configura Orchestrator para leer registros de ElasticSearch.
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
Puedes optar por Azure Blob Storage para este propósito.
<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>
Puedes desactivar el modo de mantenimiento si no lo utilizas.
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
Puedes configurar Orchestrator para utilizar algunas cachés en memoria que reducen el número de llamadas a Redis. Por ejemplo, configurarlas para caducar cada 30 minutos significa que una vez realices un cambio en una configuración en alguna aplicación, puede que no se refleje hasta pasados 30 minutos.
El tiempo de vencimiento que establezcas aquí puede variar en función de qué retraso puedes tolerar, pero incluso un tiempo de caché de 5 minutos puede mejorar considerablemente el rendimiento.
<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
ayuda con los escenarios de aceleración.
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
Este paso solo es necesario si tienes un número de desencadenadores muy alto, por ejempo, en torno a 2000 por minuto.
<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>
Puedes deshabilitar la resolución si no estás en una red empresarial o no necesitas ver los nombres DNS de las IP registradas en Audit.
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
Directory.ActiveDirectory.GroupMembershipFetchStrategy
y Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
solo se aplican al adaptador AD heredado. Deberías utilizar estos ajustes solo si te actualizaste desde una versión de Orchestrator que tuviera AD habilitado a la versión 2021.10 o posterior.
Directory.ActiveDirectory.GroupMembershipFetchStrategy
como TokenGroups
en la tabla [identity].[Settings]
, ejecuta:
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
como 4 horas en la tabla [identity].[Settings]
, ejecuta:
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
solo se aplica al adaptador de AD heredado. Deberías utilizar esta configuración solo si te actualizaste desde una versión de Orchestrator que tuviera AD habilitado a la versión 2021.10 o posterior.
Directory.ActiveDirectory.CacheExpirationSeconds
en la tabla [identity].[Settings]
. El valor predeterminado de este ajuste es de 43200 segundos (12 horas). Para deshabilitar la caché del dominio de AD, debes establecer este ajuste como 0.
Para establecer este ajuste a 7 días, ejecuta:
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)
Para deshabilitar la caché del dominio de AD, ejecuta:
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)
Directory.ActiveDirectory.DomainFilter
solo se aplica al adaptador de AD heredado. Deberías utilizar esta configuración solo si te actualizaste desde una versión de Orchestrator que tuviera AD habilitado a la versión 2021.10 o posterior.
Para habilitar el filtro de dominio, ejecuta:
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='<comma separated list of domain FQDNs>' WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.DomainFilter', '<comma separated list of domain FQDNs>', 1)
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
IF @@ROWCOUNT>0
UPDATE [identity].[Settings] SET [Value]='<comma separated list of domain FQDNs>' WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
ELSE
INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.DomainFilter', '<comma separated list of domain FQDNs>', 1)
Para deshabilitar la caché de dominio de AD usa:
DELETE [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
DELETE [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1
Durante una aceleración agresiva, los eventos de adquisición de licencia imponen una presión significativa en el plano posterior de SignalR Redis. Puedes deshabilitar el evento para mitigarlo, pero esto conlleva que la IU de licencia ya no se actualizará en tiempo real. Sin embargo, cuando tengas 100 000 robots, esa actualización de pantalla en tiempo real tiene poca importancia.
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
Este cambio garantiza el almacenamiento en caché del contenido del paquete en el servidor, y puede resultar útil cuando el recurso compartido de archivos no puede seguir el ritmo de la descarga de paquetes.
<<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
debería ser suficiente para habilitar la función. Solo deberás ajustar el resto de la configuración que se muestra en el ejemplo anterior si quieres cambiar los valores predeterminados, por ejemplo, aumenta el límite de tamaño de la caché o del paquete.
Establece la siguiente configuración como ranura adhesiva en la ranura de producción del Orchestrator App Service.
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
Establece la siguiente configuración en las ranuras de producción y de implementación de intercambio en caliente de Orchestrator App Service. La aplicación se preparará durante la implementación, minimizando la carga de rendimiento causada al redireccionar tráfico a una aplicación en frío.
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
El uso del servicio Azure SignalR en una implementación de Azure puede reducir significativamente la carga en los servidores web. Consulta Scalability.AzureSignalR.ConnectionString para obtener más detalles sobre la configuración.
<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
y configúralos según tus necesidades:
-
RobotsLogs.Flush.Interval
<add key="RobotsLogs.Flush.Interval" value="0" />
<add key="RobotsLogs.Flush.Interval" value="0" />
Para obtener más información sobre esta configuración, consulta RobotsLogs.Flush.Interval.
-
RobotsLogs.Flush.BatchSize
<add key="RobotsLogs.Flush.BatchSize" value="100" />
<add key="RobotsLogs.Flush.BatchSize" value="100" />
Para obtener más información sobre esta configuración, consulta RobotsLogs.Flush.BatchSize.
AppSettings.Production.json
de Identity Server deberían dar como resultado un rendimiento mejorado en entornos de producción a gran escala.
"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"
}
La IU de Orchestrator te permite tomar los siguientes pasos para mejorar el rendimiento en entornos de producción a gran escala:
- Deshabilita el espacio de trabajo personal;
- Deshabilita Permitir inicio de sesión web para usuarios robot;
- Asigna los roles Robot y Usuario de automatización a los usuarios robot.
- Requisitos recomendados para entornos de producción a gran escala
- Cambios de Orchestrator para un rendimiento mejorado
- Habilita Redis
- Especifica un tamaño máximo de grupo en la cadena de conexiones
- Escribe registros de Robot en Elasticsearch y utiliza AsyncWrapper
- Utiliza un almacenamiento de alto rendimiento
- Deshabilita el modo de mantenimiento
- Aumenta el tiempo de caché de la configuración de la aplicación
- Aumentar el valor de MinWorkerThreads
- Ajusta Quartz para un rendimiento muy alto
- Deshabilita la resolución de IP a DNS en Audit
- Cambia a una estrategia más rápida de obtención de membresía de grupos
- Ajuste del tiempo de expiración de la caché del dominio de AD
- Mejora del rendimiento de carga del dominio de AD
- Deshabilita SignalR para eventos de cambio de licencia de Robot
- Habilitar caché del paquete NuGet
- Habilita la caché local en implementaciones de Azure PaaS
- Configura la preparación de ranuras en implementaciones de Azure PaaS
- Utiliza el servicio Azure SignalR en implementaciones de Azure PaaS
- Ajustar el intervalo y el tamaño de la descarga para el punto final de SubmitLogs
- Cambios de Identity Server para un rendimiento mejorado
- Especifica un tamaño máximo de grupo en la cadena de conexiones
- Habilita Redis
- Cambios de configuración de IU para un rendimiento mejorado