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ツールやサービスには無い機能ですので、ぜひ無料期間中に色々とお試しいただければと思います。

CI高速化 Part 1: 並列化

Rocro株式会社 CTOの峯尾です。今日からRocro Engineering Blogを始めます。このBlogでは、弊社のプロダクトについてだけでなく、その開発過程で得た様々なノウハウもお伝えできればと思います。

RocroはGitHubやBitbucketと連携するソフトウェア開発者向けのサービス群です。既に数多くの優秀なサービスがある中で、なぜ私がこのRocroプロジェクトを企画したのか。その理由の一つが、更にCIの高速化を押し進めることです。メニーコアCPUやオートスケール可能なクラウドサービスが普及した現在において、ジョブをなるべく細かく分割して並列化することがCI高速化の王道です。今回は、Rocroがどのように並列化をサポートしているかを説明します。

RocroのInspecode/Docstandは、すべてのツールを並列に実行します*1。例えば、Inspecodeにおいて下記のようなrocro.ymlを記述した場合、gofmt, golint, go testの3つが並列に実行されます。

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

このようにシンプルにツール名を書き並べるだけで並列化することができます。また、rocro.ymlを記述しなくても、InspecodeはGitレポジトリ内の主要言語を検出して、その言語に適したツールを自動的に並列実行します。

ツールへの入力を分割して、更に細かく並列化することも可能です。例えば、下記のように記述することで、go testの入力が2分割され、それぞれ並列に実行されます。

inspecode:
    gofmt: default
    golint: default
    go-test:
        - input:
            - /path/to/package1
            - /path/to/package2
        - input:
            - /path/to/package3
            - /path/to/package4

ジョブ全体の時間に対して特定のツールの実行時間が支配的な場合、ツールレベルの並列実行だけではあまり速くはなりません。そういう場合は、そのツールへの入力を適宜分割して高速化を図るのがよいでしょう。

次回は、リソース配分の最適化による高速化を取り上げる予定です。

*1 rocro.ymlは、並列化などの最適化を自動で行いやすくするために、可能な限り宣言的な記述スタイルを採用しています。