AWS EFS Throughput Modes Explained: Pick the Right One

Benchmark data for EFS Bursting vs Elastic vs Provisioned throughput modes. Includes cost comparisons, fio results, and a decision framework to avoid performance surprises.

#aws#efs#performance#storage
Cover image for the article: AWS EFS Throughput Modes Explained: Pick the Right One

Introduction

AWS Elastic File System (EFS) provides shared file storage for EC2 instances, containers, and Lambda functions. However, its performance characteristics are frequently misunderstood, leading to either unexplained latency spikes when burst credits deplete or overspending on provisioned throughput that goes unused.

EFS offers three throughput modes (Bursting, Elastic, and Provisioned) and two performance modes (General Purpose and Max I/O). Selecting the right combination reduces costs by 40-60% while eliminating performance issues. This guide provides benchmark data and decision frameworks for each combination.

Throughput Mode Comparison

ModeHow It WorksBest ForCost Structure
BurstingThroughput scales with stored dataSpikey workloads, > 1TB storedStorage only
ElasticAuto-scales to demand, pay per useUnpredictable workloadsStorage + throughput used
ProvisionedFixed throughput regardless of sizeConsistent high-throughput needsStorage + provisioned rate

Bursting Mode Credit Mechanics

Storage SizeBaseline ThroughputBurst ThroughputBurst Duration (full credits)
100 GB5 MB/s100 MB/s72 minutes
500 GB25 MB/s100 MB/s360 minutes
1 TB50 MB/s100 MB/sIndefinite
5 TB250 MB/s500 MB/sIndefinite
10 TB500 MB/s1,000 MB/sIndefinite

Chart

Critical insight: For file systems smaller than 1 TB, bursting mode eventually depletes credits during sustained workloads. This is the #1 cause of unexpected EFS performance degradation.

Benchmark Results

Sequential Read Throughput

Tested with fio across different file sizes and throughput modes on m6i.2xlarge instances:

# Benchmark command
fio --name=seq-read \
  --directory=/mnt/efs \
  --rw=read \
  --bs=1M \
  --numjobs=4 \
  --iodepth=32 \
  --size=10G \
  --runtime=300 \
  --time_based \
  --group_reporting
ConfigurationThroughput (MB/s)Latency (avg)IOPS
Bursting (100 GB, with credits)1002.5ms100
Bursting (100 GB, no credits)550ms5
Bursting (1 TB, sustained)505ms50
Elastic (auto-scaled)3501.8ms350
Provisioned (256 MB/s)2562.0ms256
Provisioned (1024 MB/s)1,0241.2ms1,024

Random Read IOPS (4K Block Size)

Performance ModeIOPS (4K reads)Latency (avg)Latency (p99)
General Purpose35,0000.6ms2.5ms
General Purpose (One Zone)35,0000.4ms1.8ms
Max I/O500,000+1.0ms5.0ms

Metadata Operations

OperationGeneral PurposeMax I/OEBS (reference)
File create1.5ms3.0ms0.2ms
File stat0.5ms1.0ms0.05ms
Directory listing (1000 files)15ms25ms2ms
File rename2.0ms4.0ms0.1ms

Performance Mode Decision

CharacteristicGeneral PurposeMax I/O
LatencyLower (< 1ms for reads)Higher (1-5ms)
IOPS ceiling35,000500,000+
Metadata opsFasterSlower
Ideal workloadWeb serving, CMS, CI/CDBig data, genomics, ML training
Client count< 100 concurrent100-1000+ concurrent

Cost Analysis

Monthly Cost Comparison (1 TB stored, 100 MB/s average throughput)

Throughput ModeStorage CostThroughput CostTotal Monthly
Bursting$300$0 (included)$300
Elastic$300$270*$570
Provisioned (100 MB/s)$300$600$900
Provisioned (256 MB/s)$300$1,536$1,836

*Elastic mode: $0.04/GB transferred for reads, $0.06/GB for writes

When Each Mode Saves Money

ScenarioCheapest ModeMonthly Cost
5 TB stored, 50 MB/s neededBursting$1,500
100 GB stored, 100 MB/s neededProvisioned$630
500 GB stored, variable (0-500 MB/s)Elastic$150 + usage
2 TB stored, 200 MB/s neededProvisioned$1,800

Chart

Monitoring EFS Performance

CloudWatch Metrics

# Monitor burst credit balance (critical for bursting mode)
aws cloudwatch get-metric-statistics \
  --namespace AWS/EFS \
  --metric-name BurstCreditBalance \
  --dimensions Name=FileSystemId,Value=fs-0123456789 \
  --start-time "$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%S)" \
  --end-time "$(date -u +%Y-%m-%dT%H:%M:%S)" \
  --period 3600 \
  --statistics Minimum

# Monitor throughput utilization
aws cloudwatch get-metric-statistics \
  --namespace AWS/EFS \
  --metric-name TotalIOBytes \
  --dimensions Name=FileSystemId,Value=fs-0123456789 \
  --start-time "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S)" \
  --end-time "$(date -u +%Y-%m-%dT%H:%M:%S)" \
  --period 60 \
  --statistics Sum

Alert for Burst Credit Depletion

aws cloudwatch put-metric-alarm \
  --alarm-name "EFS-BurstCredits-Low" \
  --namespace AWS/EFS \
  --metric-name BurstCreditBalance \
  --dimensions Name=FileSystemId,Value=fs-0123456789 \
  --statistic Minimum \
  --period 300 \
  --threshold 1000000000000 \
  --comparison-operator LessThanThreshold \
  --evaluation-periods 3 \
  --alarm-actions "arn:aws:sns:us-east-1:123456789012:ops-alerts" \
  --alarm-description "EFS burst credits below 1TB - performance degradation imminent"

Mount Options for Performance

# Optimized mount options for high-throughput workloads
sudo mount -t nfs4 \
  -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport \
  fs-0123456789.efs.us-east-1.amazonaws.com:/ /mnt/efs

# /etc/fstab entry
fs-0123456789.efs.us-east-1.amazonaws.com:/ /mnt/efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0

Mount Option Impact

OptionDefaultOptimizedImpact
rsize1 MB1 MBMax read buffer (already optimal)
wsize1 MB1 MBMax write buffer
timeo600600Timeout before retry (deciseconds)
retrans22Retry count
noresvportNoYesAllows connection recovery without unmount

EFS with Kubernetes (EFS CSI Driver)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-0123456789
  directoryPerms: "700"
  uid: "1000"
  gid: "1000"
  basePath: "/dynamic-pv"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-data
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 50Gi

Decision Framework

Is your stored data > 1 TB?
├── Yes: Is throughput demand consistent?
│   ├── Yes (> baseline): Use Provisioned
│   └── No (spikey): Bursting works (baseline = size_TB * 50 MB/s)
└── No (< 1 TB):
    ├── Predictable throughput need: Use Provisioned
    ├── Unpredictable/variable: Use Elastic
    └── Very low throughput (< 5 MB/s): Bursting with monitoring

Frequently Asked Questions

What are the EFS throughput modes?

AWS EFS offers three throughput modes: Bursting (throughput scales with stored data size), Elastic (auto-scales to demand with per-GB-transferred billing), and Provisioned (fixed throughput you configure regardless of file system size). Each mode has different cost structures and performance characteristics.

When should I use Elastic throughput vs Provisioned?

Use Elastic throughput when your workload is unpredictable or has variable demand—it auto-scales from 0 to 10+ GB/s and you only pay for what you use ($0.04/GB read, $0.06/GB write). Use Provisioned when you have consistent, predictable high-throughput needs, as it is cheaper than Elastic for steady-state workloads above approximately 100 MB/s sustained.

How does EFS performance scale with file system size?

In Bursting mode, baseline throughput is 50 MB/s per TB stored. A 100 GB file system gets only 5 MB/s baseline, while a 5 TB file system gets 250 MB/s. File systems under 1 TB will eventually deplete burst credits during sustained workloads, which is the most common cause of unexpected EFS performance degradation.

What's the maximum throughput for EFS?

EFS can deliver over 10 GB/s in Elastic mode and up to 1,024 MB/s per provisioned configuration. For IOPS, General Purpose mode supports up to 35,000 IOPS with sub-millisecond latency, while Max I/O mode supports 500,000+ IOPS at slightly higher latency (1-5ms).

Should I use General Purpose or Max I/O performance mode?

General Purpose mode suits 90% of workloads with lower latency (under 1ms for reads) and faster metadata operations. Choose Max I/O only for massively parallel workloads (100-1000+ concurrent clients) like big data processing, genomics, or ML training where you need 500,000+ IOPS and can tolerate higher latency.

Key Takeaways

  • Bursting mode only works reliably for file systems above 1 TB where baseline throughput meets demand; smaller file systems will deplete credits during sustained workloads.
  • Elastic mode is ideal for unpredictable workloads providing automatic scaling from 0 to 10+ GB/s without provisioning, at a per-GB-transferred cost.
  • Provisioned mode is cheapest for consistent high-throughput when you know your steady-state throughput needs and can commit to a fixed rate.
  • Monitor BurstCreditBalance as a critical metric and alert when credits drop below 1 TB to prevent sudden performance degradation.
  • General Purpose performance mode suits 90% of workloads with sub-millisecond latency up to 35,000 IOPS; only use Max I/O for massively parallel access patterns.
  • Use noresvport mount option to ensure NFS connections can recover after brief network interruptions without requiring a full unmount.
  • EFS metadata operations are 10-30x slower than EBS making it unsuitable for workloads with heavy file creation, renaming, or directory listing operations.

Comments

    No comments yet. Be the first to share your thoughts.