M9g ARM64 runners: ~30% faster single-thread than Graviton4 or GitHub's runners
RunsOn can now launch GitHub Actions ARM64 runners on Graviton5-based M9g instances: ~27% faster single-thread than m8g, ~31% faster than GitHub's ARM64.
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-arm64That 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:
| runner | processor | passmark single-thread |
|---|---|---|
m9g (RunsOn) | Graviton5 | 2450 |
m8g (RunsOn) | Graviton4 | 1929 |
| GitHub-hosted ARM64 | Neoverse-N1 | 1873 |
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 testIf 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-arm64RunsOn will keep the job on ARM64 because the image is ARM64. The family list only changes which EC2 families are allowed.