3.6. Automation Controller のチューニング
Automation Controller UI、API、およびファイルベースの設定を使用して、次のような多くの Automation Controller の設定が可能です。
- Automation Controller UI のライブイベント
- ジョブイベント処理
- コントロールノードおよび実行ノードの容量
- インスタンスグループとコンテナーグループの容量
- タスク管理 (ジョブのスケジューリング)
- 内部クラスタールーティング
- Web サーバーのチューニング
3.6.1. Automation Controller UI でのライブイベントの管理
イベントは、ジョブにサブスクライブされた UI クライアントが存在するノードすべてに送信されます。このタスクはコストが高く、クラスターが生成するイベントの数が増加し、コントロールノードの数が増加するにつれて、さらにコストが高くなります。これは、特定のジョブにサブスクライブされたクライアントの数に関係なく、すべてのイベントがすべてのノードにブロードキャストされるためです。
UI にライブイベントを表示するオーバーヘッドを削減するために、管理者は次のいずれかを選択できます。
- ライブストリーミングイベントを無効にします。
- UI でイベントを縮小したり非表示にしたりする前に、1 秒あたりに表示されるイベントの数を減らします。
イベントのライブストリーミングを無効にすると、イベントは、ジョブの出力詳細ページのハードリフレッシュ時にのみロードされます。1 秒あたりに表示されるイベントの数を減らすと、ライブイベントを表示するオーバーヘッドは限定されますが、ハードリフレッシュを行わなくても UI でライブ更新が提供されます。
3.6.1.1. ライブストリーミングイベントの無効化
手順
次のいずれかの方法を使用して、ライブストリーミングイベントを無効にします。
-
API で、
UI_LIVE_UPDATES_ENABLED
を False に設定します。 - Automation Controller に移動します。Miscellaneous System Settings ウィンドウを開きます。Enable Activity Stream のトグルを Off に設定します。
-
API で、
3.6.1.2. イベントのレートとサイズを変更する設定
イベントのサイズが原因でイベントのライブストリーミングを無効にできない場合は、UI に表示されるイベントの数を減らします。次の設定を使用して、表示されるイベントの数を管理できます。
UI または API で編集できる設定:
-
EVENT_STDOUT_MAX_BYTES_DISPLAY
: 表示するstdout
の最大量 (バイト単位で測定)。これにより、UI に表示されるサイズが縮小されます。 -
MAX_WEBSOCKET_EVENT_RATE
: 1 秒あたりにクライアントに送信するイベントの数。
ファイルベースの設定を使用して利用可能な設定:
-
MAX_UI_JOB_EVENTS
: 表示するイベントの数。この設定により、リスト内の残りのイベントが非表示になります。 -
MAX_EVENT_RES_DATA
: Ansible コールバックイベントの "res" データ構造の最大サイズ。"res" はモジュールの完全な「結果」です。Ansible コールバックイベントの最大サイズに達すると、残りの出力は切り捨てられます。デフォルト値は 700000 バイトです。 -
LOCAL_STDOUT_EXPIRE_TIME
:stdout
ファイルの有効期限が切れてローカルで削除されるまでの時間。
3.6.2. ジョブイベント処理を管理するための設定
コールバックレシーバーはジョブのすべての出力を処理し、この出力をジョブイベントとして Automation Controller データベースに書き込みます。コールバックレシーバーには、イベントをバッチで処理するワーカーのプールがあります。ワーカーの数は、インスタンスで使用可能な CPU の数に応じて自動的に増加します。
管理者は、JOB_EVENT_WORKERS
設定を使用してコールバックレシーバーワーカーの数をオーバーライドできます。CPU ごとに複数のワーカーを設定することはできません。また、少なくとも 1 つのワーカーが必要です。値が大きいほど、Automation Controller にイベントがストリーミングされる際に、Redis キューをクリアするのに利用できるワーカーが増えますが、Web サーバーなどの他のプロセスと CPU 秒数で競合する可能性があります。また、より多くのデータベース接続 (ワーカーあたり 1 つ) を使用するほか、各ワーカーがコミットするイベントのバッチサイズが小さくなる可能性があります。
各ワーカーにより、バッチで書き込むイベントのバッファーが増大します。バッチを書き込む前に待機するデフォルトの時間は 1 秒です。これは、JOB_EVENT_BUFFER_SECONDS
設定によって制御されます。ワーカーがバッチ間で待機する時間を増やすと、バッチサイズが大きくなる可能性があります。
3.6.3. コントロールノードと実行ノードの容量設定
次の設定は、クラスターの容量計算に影響します。次のファイルベースの設定を使用して、すべてのコントロールノードでこれらを同じ値に設定します。
-
AWX_CONTROL_NODE_TASK_IMPACT
: ジョブの制御の影響を設定します。コントロールプレーンが望ましい使用量を超えて CPU またはメモリーを使用している場合に、この設定を使用して、コントロールプレーンが同時に実行可能なジョブの数を制御できます。 -
SYSTEM_TASK_FORKS_CPU
およびSYSTEM_TASK_FORKS_MEM
: Ansible の各フォークが消費すると推定されるリソースの数を制御します。デフォルトでは、Ansible の 1 フォークは、0.25 の CPU と 100 MB のメモリーを使用すると推定されます。
3.6.4. インスタンスグループとコンテナーグループの容量設定
インスタンスグループで使用できる max_concurrent_jobs
および max_forks
設定を使用して、インスタンスグループまたはコンテナーグループ全体で消費できるジョブとフォークの数を制限します。
-
コンテナーグループで必要な
max_concurrent_jobs
を計算するには、そのコンテナーグループのpod_spec
設定を考慮してください。pod_spec
では、自動化ジョブ Pod のリソース要求と制限を確認できます。次の式を使用して、必要な同時実行ジョブの最大数を計算します。
((number of worker nodes in kubernetes cluster) * (CPU available on each worker)) / (CPU request on pod_spec) = maximum number of concurrent jobs
たとえば、
pod_spec
で、Pod が 250 mcpu を要求することが示され、Kubernetes クラスターに 2 CPU を備えたワーカーノードが 1 つある場合、開始する必要があるジョブの最大数は 8 です。-
ジョブのフォークのメモリー消費も考慮することができます。次の式を使用して、
max_forks
の適切な設定を計算します。
-
ジョブのフォークのメモリー消費も考慮することができます。次の式を使用して、
((number of worker nodes in kubernetes cluster) * (memory available on each worker)) / (memory request on pod_spec) = maximum number of forks
たとえば、8 GB のメモリーを備えたワーカーノードが 1 つあるとすれば、実行する
max forks
は 81 であると判断します。この場合、1 つのフォークを持つ 39 個のジョブを実行するか (タスクインパクトは常にフォーク + 1 です)、またはフォークが 39 に設定されたジョブを 2 つ実行できます。-
他のビジネス要件では、
max_forks
またはmax_concurrent_jobs
を使用して、コンテナーグループ内で起動するジョブの数を制限することが望ましい可能性があります。
-
他のビジネス要件では、
3.6.5. ジョブのスケジューリングの設定
タスクマネージャーは、スケジュールする必要があるタスクを定期的に収集して、どのインスタンスに容量があり、タスクを実行可能かを判断します。タスクマネージャーのワークフローは、以下の通りです。
- 制御インスタンスと実行インスタンスを見つけて割り当てます。
- ジョブのステータスを更新して、待機中にします。
-
pg_notify
を通じてコントロールノードにメッセージを送り、ディスパッチャーがタスクを取得して実行を開始できるようにします。
スケジューリングタスクが TASK_MANAGER_TIMEOUT
秒 (デフォルトは 300 秒) 以内に完了しない場合、タスクは早期に終了します。タイムアウトの問題は通常、保留中のジョブが多数存在する場合に発生します。
タスクマネージャーが 1 回の実行で処理できる作業量を制限する方法の 1 つに、START_TASK_LIMIT
設定があります。これにより、1 回の実行で開始できるジョブの数が制限されます。デフォルトは 100 ジョブです。さらに保留中のジョブがある場合は、新しいスケジューラータスクが直後に実行されるようにスケジュールされます。全体的なスループット向上のために、ジョブの起動から開始までのレイテンシーが潜在的に増大しても構わない場合は、START_TASK_LIMIT
を引き上げることを検討できます。タスクマネージャーの個々の実行にかかる時間を確認するには、/api/v2/metrics
で入手可能な Prometheus メトリクス task_manager__schedule_seconds
を使用します。
タスクマネージャーによって実行の開始が選択されたジョブは、タスクマネージャープロセスが終了して変更がコミットされるまで実行されません。TASK_MANAGER_TIMEOUT
設定は、タスクマネージャーが変更をコミットするまでの 1 回の実行時間を決定します。タスクマネージャーは、タイムアウトに達すると進捗状況をコミットしようとします。タスクは、猶予期間 (TASK_MANAGER_TIMEOUT_GRACE_PERIOD
により決定) が経過するまでは強制終了されません。
3.6.6. 内部クラスタールーティング
Automation Controller クラスターホストは、クラスター内のネットワークを介して通信します。従来の仮想マシンインストーラーのインベントリーファイルでは、クラスターノードへのルートを複数指定でき、それらはさまざまな方法で使用されます。
例:
[automationcontroller] controller1 ansible_user=ec2-user ansible_host=10.10.12.11 node_type=hybrid routable_hostname=somehost.somecompany.org
-
controller1
は、Automation Controller ホストのインベントリーホスト名です。インベントリーホスト名は、アプリケーションではインスタンスホスト名として表示されるものです。これは、バックアップ/復元方法を使用して異なる IP アドレスを持つ新しいホストのセットにクラスターを復元する、障害復旧シナリオに備える際に役立ちます。この場合、これらのインベントリーホスト名を IP アドレスにマッピングするエントリーを/etc/hosts
に含めることができます。そして、内部 IP アドレスを使用して、パブリック DNS 名の解決に関する DNS の問題を軽減できます。 -
ansible_host=10.10.12.11
は、インストーラーがホスト (この場合は内部 IP アドレス) に到達する方法を示します。これはインストーラー以外では使用されません。 -
routable_hostname=somehost.somecompany.org
は、receptor メッシュ上でこのノードに接続するピアにとって解決可能なホスト名を示します。複数のネットワークをまたぐ可能性があるため、ホスト名は、receptor ピアで解決可能な IP アドレスにマッピングされるものを使用しています。
3.6.7. Web サーバーのチューニング
コントロールノードとハイブリッドノードはそれぞれ、Automation Controller の UI と API を提供します。WSGI トラフィックは、ローカルソケット上の uwsgi Web サーバーによって処理されます。ASGI トラフィックは、Daphne によって処理されます。NGINX はポート 443 でリッスンし、必要に応じてトラフィックをプロキシー処理します。
Automation Controller の Web サービスをスケーリングするには、次のベストプラクティスに従ってください。
- 複数のコントロールノードをデプロイし、ロードバランサーを使用して Web 要求を複数のサーバーに分散させます。
- Automation Controller ごとの最大接続数を 100 に設定します。
クライアント側で Automation Controller の Web サービスを最適化するには、次のガイドラインに従ってください。
- API を使用してインベントリーホストを個別に作成するのではなく、動的インベントリーソースを使用するようにユーザーに指示します。
- ジョブのステータスをポーリングする代わりに Webhook 通知を使用します。
- ホストの作成とジョブの起動に Bulk API を使用して、要求をバッチ処理します。
- トークン認証を使用します。多くの要求を迅速に行う必要がある自動化クライアントの場合、トークンを使用することがベストプラクティスです。これは、ユーザーのタイプによっては、Basic 認証を使用すると追加のオーバーヘッドが発生する可能性があるためです。
関連情報
- 高レベルの API インタラクションを伴うワークロードの詳細は、Scaling Automation Controller for API Driven Workloads を参照してください。
- Bulk API の詳細は、Bulk API in Automation Controller を参照してください。
- トークンの生成および使用方法の詳細は、トークンベースの認証 を参照してください。