Skip to content

Add embodied emissions to storage - #275

Merged
jnioche merged 3 commits into
mainfrom
102
Aug 28, 2026
Merged

Add embodied emissions to storage#275
jnioche merged 3 commits into
mainfrom
102

Conversation

@jnioche

@jnioche jnioche commented Aug 27, 2026

Copy link
Copy Markdown
Member

Closes #102.

Adds embodied_emissions_co2eq_g to the Storage modules for both AWS and Azure, amortised over a five year service life. Until now embodied emissions were only estimated for compute instances and LLM inference, following CCF, which models them for compute usage types only.

Values

HDD SSD
basis 30 kg CO2eq per drive, divided by an assumed 15 TB 0.055 kg CO2eq per GB
life 43800 h 43800 h
coefficient 4.566e-5 g/GB-hour 1.256e-3 g/GB-hour
works out at 0.40 kg CO2eq per TB-year 11 kg CO2eq per TB-year

The two media are modelled on different bases because they behave differently. A hard drive costs roughly the same to manufacture whatever its capacity, since the platters, motor, actuator, casing and PCB are near-fixed for a 3.5" unit and areal density does the work. An SSD's die area scales with capacity.

Why 30 kg per drive

Four independent sources land within 8 % of each other across a 40x span of drive capacities, which is itself the evidence for treating HDD embodied carbon as capacity independent:

source stated as capacity behind it per drive
Boavizta / Umweltbundesamt 2021 31.11 kg per unit modelled capacity-independent 31.1 kg
Seagate Exos X22 LCA, via Tailpipe 0.0013 kg/GB 22 TB 28.7 kg
Seagate 0.27 kg/TB-year ~22.6 TB ~30.5 kg
Tannu & Nair 2023, 24 vendor LCAs SEF 0.02 kg/GB sample spans 512 GB to 6 TB ~30 kg at their mean

If manufacturing carbon tracked bytes, those would differ by 40x rather than 8 %.

Note that the Tannu & Nair rate cannot be applied per GB to current hardware: 0.02 kg/GB encodes the drive sizes of a pre-2023 LCA corpus and overstates per-byte embodied carbon by about an order of magnitude. Their Table 1 also gives 1 TB CAPEX as 20 kg at five years, not the 40 kg quoted second-hand in #102, which is the ten year column and includes a replacement drive.

For SSD, Boavizta's die-area formula (0.052 kg/GB) and the 2025 Embodied Carbon Footprint of 3D NAND Memories study (0.056) agree within 8 %. Tannu & Nair's 0.16 kg/GB is roughly 3x higher because 3D NAND layer scaling has cut per-GB manufacturing carbon since their corpus closed.

The assumed 15 TB drive is the installed-fleet average implied by Backblaze's 2025 Drive Stats (341,664 drives: 25.13 % at 0 to 12 TB, 52.06 % at 14 to 16 TB, 22.81 % at 20 TB+). That is the right basis for bytes sitting on hardware bought over several years; current nearline shipments average nearer 22 TB, which would give 0.27 kg per TB-year instead of 0.40.

All four inputs are configuration keys (hdd_embodied_kg_per_drive, hdd_capacity_gb, ssd_embodied_kg_per_gb, storage_lifetime_hours), wired into the four default configs.

Notes

The replication factor applies to embodied as it does to energy: the same bytes occupy that many times more physical drives.

On Azure, hdd_capacity_gb describes the physical drive, not a Managed Disk SKU. The provisioned size of a P10 or S4 volume says nothing about the drive underneath it, so the capacities in MANAGED_DISKS must not be substituted here. Flagged in the javadoc so it does not get "fixed" later.

One consequence worth knowing before merging: SSD-backed storage becomes embodied-dominated. A gp3 volume comes out at roughly 11 kg CO2eq per TB-year embodied against about 4 kg operational, so EBS lines shift materially in any total-emissions ranking.

Incidentally

The AmazonDocDB case in the AWS provideArgsWithType was flagged isSSD=false although AmazonDocDB is in SSD_SERVICES. The energy assertion never caught it because its tolerance was wider than the gap between the two coefficients. Flag corrected and the tolerances tightened from 1e-4 to 1e-12 on both providers.

The numeric parameter reader moved to Utils.doubleParam now that both modules need it.

Still stale

The sample query output in docs/src/tutorial/results.md shows NULL embodied for the S3 and EBS rows. Those will be populated after this change, but the table comes from a real run rather than a bundled dataset, and the AmazonECS / FargateTask row cannot be derived arithmetically because its energy comes from Serverless while its embodied would come from the Fargate ephemeral-storage rows grouped under the same operation. Worth regenerating separately.

The Storage module now writes embodied_emissions_co2eq_g alongside
operational_energy_kwh, amortised over a five year service life.

HDD and SSD are modelled on different bases. A hard drive costs roughly
the same to manufacture whatever its capacity, since the platters, motor,
actuator, casing and PCB are near-fixed for a 3.5" unit, so its embodied
carbon is a constant per drive divided by an assumed capacity. An SSD's
die area scales with capacity, so its figure is a rate per GB.

The 30 kg CO2eq per drive is where four independent sources converge
across a 40x range of capacities, which is itself the evidence for
treating it as capacity independent: Boavizta / Umweltbundesamt (31.11 kg
per unit), a Seagate Exos X22 LCA (28.7 kg for 22 TB), Seagate's
published 0.27 kg per TB-year, and Tannu & Nair's meta-analysis of 24
vendor LCAs. That last source cannot be used as a per-GB rate directly:
its 0.02 kg/GB encodes a 512 GB to 6 TB sample and overstates per-byte
embodied carbon on modern drives by an order of magnitude.

The 0.055 kg CO2eq per GB for SSD is where Boavizta's die-area formula
(0.052) and the 2025 Embodied Carbon Footprint of 3D NAND Memories study
(0.056) agree.

The assumed 15 TB drive is the installed-fleet average from Backblaze's
2025 Drive Stats, the right basis for bytes sitting on hardware bought
over several years. All four inputs are configurable.

The replication factor applies to embodied as well as to energy: the same
bytes occupy that many times more physical drives.

Also fixes a latent test bug. The AmazonDocDB case in provideArgsWithType
was flagged isSSD=false although AmazonDocDB is in SSD_SERVICES, which
the energy assertion missed because its tolerance was wider than the gap
between the two coefficients.

Azure storage is unchanged and still writes no embodied emissions.
Mirrors the AWS change into ccf.azure.Storage, using the same
coefficients: the figures describe drives rather than anything provider
specific, so there is no reason for the two to differ. Both generic
capacity meters and Managed Disks are covered, and the replication factor
applies to embodied as it does to energy.

hdd_capacity_gb describes the physical drive, not a Managed Disk SKU. The
provisioned size of a P10 or S4 volume says nothing about the drive
underneath it, so the capacities in MANAGED_DISKS must not be substituted
here; noted in the class javadoc so it does not get "fixed" later.

The parameter reader moves to Utils.doubleParam now that both modules
need it. It tolerates the whole numbers JSON configs carry as integers.

Also tightens the energy assertions in the Azure tests from 1e-4 to
1e-12, matching the AWS side, where a wide tolerance had been hiding a
mis-flagged media type.
The Storage entry in the module summary table still listed only
operational_energy_kwh and Cloud Carbon Footprint, and the stage 2
introduction still named only Boavizta and EcoLogits as producing
embodied estimates.

The derivation in the Storage section named its sources without linking
any of them, so it now carries a table of the seven figures behind the
defaults with a link each: the BoaviztAPI HDD and SSD components and the
Umweltbundesamt report behind them, the Seagate Exos X22 LCA and Seagate's
per-TB-year figure, Tannu & Nair's meta-analysis, the 3D NAND study, and
Backblaze's fleet capacity mix.

Also records in methodology.md which services get an embodied estimate at
all, and that the rest leave the column null rather than zero.
@jnioche jnioche added this to the 1.3 milestone Aug 27, 2026
@jnioche jnioche added the enhancement New feature or request label Aug 27, 2026

@dpol1 dpol1 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. One thing I noticed: Boavizta amortises servers over 35040 h (4 years), here storage is 43800. Deliberate?

@jnioche

jnioche commented Aug 28, 2026

Copy link
Copy Markdown
Member Author

LGTM. One thing I noticed: Boavizta amortises servers over 35040 h (4 years), here storage is 43800. Deliberate?

the five years follows Amazon's disclosed useful life for servers and networking equipment, the assumption is that it is the same for drives.

It is an accounting estimate, not a drive replacement policy, and it covers servers and networking equipment as an asset class. AWS does not break out storage media separately, so applying it to a hard drive is an inference on my part.

Tannu and Nair also use 5 years.

As for Tailpipe => The resulting embodied carbon is attributed over a 5.7-year equipment replacement cycle, the average service life of data center equipment reported in the [2024 Lawrence Berkeley National Laboratory data center energy report](https://eta.lbl.gov/publications/2024-lbnl-data-center-energy-usage-report), in proportion to how long the storage is held, in the same way as the other components above.

So 5 felt like a reasonable value. It is configurable anyway

@jnioche
jnioche merged commit f7717bc into main Aug 28, 2026
3 checks passed
@jnioche
jnioche deleted the 102 branch August 28, 2026 08:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add embodied emissions to storage

2 participants