注目イベント!
アドベントカレンダー2024開催します(12/1~12/25)!
一年を締めくくる特別なイベント、アドベントカレンダーを今年も開催します!
初心者からベテランまで楽しめる内容で、毎日新しい技術トピックをお届けします。
詳細はこちらから!
event banner

高コスパで電力効率のよい Arm ベースの GitHub Actions Runner を使っていく

| 5 min read
Author: masahiro-kondo masahiro-kondoの画像

はじめに

#

Arm ベースの Actions Runner がパブリックベータになりました。Arm ベースの Linux / Windows ランナーが提供されます。

Actions: Arm-based linux and windows runners are now in public beta

GitHub のブログでは、Arm テクノロジーがデータセンターの電力消費を削減することが記載されています。Windows ランナーについては、GitHub と Arm が提携して Windows VM イメージを提供しているようです[1]

Arm64 on GitHub Actions: Powering faster, more efficient build systems

我々ユーザーにとっての魅力は x64のランナーに比べ37%も安いその価格です。価格表は以下にあります。

Per-minute rates | About billing for GitHub Actions - GitHub Docs

2024.09.05追記

Arm 版の Linux / Windows Runner が GA になりました。

GitHub Actions: arm64 Linux and Windows runners are now generally available · GitHub Changelog

Arm ベースの Runner をオーガニゼーションに登録する

#

Arm ベースの Runner は有料プラン(Team 以上)のオーガニゼーションで利用できます。

オーガニゼーションの Settings -> Actions -> Runners を選択し、Runners のページで New runner ボタンをクリックします。

Manage runners

New GitHub-hosted runner をクリックします。

New GitHub-hosted runner

Runner 作成の UI が表示されます。Linux ARM64Windows ARM64 が Beta として選択できるようになっています。

Create new runner

ひとまず最小スペックの Linux ARM 64、Ubuntu 22.04、2-core 8GB RAM のマシンに設定し linux-arm64 という名前にして Create runner をクリックしました。

Create Linux Arm64 Runner

すぐに Runner がセットアップされ利用可能になりました。

Linux Arm64 Runner created

速度比較

#

上記の Arm Runner に合わせて最小構成の x64 Runner を比較用として linux-x64 という名前で作成しました。

Linux-x64 runner

Information

今回の比較は private リポジトリで行いました。最初 x64 Runner については ubuntu-latest を指定しようかと思ったのですが、GitHub の日本語ドキュメントには private リポジトリ用 Runner のスペックが記載されているのに対し、英語版では見つけられませんでした。そこで比較用に同等スペックで作成することにしました。

以前の記事「GitHub Actions でハイスペックな Larger runners を試す」で使ったのと同様のワークフローをベンチマーク用に準備しました。

Electron アプリのビルド

#

Electron アプリのビルドを行うワークフローです。前掲の記事と同様、mamezou-tech で公開している Electron のサンプルをビルドするフローとなっており、linux-x64, linux-arm64 の Runner でそれぞれ実行する構成になっています。

build-electron-app.yml
name: Build Electron App

on:
  workflow_dispatch:

jobs:
  build:

    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [linux-x64, linux-arm64]

    steps:
    - uses: actions/checkout@v4
      with:
        repository: 'mamezou-tech/electron-example-browserview'
        path: electron-example-browserview      
    - name: Setup nodejs
      uses: actions/setup-node@v4
      with:
        node-version: '20'
    - name: Install dependencies
      run: |
        cd electron-example-browserview
        npm install
    - name: Package
      run: |
        cd electron-example-browserview
        npx electron-builder --dir
      env:
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: package-${{ matrix.os }}
        path: electron-example-browserview/dist/*

主要ステップのビルド時間を表にしました。2回計測した平均(単位:秒)です。

Linux x64 Linux arm64
Setup nodejs 8.5 5.0
Install dependencies 10.0 5.5
Package 24.0 23.5
Upload artifacts 15.5 12.0

パッケージングに要した時間はほぼ互角でしたが、Node.js セットアップ、npm install、成果物アップロードは差がついており、Arm 版 Runner の方がフロー全体のスループットが高い結果となりました。

Go のバッチ処理

#

sbgraph を使ったバッチ処理の比較です。sbgraph をビルドし、Scrapbox のプロジェクトからページデータをフェッチして、集計やグラフ構造生成を実行しています。これも linux-x64linux-arm64 の Runner でそれぞれ実行するようにしました。

bench.yml
name: sbgraph benchmark

on:
  workflow_dispatch:

jobs:

  build:
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [linux-x64, linux-arm64]

    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-go@v5
      with:
        go-version: 1.22
    - name: Install sbgraph
      run: |
        go install github.com/mamezou-tech/sbgraph@latest
        sbgraph init
        sbgraph project -p help-jp
    - name: Fetch data
      run: sbgraph fetch
    - name: Aggregate
      run: sbgraph aggregate -s=true
    - name: Generate Graph data
      run: sbgraph graph -i=true -j=true
    - name: Upload result
      uses: actions/upload-artifact@v4
      with:
        name: help-jp-result-${{ matrix.os }}
        path: _work/help-jp*

主要ステップの比較です。これも2回計測した平均(単位:秒)です。Stup Go やデータフェッチは x64 の方がやや速いですが、Arm は go install がかなり速く、全体としては Arm Runner のスループットが高い結果となりました。

Linux x64 Linux arm64
Setup Go 4.0 7.5
Install 35.5 19.5
Fetch data 3.0 4.5
Aggregate 0 0
Generate graph 0 0
Upload 1.5 1.0

さいごに

#

簡単なベンチマークでしたが、Arm Runner は x64 Runner に遜色なく(上回ることもある)結果となりました。価格も安いのでできるだけ Arm Runner を採用したくなります。

Arm アーキテクチャでは動かないソフトウェアもあるので、全てのフローを置き換えられるわけではありませんが、利用できるケースでは使っていきたいと思っています。


  1. Arm ベースの Windows PC はかなり昔発売されたことがありましたが、パワー不足だったのか価格の問題があったのか普及しなかったですね。 ↩︎

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。