订阅

UiPath Installation and Upgrade

UiPath 安装和升级指南

性能最佳实践

以下页面介绍了为大规模生产环境推荐的要求,并提供了一组旨在提高其性能的最佳实践。

📘

备注:

有关运行 Orchestrator 的最低要求的更多详细信息,请参阅硬件要求页面和软件要求页面。

大规模生产环境的推荐要求

要运行 10K 有人值守机器人或 1K 无人值守机器人,您需要:

  • An F5 load balancer
  • Orchestrator - 至少 6 个在具有 8 个 CPU 核心和 16 GB RAM 的计算机上运行的节点
  • Robots - machines with 4 CPU Cores and 16 GB RAM
  • SQL Server - 具有 4 个插槽/16 个 CPU 核心(默认为 8 个插槽/16 个 CPU 核心)和 64 GB RAM 的计算机

📘

备注:

若要减少高度并发环境中的 SQL Server 分配争用,请确保使用大小相等的 tempdb 数据文件的最佳数量。

用于提高性能的 Orchestrator 变更

本节列出了可以对 Orchestrator 的 UiPathOrchestrator.dll.config 文件进行的一系列调整,以提高大规模生产环境中的性能。

启用 Redis

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

将机器人日志写入 Elasticsearch 并使用 AsyncWrapper

  • 使用以下参数添加或修改 Elasticsearch 的记录目标。
<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>
  • 添加或修改机器人日志规则,以仅将日志写入到上一个示例中显示的目标。这将自动禁用默认的数据库目标。
<nlog>
  <rules>
    <logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="robotElasticBuffer" />
  </rules>
</nlog>
  • 配置 Orchestrator 以从 ElasticSearch 读取日志。
<appSettings>
   <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" />
</appSettings>

使用高吞吐量存储

为此,您可以选择 Azure Blob 存储。

<appSettings>
  <add key="Storage.Type" value="Azure" />
  <add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings>

禁用 Webhook 和 Ledger

如果您不使用 Webhook 功能,则可以禁用它。

<appSettings>
  <add key="Webhooks.Enabled" value="false" />
  <add key="Ledger.Enabled" value="false"/>
  <add key="Webhooks.LedgerIntegration.Enabled" value="false" />
</appSettings>

禁用维护模式

如果您不使用维护模式,则可以将其禁用。

<appSettings>
  <add key="MaintenanceMode.Enabled" value="false" />
</appSettings>

增加应用程序设置的缓存时间

您可以将 Orchestrator 配置为使用部分内存缓存,以减少对 Redis 的调用次数。例如,将它们配置为每 30 分钟过期一次意味着,一旦更改了应用程序级设置,它可能要等到 30 分钟间隔后才会反映出来。
您在此处设置的到期时间可能会有所不同,具体取决于您可以容忍的延迟时间,但是即使是 5 分钟的缓存时间也可以极大地提高性能。

<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

MinWorkerThreads 设置较大的值有助于加速方案。

<appSettings>
  <add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>

调整 Quartz 以实现极高吞吐量

仅当触发器触发的数量非常多(例如,每分钟 2,000 个)时,才需要执行此步骤。

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

在审核中禁用 IP 到 DNS 解析

如果您不在公司网络中,或者不需要查看 Audit 中记录的 IP 的 DNS 名称,则可以禁用解析。

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

切换到更快的策略以获取组成员身份

📘

备注:

Directory.ActiveDirectory.GroupMembershipFetchStrategy and Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours only apply to the legacy AD adapter. You should use these settings only if you upgraded from an Orchestrator version that had AD enabled to 2021.10 or later.

To set Directory.ActiveDirectory.GroupMembershipFetchStrategy to TokenGroups in the [identity].[Settings] table, run:

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)

To set Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours to 4 hours in the [identity].[Settings] table, run:

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)

Adjust AD domain cache expiration time

📘

备注:

Directory.ActiveDirectory.CacheExpirationSeconds only applies to the legacy AD adapter. You should use this setting only if you upgraded from an Orchestrator version that had AD enabled to 2021.10 or later.

To control the AD domain cache expiration time, you can use the Directory.ActiveDirectory.CacheExpirationSeconds setting in the [identity].[Settings] table. The default value of this setting is 43200 seconds (12 hours). To disable AD domain caching, you must set this setting to 0.

To set this setting to 7 days, run:

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)

To disable AD domain caching, run:

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)

禁用用于机器人许可证更改事件的 SignalR

在激增期间,许可证获取事件将对 SignalR Redis 背板造成巨大压力。为了减轻这种情况,可以禁用该事件,这将导致许可 UI 不再实时更新。但是,当您有 10 万个机器人时,实时屏幕更新几乎没有价值。

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

启用 NuGet 包缓存

此更改可确保在服务器端缓存包内容,并且在文件共享无法跟上包下载吞吐量的情况下,此更改非常有用。

<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 设置应该足以启用该功能。如果要更改默认值,例如,增加缓存大小或包大小限制,则仅需要调整上例中显示的其余设置。

在 Azure PaaS 部署中启用本地缓存

在 Orchestrator App 服务的生产插槽上将以下配置设置为粘性插槽。

WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000

在 Azure PaaS 部署中配置插槽预热

在 Orchestrator App 服务的生产和热插拔部署插槽上设置以下配置。在部署过程中,这将预热应用程序,从而最大程度地减少将流量重定向到冷应用程序引起的性能下降。

WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200

在 Azure PaaS 部署中使用 Azure SignalR 服务

Using Azure SignalR Service in an Azure deployment can significantly reduce the load on the web servers. See Scalability.AzureSignalR.ConnectionString for more details on the setting.

<appSettings>
  <add key="LoadBalancer.UseRedis" value="true"/>
  <add key="Scalability.AzureSignalR.ConnectionString" value="**myAzureSignalRConnectionString" />
</appSettings>

调整 SubmitLogs 端点的刷新间隔和大小

此更改可帮助您控制时间范围批处理窗口,以在调用 SubmitLogs API 端点之前从执行程序流程收集日志。在 UiPath.Orchestrator.dll.config 中启用以下设置,然后根据需要进行配置:

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

For more on this setting, see RobotsLogs.Flush.Interval.

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

For more on this setting, see RobotsLogs.Flush.BatchSize.

用于提高性能的 Identity Server 变更

对 Identity Server 的 AppSettings.Production.json 文件进行以下更改应当会提高大规模生产环境中的性能。

在连接字符串中指定较大的最大池大小

"ConnectionStrings": {
    "DefaultConnection": "Data Source=dbServer;Initial Catalog=UiPath_is;User ID=username;Password=****;Max Pool Size=1000"
  }

启用 Redis

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

用于提高性能的 UI 配置变更

Orchestrator 的 UI 允许您采取以下步骤,以提高大规模生产环境中的性能:

  • 禁用个人工作区;
  • 禁用针对机器人用户的允许网页登录
  • 机器人Automation User 角色分配给机器人用户。

2 个月前更新


性能最佳实践


建议的编辑仅限用于 API 参考页面

您只能建议对 Markdown 正文内容进行编辑,而不能建议对 API 规范进行编辑。