Apple Silicon and the ARM Server Future

November 16, 2020

Apple’s M1 announcement last week changes the conversation about ARM processors. The performance per watt is remarkable. While M1 is for consumer devices, it signals where computing is heading—including servers.

Here’s what this means for infrastructure and development.

What M1 Demonstrates

Performance Reality

Early benchmarks show:

This isn’t ARM catching up. This is ARM taking the lead in efficiency, and becoming competitive in raw performance.

Why It Matters for Servers

Traditional assumption:
  x86 = performance
  ARM = mobile/embedded

New reality:
  ARM = performance + efficiency
  x86 = compatibility + legacy

ARM in Servers Today

AWS Graviton

Amazon’s ARM servers are already compelling:

Graviton2 vs comparable x86:
- 40% better price/performance
- 20% lower cost per hour
- Available in common instance types

Instance types:
- General purpose: m6g, t4g
- Compute optimized: c6g
- Memory optimized: r6g
- Storage optimized: i3g

Real-world results:

workload: API server (Node.js)
m5.large (x86):
  cost: $0.096/hour
  requests/sec: 10,000

m6g.large (Graviton2):
  cost: $0.077/hour
  requests/sec: 11,500

savings: 20% cost, 15% better throughput

Other ARM Server Offerings

Development Workflow Changes

Multi-Architecture Builds

With ARM developers and x86 servers (or vice versa):

# Multi-arch Dockerfile
FROM --platform=$BUILDPLATFORM golang:1.19 AS builder
ARG TARGETARCH

WORKDIR /app
COPY . .
RUN GOARCH=$TARGETARCH go build -o server .

FROM --platform=$TARGETPLATFORM alpine:3.18
COPY --from=builder /app/server /server
CMD ["/server"]
# Build for multiple architectures
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --push \
  -t myapp:latest .

CI/CD Considerations

# GitHub Actions multi-arch
jobs:
  build:
    strategy:
      matrix:
        arch: [amd64, arm64]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Build
        run: |
          docker buildx build \
            --platform linux/${{ matrix.arch }} \
            -t myapp:${{ matrix.arch }} .

Local Development

M1 developers working with x86 production:

# Docker Desktop handles translation
# But native ARM images are faster

# Option 1: Use ARM-compatible images locally
services:
  db:
    image: postgres:14  # Has ARM variant
    platform: linux/arm64  # Use native

  app:
    build:
      context: .
      platforms:
        - linux/arm64  # Fast local
        - linux/amd64  # Production
# Option 2: Test both architectures in CI
# Local: ARM (fast)
# CI: Both (thorough)

Migration Considerations

Compatible Workloads

Most software just works:

Recompile and run. ARM is well-supported.

Potential Issues

incompatible:
  - x86-specific assembly
  - Proprietary software without ARM builds
  - Very old dependencies
  - Windows-specific tooling

needs_testing:
  - Performance characteristics differ
  - Memory access patterns
  - Floating-point edge cases
  - Native extensions in interpreted languages

Testing Strategy

# Compare x86 and ARM behavior
# Run test suite on both architectures
# Compare:
# - Correctness (same outputs?)
# - Performance (where are differences?)
# - Edge cases (floating point, etc.)

Cost-Benefit Analysis

When ARM Makes Sense

good_fit:
  - CPU-bound workloads
  - Horizontally scalable services
  - New deployments (no migration cost)
  - Cost-sensitive workloads
  - Green computing initiatives

less_clear:
  - Existing x86 infrastructure
  - Licensed per-socket software
  - Workloads with x86 dependencies
  - Performance-critical with specific tuning

Migration ROI

Consider:
- Instance cost savings (20-40%)
- Migration effort (engineering time)
- Testing requirements
- Operational changes (monitoring, debugging)
- Risk of issues (compatibility, performance)

Simple services: Likely worth it
Complex, tuned systems: Evaluate carefully

Future Implications

Where This Is Heading

Near term (1-2 years):
- More ARM server options
- Better tooling support
- Graviton3 and competitors
- ARM as default for new workloads

Medium term (3-5 years):
- ARM majority in cloud
- x86 for legacy/specialized
- Custom silicon for specific workloads
- Efficiency becomes primary metric

Long term:
- Heterogeneous computing normal
- Workload-specific acceleration
- Edge computing on ARM
- x86 becomes legacy architecture

Prepare Now

recommendations:
  architecture:
    - Build multi-arch containers
    - Test on ARM in CI
    - Avoid x86-specific assumptions

  code:
    - Use portable languages/runtimes
    - Avoid assembly where possible
    - Test numerical code thoroughly

  operations:
    - Monitor for architecture-specific issues
    - Build ARM debugging capabilities
    - Include ARM in capacity planning

  strategy:
    - Pilot ARM for new services
    - Evaluate existing services for migration
    - Track ARM ecosystem maturity

Key Takeaways

The x86 monoculture is ending. ARM’s efficiency advantages are too significant to ignore. Building for multiple architectures isn’t just future-proofing—it’s becoming table stakes.