Home

S3 Download Acceleration Benchmark

Testing download speed for 2 GiB file from EU S3 buckets | June 2026

Test Setup

File size: 2 GiB (random data)

Source (client): EC2 instance in AWS

Bucket 1: eu-south-2 (Spain, Zaragoza)

Bucket 2: eu-central-1 (Frankfurt, Germany)

Bucket 3: eu-north-1 (Stockholm, Sweden)

Access: Private (no public access)

Region Map

Test Methods

1. Baseline (aws s3 cp) — Standard single-stream download using the AWS CLI. Uses default multipart settings internally but downloads through a single TCP connection to S3.
aws s3 cp s3://bucket/file.bin ./output.bin --region eu-south-2
2. S3 Transfer Acceleration — Routes data through CloudFront edge locations. Designed to speed up transfers for clients far from the S3 bucket region by using AWS backbone from the nearest edge.
aws s3api put-bucket-accelerate-configuration --bucket bucket --accelerate-configuration Status=Enabled
aws s3 cp s3://bucket/file.bin ./output.bin --endpoint-url https://s3-accelerate.amazonaws.com
3. Parallel Range GET (16 chunks) — Splits the file into 16 byte-range segments and downloads all concurrently using background processes. Each chunk uses a separate TCP connection to S3, saturating available bandwidth.
for i in $(seq 0 15); do
  aws s3api get-object --bucket bucket --key file.bin \
    --range "bytes=${start}-${end}" chunk-${i}.bin &
done
wait
4. Tuned Multipart (64MB chunks) — Uses aws s3 cp with adjusted multipart chunk size configuration. Tests whether larger transfer units improve throughput over the default settings.
aws s3 cp s3://bucket/file.bin ./output.bin --region eu-south-2 \
  --cli-read-timeout 300 --expected-size 2147483648

Results

Method Region Duration Speed Speedup
Baseline (aws s3 cp) Spain 24.56s 699.5 Mbps 1.0x
Baseline (aws s3 cp) Frankfurt 23.90s 718.8 Mbps 1.0x
Transfer Acceleration Spain Not supported
Transfer Acceleration Frankfurt 24.78s 693.3 Mbps 0.97x
Tuned Multipart (64MB) Spain 24.71s 695.3 Mbps 0.99x
Tuned Multipart (64MB) Frankfurt 24.53s 700.4 Mbps 1.0x
Parallel Range GET (16 chunks) WINNER Spain 1.80s 9,544 Mbps 13.6x
Parallel Range GET (16 chunks) WINNER Frankfurt 1.84s 9,337 Mbps 13.0x
Baseline (aws s3 cp) Stockholm 26.69s 643.7 Mbps 0.9x
Parallel Range GET (16 chunks) WINNER Stockholm 1.89s 9,090 Mbps 12.6x
Pre-signed URL (curl) Stockholm 161.30s 106.5 Mbps 0.15x
Pre-signed Parallel (curl, 16 chunks) Stockholm 15.99s 1,074 Mbps 1.5x
Pre-signed URL (curl) Spain 136.32s 126.0 Mbps 0.18x
Pre-signed URL (curl) Frankfurt 131.51s 130.6 Mbps 0.18x
Pre-signed Parallel (curl, 16 chunks) Spain 22.85s 751.9 Mbps 1.05x
Pre-signed Parallel (curl, 16 chunks) Frankfurt 12.54s 1,370 Mbps 1.9x
CloudFront (single stream) Frankfurt 127.33s 134.9 Mbps 0.19x
CloudFront Parallel (16 chunks) Frankfurt 6.22s 2,762 Mbps 3.8x

Visual Comparison

Method Throughput
Baseline
~700 Mbps
Transfer Acceleration
~693 Mbps
Tuned Multipart
~698 Mbps
Pre-signed (curl)
~130 Mbps
CloudFront (single)
~135 Mbps
Pre-signed Parallel
~1,370 Mbps
CloudFront Parallel
~2,762 Mbps
S3 API Parallel GET
~9,440 Mbps

Key Findings

Parallel Range GET is 13x faster — By splitting the file into 16 concurrent byte-range requests, we saturate the network bandwidth and download 2 GiB in under 2 seconds (~9.5 Gbps).
Transfer Acceleration doesn't help within AWS — S3 Transfer Acceleration is designed for clients outside AWS. When both source and destination are in AWS, it adds latency through CloudFront edge hops without benefit.
Region choice barely matters within EU — Spain and Frankfurt deliver nearly identical throughput from the same client, thanks to AWS backbone networking.
Tuning multipart chunk size has no effect — The AWS CLI already uses optimal multipart settings internally. Adjusting chunk size doesn't improve single-stream throughput.

Recommendation

For maximum download speed from S3 within AWS:

Use parallel byte-range GET requests (16-32 concurrent streams)

This technique works with private buckets, requires no special configuration, and scales linearly with available bandwidth.