Thin provisioning, fractional reserve and space reclaim

Thin provisioning is how most ONTAP systems give out more space than they physically have. It saves real money, and it’s also how a busy Friday night turns into “every database on that aggregate stopped”.

This lesson shows thick and thin side by side, explains fractional reserve and space reclaim, and lets you fill an overcommitted aggregate on purpose.

Where this lesson fits

Lesson 33 of 56 in NetApp ONTAP Storage Administration · Phase 2: Protocols and day-to-day administration · Before this: Lesson 32, Quotas · Next: Lesson 34, Deduplication, compression and compaction

TimeYou needBy the end you can
60 minutesThe practice shell 1.2 with setup-29.txt, and host mode for linux1Choose thick or thin, calculate overcommit, read volume show-space, and spot a full aggregate behind a “full” thin volume

What it is, in one line

A thick volume or LUN takes its full size from the aggregate on day one; a thin one takes space only as data is written, so you can promise more than you have, as long as you watch the aggregate.

In Simple Words

Airline seats

An airline sells 200 tickets for a 180-seat plane, because it knows some people never turn up. Most days that works and the plane flies full instead of with empty seats.

On the day everyone shows up, someone is left at the gate. Thin provisioning is overbooking: smart, as long as someone is watching how many passengers have actually checked in.

Engineer's View

How an engineer describes it

A volume’s -space-guarantee is volume (thick: the whole size is reserved in the aggregate) or none (thin). A LUN’s -space-reserve is enabled (thick) or disabled (thin). The common design today is thin volume plus thin LUN, with volume autosize and monitoring on the aggregate.

Fractional reserve is extra space a volume keeps so overwrites to a thick LUN still succeed when snapshots lock the old blocks. At 100 percent it can double a LUN’s footprint; thin volumes use 0 percent, and most designs set 0 and rely on autosize and snapshot autodelete instead.

With -space-allocation enabled on a LUN, ONTAP tells the host the LUN is thin. The host can then send SCSI UNMAP (Linux fstrim or the discard mount option, Windows Optimize-Volume -ReTrim) to give deleted blocks back, and if the volume runs out the host gets a clean error instead of the LUN going offline.

How it works, step by step

1Pick thick or thin per volume

Thick for the rare workload that must never see “no space” (some old applications), thin for almost everything else.

ONTAP thin provisioning compared with thick volumes and LUNs

2Work out the overcommit

Add up the sizes of all thin volumes on the aggregate and divide by the aggregate size. 150 percent means you promised one and a half times what you have.

3Protect with autosize and alerts

Let volumes grow with autosize, alert on aggregate used percent (often 80 and 90), and know which volume you’d move first.

ONTAP thin provisioning space reclaim with UNMAP

4Give space back

Turn on space-allocation for thin LUNs and let hosts run UNMAP, so deleted files free real blocks in the aggregate.

SettingThickThin
Volume -space-guaranteevolumenone
LUN -space-reserveenableddisabled
Aggregate space used at createfull sizealmost nothing
When the aggregate fillsthick volume still has its spacewrites fail; LUNs may go offline

In System Manager: Storage › Volumes › Edit › Storage and optimization shows thin provisioning, and Storage › Tiers shows aggregate use.

System Manager Edit volume vol_thin1 storage and optimization with thin provisioning on, and the local tier usage
System Manager: Edit volume > Storage and optimization shows thin provisioning; Storage > Tiers shows real aggregate use.

Good to know: space SLO: thick, semi-thick and none in one switch

Instead of setting the volume guarantee, LUN reservation and fractional reserve one by one, volume create accepts -space-slo thick, semi-thick or none. Each value applies a matching set of space settings in one go.

Semi-thick keeps the volume thick and the LUN reserved but sets fractional reserve to 0, and relies on snapshot autodelete and autosize when space runs short. It saves space compared with fully thick and suits teams that accept a best-effort guarantee for overwrites.

Hands-on lab: overcommit an aggregate, then fill it

Before you run any command, double-check it

Read every command twice before you press Enter. Check the target: the server name, the user, the disk or device name, the path and the sizes. These commands are for learning and were tested in our lab, not on your system. At work, run the read-only commands first, follow your change process, make sure a backup exists, and ask a second person to check anything that changes or deletes data. You run them at your own risk.

This lab uses the SaatVedha ONTAP practice shell, our own learning tool. It is not NetApp software: real ONTAP output looks like this but is not identical.

1Look at the empty aggregate

Reset and run setup-29.txt, log in, then:

storage aggregate show -aggregate aggr1_01 -fields size,usedsize,availsize,percent-used

You should see this:

aggregate size   usedsize availsize percent-used
--------- ------ -------- --------- ------------
aggr1_01  8.80TB 1.18GB   8.80TB    0%

2Create one thick and two thin volumes

volume create -vserver svm1 -volume vol_thick -aggregate aggr1_01 -size 2t -space-guarantee volume
volume create -vserver svm1 -volume vol_thin1 -aggregate aggr1_01 -size 6t -space-guarantee none
volume create -vserver svm1 -volume vol_thin2 -aggregate aggr1_01 -size 6t -space-guarantee none
volume show -vserver svm1 -fields size,used,space-guarantee
storage aggregate show -aggregate aggr1_01 -fields size,usedsize,availsize,percent-used

You should see this:

vserver volume    size used    space-guarantee
------- --------- ---- ------- ---------------
svm1    svm1_root 1GB  621.8KB volume
svm1    vol_thick 2TB  629.4MB volume
svm1    vol_thin1 6TB  1.84GB  none
svm1    vol_thin2 6TB  1.84GB  none
4 entries were displayed.
saat-cluster::> storage aggregate show -aggregate aggr1_01 -fields size,usedsize,availsize,percent-used
aggregate size   usedsize availsize percent-used
--------- ------ -------- --------- ------------
aggr1_01  8.80TB 2.00TB   6.80TB    23%

The thick volume holds almost no data, yet the aggregate already lost 2 TB to it. The two thin volumes promise 12 TB and take nearly nothing. In total you’ve promised 14 TB on an 8.8 TB aggregate: about 159 percent.

✅ Checkpoint: The aggregate shows 2.00TB used with almost no data written.

Practice shell: a thick volume takes 2 TB of the aggregate on day one
The thick volume holds almost no data but already took 2 TB.

3A thin LUN and its space settings

lun create -vserver svm1 -path /vol/vol_thin1/lun1 -size 4t -ostype linux -space-reserve disabled
volume show -vserver svm1 -volume vol_thin1 -fields fractional-reserve
volume show-space -vserver svm1 -volume vol_thin1
lun show -vserver svm1 -fields space-reserve,space-allocation

You should see this (trimmed):

vserver volume    fractional-reserve
------- --------- ------------------
svm1    vol_thin1 0%
saat-cluster::> volume show-space -vserver svm1 -volume vol_thin1
...
      User Data                                1.84GB         0%
      Snapshot Reserve                        307.2GB         5%
Total Used                                 309.1GB         5%
Total Physical Used                         1.84GB         0%
saat-cluster::> lun show -vserver svm1 -fields space-reserve,space-allocation
vserver path                space-reserve space-allocation
------- ------------------- ------------- ----------------
svm1    /vol/vol_thin1/lun1 disabled      enabled

Fractional reserve is 0 on the thin volume. show-space counts the 5 percent snapshot reserve as used inside the volume, but Total Physical Used is what really sits on disk. space-allocation enabled means hosts can send UNMAP. On real ONTAP, if it’s disabled, you turn it on with lun modify -space-allocation enabled while the LUN is offline.

✅ Checkpoint: The LUN is thin (space-reserve disabled) with space-allocation enabled.

4Write and delete on a real-looking Linux host, then reclaim

Give lun1 to linux1 over iSCSI. In the cluster terminal, add an iSCSI LIF on each node, an igroup with linux1’s IQN, and the mapping:

vserver iscsi create -vserver svm1
network interface create -vserver svm1 -lif svm1_iscsi1 -service-policy default-data-iscsi -home-node saat-cluster-01 -home-port e0d -address 192.168.56.131 -netmask 255.255.255.0
network interface create -vserver svm1 -lif svm1_iscsi2 -service-policy default-data-iscsi -home-node saat-cluster-02 -home-port e0d -address 192.168.56.132 -netmask 255.255.255.0
lun igroup create -vserver svm1 -igroup ig_linux1 -protocol iscsi -ostype linux -initiator iqn.2004-10.com.ubuntu:01:5a7e1a2b3c4d
lun mapping create -vserver svm1 -path /vol/vol_thin1/lun1 -igroup ig_linux1

Each command returns to the prompt with no message when it works. Now open a second terminal and start the Linux client with python ontapsim.py --host linux1. Log in to the target and look at the new disk:

iscsiadm -m discovery -t sendtargets -p 192.168.56.131
iscsiadm -m node --login
multipath -ll
lsblk -D /dev/sdb

You should see this:

root@linux1:~# iscsiadm -m discovery -t sendtargets -p 192.168.56.131
192.168.56.131:3260,1034 iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3
192.168.56.132:3260,1035 iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3
root@linux1:~# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3, portal: 192.168.56.131,3260]
Logging in to [iface: default, target: iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3, portal: 192.168.56.132,3260]
Login to [iface: default, target: iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3, portal: 192.168.56.131,3260] successful.
Login to [iface: default, target: iqn.1992-08.com.netapp:sn.c84b2d40ac3f32ca940fcb7e13e6d933:vs.3, portal: 192.168.56.132,3260] successful.
root@linux1:~# multipath -ll
3600a098062686b727378343378416f54 dm-1 NETAPP,LUN C-Mode
size=4T features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 30:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 31:0:0:0 sdc 8:32 active ready running
root@linux1:~# lsblk -D /dev/sdb
NAME                                DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sdb                                        0        4K       4G         0
└─3600a098062686b727378343378416f54        0        4K       4G         0

The host sees a 4 TB disk even though the volume holds almost nothing. lsblk -D matters here: a non-zero DISC-GRAN and DISC-MAX mean the LUN accepts discard (UNMAP), which is what space-allocation enabled gives you. If both columns were 0, fstrim would fail with “the discard operation is not supported”.

Your WWID (the long name starting 3600a098) will be different from ours, so copy it from your own multipath -ll output. Make a file system, mount it and write 3 GiB:

mkfs.xfs /dev/mapper/<your-WWID>
mkdir -p /data
mount /dev/mapper/<your-WWID> /data
dd if=/dev/urandom of=/data/load1.bin bs=1M count=3072
df -h /data

You should see this (the mkfs.xfs details are trimmed):

Discarding blocks...Done.
...
root@linux1:~# mkdir -p /data
root@linux1:~# mount /dev/mapper/3600a098062686b727378343378416f54 /data
root@linux1:~# dd if=/dev/urandom of=/data/load1.bin bs=1M count=3072
3072+0 records in
3072+0 records out
3221225472 bytes (3.2 GB, 3.0 GiB) copied, 6.4 s, 503 MB/s
root@linux1:~# df -h /data
Filesystem                                    Size  Used Avail Use% Mounted on
/dev/mapper/3600a098062686b727378343378416f54  4.0T   13G  4.0T   1% /data

Back in the cluster terminal, see what that cost on the storage side:

lun show -vserver svm1 -path /vol/vol_thin1/lun1 -fields size,size-used,space-reserve,space-allocation
volume show -vserver svm1 -volume vol_thin1 -fields size,used

You should see this:

vserver path                size size-used space-reserve space-allocation
------- ------------------- ---- --------- ------------- ----------------
svm1    /vol/vol_thin1/lun1 4TB  12.70GB   disabled      enabled
saat-cluster::> volume show -vserver svm1 -volume vol_thin1 -fields size,used
vserver volume    size used
------- --------- ---- -------
svm1    vol_thin1 6TB  14.54GB

A 4 TB LUN that uses 12.70 GB: the 3 GiB file plus the XFS metadata. Now delete the file on linux1 and trim:

rm /data/load1.bin
df -h /data
fstrim -v /data

You should see this:

root@linux1:~# rm /data/load1.bin
root@linux1:~# df -h /data
Filesystem                                    Size  Used Avail Use% Mounted on
/dev/mapper/3600a098062686b727378343378416f54  4.0T  9.8G  4.0T   1% /data
root@linux1:~# fstrim -v /data
/data: 4086 GiB (4387493747937 bytes) trimmed

Run the two cluster commands again:

vserver path                size size-used space-reserve space-allocation
------- ------------------- ---- --------- ------------- ----------------
svm1    /vol/vol_thin1/lun1 4TB  9.70GB    disabled      enabled
saat-cluster::> volume show -vserver svm1 -volume vol_thin1 -fields size,used
vserver volume    size used
------- --------- ---- -------
svm1    vol_thin1 6TB  11.54GB

The LUN dropped from 12.70 GB to 9.70 GB used, and the volume gave the 3 GB back to the aggregate. Without the trim, ONTAP would still count the deleted file, because only the host knows those blocks are free. On real hosts, Ubuntu and RHEL run fstrim.timer once a week; check it with systemctl status fstrim.timer.

Terminal on linux1 running fstrim and the ONTAP view showing lun1 used dropping to 9.70 GB
After rm and fstrim on linux1, the LUN drops from 12.70 GB to 9.70 GB used on ONTAP.

✅ Checkpoint: After fstrim, lun show reports less size-used than before the rm.

linux1 host mode: fstrim gives deleted blocks back to the thin LUN
Delete, trim, and the LUN shrinks on the storage side.

Break It, Then Fix It

Now let the overbooked plane fill up. Other volumes on the aggregate grow until it’s 98 percent full.

1Fill the aggregate and write to a thin volume

simctl break aggr-fill aggr1_01 98
simctl write svm1 vol_thin2 200g
volume show -vserver svm1 -volume vol_thin2 -fields used,available,state

You’ll get this:

simctl: write failed. The client sees "No space left on device" (ENOSPC). Aggregate aggr1_01 is full (thin volume vol_thin2 could not get blocks).
saat-cluster::> volume show -vserver svm1 -volume vol_thin2 -fields used,available,state
vserver volume    used   available state
------- --------- ------ --------- ------
svm1    vol_thin2 1.84GB 180.3GB   online

The volume is 6 TB, holds 1.84 GB, and still the write fails. Its “available” is really the aggregate’s free space, and that ran out. Users and app teams will swear the volume is nearly empty, and they’re right.

Practice shell: a thin volume write fails because the aggregate is full
The volume looks nearly empty; the aggregate is full.

2Find the real cause

storage aggregate show -aggregate aggr1_01 -fields size,usedsize,availsize,percent-used
event log show -severity <=ERROR

You’ll see this:

aggregate size   usedsize availsize percent-used
--------- ------ -------- --------- ------------
aggr1_01  8.80TB 8.63TB   180.3GB   98%
saat-cluster::> event log show -severity <=ERROR
Time                Node             Severity      Event
------------------- ---------------- ------------- ------------------------
11/7/2026 07:07:30  saat-cluster-01  ERROR         monitor.volume.full / wafl.aggr.full: Aggregate aggr1_01 is full

3Fix it

simctl fix aggr-fill
storage aggregate show -aggregate aggr1_01 -fields percent-used

In the lab the fault simply goes away. On a real cluster you’d free space fast (delete old snapshots, move a volume to another aggregate with volume move, or add disks), and then review the overcommit so it doesn’t happen again.

✅ Checkpoint: The aggregate is back below 30 percent used.

This happened at work

Overbooked in Hubballi

A dairy cooperative in Hubballi ran its billing, milk collection and VMware servers on one ONTAP aggregate. Everything was thin, which let them start small, and over two years the overcommit crept up to about 210 percent without anyone writing the number down.

One night a new backup job wrote full copies of the VMware datastores to a thin volume on the same aggregate. By 2 a.m. the aggregate was full, two datastore LUNs went offline, and the milk collection app stopped syncing from the village centres.

The on-call engineer deleted the half-written backup data and old snapshots, brought the LUNs online, and VMware recovered by morning. Afterwards they moved the backup target to its own aggregate, turned on space-allocation for the LUNs, set alerts at 80 and 90 percent, and agreed a 150 percent overcommit ceiling that is checked every month.

Common mistakes and troubleshooting

MistakeWhat happensDo this instead
No one tracks overcommitThe aggregate fills by surpriseSum thin volume sizes per aggregate and review monthly
Alerting on volume used % onlyThin volumes look empty while the aggregate is fullAlert on aggregate used % (80 / 90)
Fractional reserve 100% on thick LUN volumesVolume needs double the LUN size once snapshots existSet 0 and use autosize and snapshot autodelete
space-allocation off on thin LUNsNo UNMAP, and LUNs go offline when space runs outEnable it (LUN offline briefly) and test UNMAP from the host
Backup copies on the same thin aggregate as productionOne big job fills space for everyonePut backup targets on separate aggregates or clusters
Thick everything “to be safe”Wasted capacity and early hardware purchasesThin by default; thick only where an app truly needs it

Interview questions

Click a question to open it. Each one is written the way an interviewer would ask it. Under it you will see why they ask it and one way you could answer, in your own words.

Fresher level

1. What’s the difference between a thick and a thin volume in ONTAP?

Why they ask this: They want to check you understand the basic space model.

How you might answer: A thick volume, space-guarantee volume, reserves its whole size in the aggregate when it’s created. A thin volume, space-guarantee none, only uses aggregate space as data is written, so you can create more volume capacity than the aggregate has.

2. A thin volume shows lots of free space but writes fail with “No space left on device”. Why?

Why they ask this: They’re checking you know where the real limit is.

How you might answer: For a thin volume, the real limit is the aggregate. If the aggregate is full, the volume can’t get blocks even though its own size says there’s room. I’d check storage aggregate show and the event log for an aggregate full message.

2–5 years experience

3. What is fractional reserve and how would you set it today?

Why they ask this: They want to see you understand an older setting that still causes surprises.

How you might answer: It’s extra space a volume keeps so overwrites to a thick LUN succeed while snapshots hold the old blocks. At 100 percent it can need as much space as the LUN again. Today I’d set it to 0 and protect the volume with autosize and snapshot autodelete instead.

4. Why turn on space-allocation for a thin LUN?

Why they ask this: They’re testing knowledge of UNMAP and the out-of-space behaviour.

How you might answer: It tells the host the LUN is thin, so the host can send UNMAP and give deleted blocks back to the aggregate, with fstrim on Linux or ReTrim on Windows. It also means that if the volume runs out, the host gets a write error instead of ONTAP taking the LUN offline.

Senior level

5. How would you set and enforce an overcommit policy for a storage estate?

Why they ask this: They want to see you manage risk with numbers and process, not luck.

How you might answer: I’d agree a maximum ratio per tier with the business, say 150 percent for general workloads and less for critical ones, and report it per aggregate every month. Alerts fire at 80 and 90 percent used, and we keep a ranked list of volumes we can move quickly.

Any new large request is checked against the ratio before we say yes.

6. An aggregate hits 98 percent at 2 a.m. Walk me through your response.

Why they ask this: They’re checking calm, ordered incident handling.

How you might answer: First I stop the growth: find the volume that’s growing with the volume and aggregate space commands, and pause the job if I can. Then I free space quickly, old snapshots first, and if that’s not enough, start a volume move to another aggregate.

I bring any offline LUNs back online, tell the app teams, and next day fix the cause and the alerting.

Quick quiz

Q1. Which volume setting makes a volume thin?

  1. -space-guarantee volume
  2. -space-guarantee none
  3. -space-reserve enabled
  4. -fractional-reserve 100
Show answer

B — space-guarantee none means thin.

Q2. Three 6 TB thin volumes sit on a 9 TB aggregate. What is the overcommit?

  1. 50%
  2. 100%
  3. 200%
  4. 300%
Show answer

C — 18 TB promised on 9 TB is 200 percent.

Q3. What lets a Linux host give deleted blocks back to ONTAP?

  1. fsck
  2. fstrim with space-allocation enabled
  3. mkfs
  4. multipath -ll
Show answer

B — UNMAP needs space-allocation on the LUN and fstrim or discard on the host.

Q4. For a thin volume, where is the real space limit?

  1. The qtree
  2. The volume size
  3. The aggregate
  4. The LIF
Show answer

C — thin volumes take blocks from the aggregate as they write.

Q5. What is the usual modern setting for fractional reserve?

  1. 0 with autosize and snapshot autodelete
  2. 100 always
  3. 50
  4. It can’t be changed
Show answer

A — 0, protected by autosize and autodelete.

Quick recap

  • Thick reserves the full size up front; thin uses space as data arrives.
  • Overcommit = total thin size / aggregate size; track it and agree a limit.
  • Alert on aggregate used %, not only on volumes.
  • Fractional reserve 0 plus autosize is the usual design.
  • Enable space-allocation on thin LUNs so hosts can UNMAP.

Next lesson

Lesson 34: Deduplication, compression and compaction → You’ll turn on storage efficiency, scan old data, read the savings, and see why a scan at the wrong time hurts.

Further reading: ONTAP thin provisioning

Want to go deeper into ONTAP thin provisioning? Read NetApp’s ONTAP concepts guide for how aggregates and volumes share space, and try the capacity checks in the Command Builder. You can also see the full plan for this course on the NetApp ONTAP Storage Administration course page.

Scroll to Top

This website uses cookies

We use a few cookies to keep this site working. If you allow it, we also use Google Analytics to count visits so we can improve our lessons. You can accept all, deny the optional ones, or choose what to allow.