- 基本情報
- 要件
- ベスト プラクティス
- インストール
- 更新
- Identity Server
- 起動エラーのトラブルシューティング
パフォーマンスのベスト プラクティス
以下のページでは、大規模運用環境で推奨される要件について説明し、パフォーマンスの向上を目的とした一連のベスト プラクティスを示します。
10,000 台の Attended ロボットまたは 1,000 台の Unattended ロボットを実行するには、以下が必要です。
- F5 ロード バランサー
- Orchestrator - 8 コアの CPU と 16GB の RAM を搭載したマシン上で実行する 6 つ以上のノード
- ロボット - 4 コアの CPU と 16GB の RAM を搭載したマシン
-
SQL Server - 4 ソケット/16 コアの CPU (既定は 8 ソケット/16 コアの CPU) と 64GB の RAM を搭載したマシン
注: 多数の同時接続が実行される環境での SQL Server の割り当ての競合を減らすには、同じサイズで作成された最適な数の tempdb データ ファイルを使用するようにしてください。
UiPathOrchestrator.dll.config
ファイルに対して行える一連の調整について説明します。
<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>
- 次のパラメーターを使用して Elasticsearch のログ ターゲットを追加または変更します。
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> - 前述の例に示したターゲットにのみログを書き込むよう、ロボット ログ ルールを追加または変更します。これにより、既定のデータベース ターゲットが自動的に無効化されます。
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> - ElasticSearch からログを読み取るよう Orchestrator を設定します。
<appSettings> <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" /> </appSettings>
<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>
<appSettings>
<add key="Storage.Type" value="Azure" />
<add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings>
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="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>
<appSettings>
<add key="MaintenanceMode.Enabled" value="false" />
</appSettings>
Redis の呼び出しの回数を減らすいくつかのメモリ内キャッシュを使用するよう Orchestrator を設定できます。たとえば、キャッシュの有効期限が 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>
<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
に大きな数値を設定すると、パフォーマンスの向上に役立ちます。
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
<appSettings>
<add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>
この手順は、トリガーの起動回数が非常に多い場合にのみ必要です (例: 1 分当たり 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>
<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 名を確認する必要がない場合は、解決を無効化できます。
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
<appSettings>
<add key="Audit.UseDnsResolving" value="false" />
</appSettings>
Directory.ActiveDirectory.GroupMembershipFetchStrategy
と Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
は、レガシー Active Directory アダプターにのみ適用されます。これらの設定は、Active Directory が有効化されている Orchestrator のバージョンから v2021.10 以降にアップグレードした場合にのみ使用してください。
[identity].[Settings]
テーブルで Directory.ActiveDirectory.GroupMembershipFetchStrategy
を TokenGroups
に設定するには、以下を実行します。
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)
[identity].[Settings]
テーブルで Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours
を 4 時間に設定するには、以下を実行します。
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
は、レガシー Active Directory アダプターにのみ適用されます。この設定は、Active Directory が有効化されている Orchestrator のバージョンから v2021.10 以降にアップグレードした場合にのみ使用してください。
[identity].[Settings]
テーブルの Directory.ActiveDirectory.CacheExpirationSeconds
の設定を使用します。この設定の既定値は 43200 秒 (12 時間) です。Active Directory ドメイン キャッシュを無効化するには、この設定を 0 にする必要があります。
この設定を 7 日に設定するには、以下を実行します。
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)
Active Directory ドメイン キャッシュを無効化するには、以下を実行します。
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)
パフォーマンスを大幅に向上させようとしているときに、ライセンス取得イベントが SignalR Redis のバックプレーンに大きな負荷をもたらしていることがあります。それを軽減するには、イベントを無効化します。そうすれば、UI のライセンスはリアルタイムで更新されなくなります。10 万台のロボットがある場合には、リアルタイムの画面の更新にはほとんど意味がありません。
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
<appSettings>
<add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>
この変更によって、パッケージの内容がサーバー側でキャッシュされるようになります。また、ファイル共有がパッケージのダウンロードのスループットに追いつかない場合にも役立ちます。
<<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
の設定を追加するだけで十分です。上記の例に表示されている残りの設定は、既定値を変更する場合にのみ調整する必要があります (例: キャッシュまたはパッケージのサイズ制限のサイズを大きくする)。
Orchestrator App Service の運用環境スロットで、スロット固定として次の設定をします。
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000
Orchestrator App Service の運用環境スロットとホットスワップ デプロイ スロットの両方で、次の設定をします。これにより、デプロイ時にアプリケーションがウォームアップされ、コールド アプリにトラフィックをリダイレクトすることで生じるパフォーマンス ヒットを最小限に抑えることができます。
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
Azure のデプロイで Azure SignalR Service を使用すると、Web サーバーに対する負荷を大幅に減らすことができます。この設定について詳しくは、「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
で以下の設定を有効化し、必要に応じて設定します。
-
RobotsLogs.Flush.Interval
<add key="RobotsLogs.Flush.Interval" value="0" />
<add key="RobotsLogs.Flush.Interval" value="0" />
この設定の詳細については、RobotsLogs.Flush.Interval をご覧ください。
-
RobotsLogs.Flush.BatchSize
<add key="RobotsLogs.Flush.BatchSize" value="100" />
<add key="RobotsLogs.Flush.BatchSize" value="100" />
この設定の詳細については、RobotsLogs.Flush.BatchSize をご覧ください。
AppSettings.Production.json
ファイルに対する以下の変更により、大規模運用環境におけるパフォーマンスが向上します。
"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"
}
- 大規模運用環境の推奨要件
- パフォーマンスを向上させるための Orchestrator の変更
- Redis を有効化する
- 接続文字列で最大プール サイズに大きな値を指定する
- Elasticsearch にロボットのログを書き込み、AsyncWrapper を使用する
- 高スループット ストレージを使用する
- Webhook と Ledger を無効化する
- メンテナンス モードを無効化する
- アプリケーション設定のキャッシュ時間を増やす
- MinWorkerThreads の値を増やす
- 超高スループットを実現するよう Quartz を調整する
- 監査で IP の DNS 解決を無効化する
- グループ メンバーシップを素早く取得できるストラテジに切り替える
- Active Directory ドメイン キャッシュの有効期限を調整する
- ロボットのライセンス変更イベントに対して SignalR を無効化する
- NuGet パッケージのキャッシュを有効化する
- Azure の PaaS デプロイでローカル キャッシュを有効化する
- Azure の PaaS デプロイでスロット ウォームアップを設定する
- Azure の PaaS デプロイで Azure SignalR Service を使用する
- SubmitLogs エンドポイントのフラッシュの間隔とサイズを調整する
- パフォーマンスを向上させるための Identity Server の変更
- 接続文字列で最大プール サイズに大きな値を指定する
- Redis を有効化する
- パフォーマンスを向上させるための UI 設定の変更