この記事は「CircleCI Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita」の6日目です。
CircleCI が無料プランで 30 同時実行可能になったので、Parallelism との関係を調べてみました。
Parallelism とは?
CircleCI ではワークフローのジョブとジョブはそれぞれ並行実行されます。
参考:ワークフローを使用したジョブのスケジュール - CircleCI#ワークフローの構成例
一方、Parallelism はジョブの中の処理を並列実行する仕組みです。
参考:テストの並列実行 - CircleCI
Parallelism はジョブの steps をそれぞれのワーカーで同じように実行されますが、各ワーカーに付与される CIRCLE_NODE_INDEX 環境変数の値(0,1,2...)でテストを分割したり条件分岐できます。
この Parallelism はプランによって使用できる上限が決まっています。
筆者の場合は今月頭の時点で 16 でした。
plan ページ見ても自分にどれだけ割り当てられてるのかわからんかったが、どうやら 16 あるらしい。 pic.twitter.com/LOW9k4v8nH
— ずみっくす@あつまれCIサービス (@srz_zumix) December 5, 2021
さて、ここで少し疑問がわきました。
16 parallelism のジョブを 2 つ使ったら 30 同時実行されるのでしょうか?
Parallelism を含むジョブを 30 以上実行したらどうなるか?
筆者が CI サービスのまとめをしてるリポジトリで検証してみました。
まとめルートリポジトリ:https://github.com/srz-zumix/ci-specs
同時実行の関連まとめ:https://github.com/srz-zumix/ci-parallel
ジョブの開始・終了時刻を記録、その情報から json を生成して chrome://tracing で可視化しています。
この方法は以前「ブログズミ: chrome://tracing で並列処理の可視化をしてみたらすごく便利だった話」で詳細に書いてますので、そちらを参照してください。
ジョブ設定はこちらを参照してください。
https://github.com/srz-zumix/ci-parallel/blob/master/.circleci/config.yml
16 parallelism x 2 job
16 -> 16 という感じでジョブは同時実行されませんでした。
続いて Parallelism を減らし、ジョブ数を増やしてみます。
4 parallelism x 8 job
今度は 28 -> 4 という感じで実行されました。
組み合わせたらダメとうわけではないようです。
(1 parallelism x ) 31 job
最後に Parallelism なし(1)を 31 job です。
当然ですが、30 -> 1 のように実行されました。
まとめ
Parallelism の数分だけ空きがないとそのジョブはキュー待ちする。
同時実行数に収まるように Parallelism 数を決めると良さそうですね。
※この挙動に関しては 2021/12/05 時点での結果であり将来的に変わる可能性はあります。
以上。
0 件のコメント:
コメントを投稿