Orchestrator
2022.10
falso
Imagem de fundo do banner
Guia de instalação do Orchestrator
Última atualização 19 de abr de 2024

Melhores práticas de desempenho

A página a seguir descreve os requisitos recomendados para ambientes de produção de grande escala e fornece um conjunto de práticas recomendadas para melhorar seu desempenho.

Observação: para obter mais detalhes sobre os requisitos mínimos para executar o Orchestrator, consulte as páginas Requisitos de hardware e Requisitos de software.

Requisitos recomendados para ambientes de produção em larga escala

Para executar 10K Robôs Assistidos ou 1K Robôs Não Assistidos, você precisa de:

  • Um balanceador de carga F5
  • Orchestrator - pelo menos 6 nós sendo executados em máquinas com 8 núcleos de CPU e 16 GB de RAM
  • Robôs - máquinas com 4 núcleos de CPU e 16 GB de RAM
  • SQL Server - máquinas com 4 soquetes / 16 núcleos de CPU (padrão 8 soquetes / 16 núcleos de CPU) e 64 GB de RAM

    Observação: para reduzir a contenção de alocação do SQL Server em um ambiente altamente simultâneo, certifique-se de empregar um número ideal de arquivos de dados tempdb que tenham tamanho igual.

Alterações do Orchestrator para um desempenho aprimorado

Esta seção lista uma série de ajustes que você pode fazer no arquivo UiPathOrchestrator.dll.config do Orchestrator para melhorar o desempenho em um ambiente de produção de grande escala.

Habilite o Redis

<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>

Especifique um tamanho de pool máximo grande na String de Conexão

<connectionStrings>
  <add name="Default" providerName="Microsoft.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings><connectionStrings>
  <add name="Default" providerName="Microsoft.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings>

Grave os logs do Robô no Elasticsearch e use o AsyncWrapper

  • Adicione ou modifique o destino de logs para o Elasticsearch usando os parâmetros a seguir.
    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>
  • Adicione ou modifique a regra de logs do robô para gravar logs apenas no destino mostrado no exemplo anterior. Isso desabilita automaticamente o destino do Banco de Dados padrão.
    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>
  • Configure o Orchestrator para ler logs a partir do ElasticSearch.
    <appSettings>
       <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" />
    </appSettings><appSettings>
       <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" />
    </appSettings>

Use um armazenamento com alta taxa de transferência

Você pode optar pelo Azure Blob Storage para esse fim.

<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>

Aumente o tempo de cache das configurações do aplicativo

Você pode configurar o Orchestrator para usar alguns caches em memória que reduzem o número de chamadas para o Redis. Por exemplo, configurá-los para que expirem a cada 30 minutos significa que, quando você fizer uma alteração em uma configuração de nível de aplicativo, ela pode não entrar em vigor até o intervalo de 30 minutos passar.

O tempo de expiração que você define aqui pode variar dependendo do atraso que você pode tolerar, mas mesmo um tempo de cache de 5 minutos pode melhorar muito o desempenho.

<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>

Aumentar o valor de MinWorkerThreads

Definir um valor maior para MinWorkerThreads ajuda com cenários de crescimento.
<appSettings>
  <add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings><appSettings>
  <add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>

Desative a resolução de IP para DNS no Audit

Se você não estiver em uma rede corporativa ou não precisar ver os nomes de DNS dos IPs gravados no Audit, você pode desabilitar a resolução.

<appSettings>
  <add key="Audit.UseDnsResolving" value="false" />
</appSettings><appSettings>
  <add key="Audit.UseDnsResolving" value="false" />
</appSettings>

Mude para uma estratégia mais rápida para obter Associações de Grupos

Observação: Directory.ActiveDirectory.GroupMembershipFetchStrategy e Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours aplicam-se apenas ao adaptador AD herdado. Você deve usar essas configurações somente se tiver atualizado de uma versão do Orchestrator que tinha o AD ativado para 2021.10 ou posterior.
Para definir Directory.ActiveDirectory.GroupMembershipFetchStrategy como TokenGroups na tabela [identity].[Settings], execute:
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)
Para definir Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours como 4 horas na tabela [identity].[Settings], execute:
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)

Ajustar o tempo de expiração do cache do domínio do AD

Observação: Directory.ActiveDirectory.CacheExpirationSeconds aplica-se apenas ao adaptador AD herdado. Você deve usar essa configuração apenas se tiver atualizado de uma versão do Orchestrator que tinha o AD ativado para 2021.10 ou posterior.
Para controlar o tempo de expiração do cache do domínio do AD, você pode usar a configuração Directory.ActiveDirectory.CacheExpirationSeconds na tabela [identity].[Settings]. O valor padrão desta configuração é de 43200 segundos (12 horas). Para desabilitar o cache do domínio do AD, você deve definir esta configuração para 0.

Para definir esta configuração para 7 dias, execute:

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 desabilitar o cache do domínio AD, execute:

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)

Melhore o desempenho de carregamento do domínio AD

Observação: Directory.ActiveDirectory.DomainFilter aplica-se apenas ao adaptador AD herdado. Você deve usar essa configuração apenas se tiver atualizado de uma versão do Orchestrator que tinha o AD ativado para 2021.10 ou posterior.

Para habilitar filtro de domínio execute:

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 desabilitar o cache de domínio AD use:

DELETE [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1DELETE [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.DomainFilter' and [PartitionId]=1

Desative o SignalR para os eventos de alteração de licença do Robô

Durante um crescimento agressivo, os eventos de aquisição de licenças colocariam uma pressão significativa no backplane do SignalR do Redis. Para mitigar isso, o evento pode ser desabilitado, o que faz com que a Interface Gráfica de licenciamento não seja mais atualizada em tempo real. No entanto, quando você tem 100k robôs, essa tela de atualização em tempo real não tem quase nenhum valor.

<appSettings>
  <add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings><appSettings>
  <add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>

Habilite o Cache de Pacotes do NuGet

Essa alteração garante que haja o cache do lado do servidor dos conteúdos do pacote, e pode ser útil quando o compartilhamento de arquivos não puder acompanhar a taxa de transferência de download do pacote.

<<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) -->
Adicionar a configuração NuGet.Caching.Enabled deve ser suficiente para habilitar o recurso. Você só precisa ajustar o resto das configurações exibidas no exemplo acima se você quiser alterar os padrões, por exemplo, aumentar o tamanho do cache ou os limites de tamanho do pacote.

Habilite o cache local nas implantações PaaS do Azure

Defina a seguinte configuração como slot sticky no slot de produção do Serviço de Aplicativo do Orchestrator.

WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000

Configure o Slot Warm-Up nas implantações PaaS do Azure

Defina a seguinte configuração tanto no slot de produção quanto no slot de implantação hotswap do Serviço de Aplicativo do Orchestrator. Durante a implantação, isso irá preparar o aplicativo, minimizando a queda de desempenho causada pelo redirecionando do tráfego para um aplicativo frio.

WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200

Use o Serviço SignalR do Azure nas implantações PaaS do Azure

Usar o Serviço SignalR do Azure em uma implantação do Azure pode reduzir significativamente a carga nos servidores da web. Consulte Scalability.AzureSignalR.ConnectionString para obter mais detalhes sobre a configuração.

<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>

Ajuste o Intervalo de Descarga e o tamanho para o Endpoint do SubmitLogs

Essa alteração ajuda você a controlar a janela de lotes de tempo para coletar logs do processo executor antes de chamar o endpoint da API do SubmitLogs. Habilite as seguintes configurações em UiPath.Orchestrator.dll.config e configure-as de acordo com suas necessidades:
  • RobotsLogs.Flush.Interval

    <add key="RobotsLogs.Flush.Interval" value="0" /><add key="RobotsLogs.Flush.Interval" value="0" />

Para obter mais informações sobre essa configuração, consulte RobotsLogs.Flush.Interval.

  • RobotsLogs.Flush.BatchSize

    <add key="RobotsLogs.Flush.BatchSize" value="100" /><add key="RobotsLogs.Flush.BatchSize" value="100" />

Para obter mais informações sobre essa configuração, consulte RobotsLogs.Flush.BatchSize.

Alterações no Identity Server para um desempenho aprimorado

As seguintes alterações no arquivo AppSettings.Production.json do Identity Server devem resultar em um desempenho aprimorado em ambientes de produção de grande escala.

Especifique um tamanho de pool máximo grande na String de Conexão

"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"
  }

Habilite o Redis

"LoadBalancerSettings": {
      "RedisConnectionString": "yourRedis:6379,password=****",
      "UseRedis": "true"
    }"LoadBalancerSettings": {
      "RedisConnectionString": "yourRedis:6379,password=****",
      "UseRedis": "true"
    }

Alterações de configuração de Interface Gráfica para um desempenho aprimorado

A Interface Gráfica do Orchestrator permite que você siga os seguintes passos para melhorar o desempenho em ambientes de produção de grande escala:

  • Desabilite o espaço de trabalho pessoal;
  • Desabilite Permitir login na web para usuários do robô;
  • Atribua as funções Robot e Automation User para os usuários do robô.

Was this page helpful?

Obtenha a ajuda que você precisa
Aprendendo RPA - Cursos de automação
Fórum da comunidade da Uipath
Logotipo branco da Uipath
Confiança e segurança
© 2005-2024 UiPath. All rights reserved.