CI高速化 Part 2: リソース配分最適化

前回は並列化によるCI高速化を取り上げましたが、CPUなどのハードウェアリソースには当然コストがかかるため、有限のリソースを並列化されたタスク群に対して効率良く配分することが更なる高速化の鍵になります。今回は、CPU使用量の配分を最適化することで、ジョブのスループットを改善する方法を紹介します。

Rocroでは、git pushやpull requestなどのイベントにより発生する一連の処理をジョブ、ジョブの中で個々のコンテナ上で実行される処理をタスクと呼びます。つまり、ジョブはタスクの集合です。例えば、下記のrocro.ymlにおいて、このYAMLで設定された処理全体がジョブ、gofmtなどの各ツールの処理やこれらのツールを実行するためのセットアップ処理などがタスクになります。

inspecode:
    gofmt: default
    golint: default
    go-test: default

ジョブの実行時間は最も実行が遅いタスクに左右されるため、ジョブのスループットを改善するには各タスクの実行時間をなるべく平準化する必要があります。Inspecode/Docstandでは、rocro.ymlのcpu optionによりCPUの使用量を指定することができます。cpu: 1はそのツールが1 CPUコアを使うことを表します。メモリはcpu: 1に対して3.75GiBが割り当てられ、CPUの使用量に比例して配分されます。cpu: 0.25のように少数で使用量を指定したり、最後にmを付けることで1000分の1単位で使用量を指定することもできます。cpu: 250mcpu: 0.25と等価です。

上記のrocro.ymlにおいて、go testが最も時間がかかる場合、下記のようにgo testに他ツールよりも多くのCPUリソースを割り当てるとジョブ全体の処理時間を改善できるでしょう。

inspecode:
    gofmt:
        machine:
            cpu: 0.25
    golint:
        machine:
            cpu: 500m
    go-test:
        machine:
            cpu: 1.25

現在、無料で合計8 CPUコアをご利用いただけます。ここまで細かいCPUリソースの制御は、他のCIツールやサービスには無い機能ですので、ぜひ無料期間中に色々とお試しいただければと思います。