self-host →

M9g ARM64 runners: ~30% faster single-thread than Graviton4 or GitHub's runners

RunsOn can now launch GitHub Actions ARM64 runners on AWS Graviton5-based M9g instances. In our benchmark they are ~27% faster single-thread than m8g and ~31% faster than GitHub's hosted ARM64 runners.

m9g is live on RunsOn

The first AWS Graviton5 instance family is now usable from RunsOn, and on our CPU benchmark it is the fastest ARM64 runner we have measured: roughly 27% faster single-thread than the previous Graviton generation (m8g) and ~31% faster than GitHub’s own hosted ARM64 runners.

If your GitHub Actions jobs already run on ARM64, try m9g for CPU-heavy builds:

runs-on: runs-on=${{ github.run_id }}/cpu=2/family=m9g/image=ubuntu24-full-arm64

That launches an ephemeral EC2 runner on the M9g family, with the regular RunsOn lifecycle: fresh VM for the job, terminated after the job, no long-lived runner fleet to babysit.

Why This Is Interesting#

AWS positions EC2 M9g as the first general-purpose instance family powered by Graviton5. Their headline is up to 25% better compute performance than M8g, plus higher networking and EBS bandwidth.

Our CPU benchmark is in the same range. On the 2 vCPU large size, the current M9g benchmark shows:

runnerprocessorpassmark single-thread
m9g (RunsOn)Graviton52450
m8g (RunsOn)Graviton41929
GitHub-hosted ARM64Neoverse-N11873

That is roughly 27% faster single-thread than m8g.large, and about 31% faster than GitHub’s hosted ARM64 runner in our runs.

For CI, this matters more than the marketing label. A lot of builds still have serial sections: dependency resolution, TypeScript compilation edges, test startup, packaging, compression, and Docker layer work that does not scale perfectly across cores. Faster cores help there.

Region Availability#

As with every new instance family, AWS rolls out M9g capacity region by region. At the time of writing it is available in us-east-1, us-east-2, us-west-2, and eu-central-1.

You can check the current list (along with specs and live spot/on-demand pricing) on the M9g instance page. That page also exposes an Atom feed if you want to be notified when new regions come online.

Use It Explicitly#

The safest first step is to pin one ARM64 workflow to m9g:

jobs:
test-arm64:
runs-on: runs-on=${{ github.run_id }}/cpu=2/family=m9g/image=ubuntu24-full-arm64
steps:
- uses: actions/checkout@v6
- run: npm ci
- run: npm test

If your RunsOn stack lives in a region where M9g has not landed yet, or you want a fallback while capacity ramps up, use a multi-family label:

runs-on: runs-on=${{ github.run_id }}/cpu=2/family=m9g+m8g/image=ubuntu24-full-arm64

RunsOn will keep the job on ARM64 because the image is ARM64. The family list only changes which EC2 families are allowed.