Thin provisioning (ESE) and space release
-
Phase 0: Start here
-
Phase 1: The hardware
-
Phase 2: Virtualization
-
Phase 3: Resilience and data protection
-
Phase 4: Generations, models and rack layouts
-
Phase 5: Wrap-up
DS8000 thin provisioning lets you give a server a 2 TB disk while only using the space it has actually written. The DS8000 calls these thin volumes ESE (extent space efficient) volumes, and on a DS8A00 they’re the default, while on FlashCore Module pools they’re the only kind you’re allowed.
Thin provisioning is great right up until a pool fills at 3 a.m. Here you’ll see how ESE volumes take extents only when data gets written, how to read provisioned versus used capacity, what overprovisioning ratios and thresholds protect you from, and how to hand space back with initfbvol -action releasespace.
Phase 2 roadmap: 9 Virtualization → 10 RAID → 11 Ranks and extents → 12 Extent pools → 13 FB and CKD volumes → 14 LSS and LCU → 15 Thin provisioning (you are here) → 16 Easy Tier → 17 Volume groups.
| Time | You need | By the end you can |
|---|---|---|
| 60 minutes | Python 3 and the practice shell in C:\ds8k-lab (set up in Lesson 1) | Create ESE volumes, read provisioned and used capacity, calculate an overprovisioning ratio, release space safely, and explain what happens when a thin pool runs out |
What it is, in one line
An ESE (thin) volume shows the host its full size but only takes extents from the pool when data is written, so a pool can promise more capacity than it physically has.
In Simple Words
A school canteen with meal coupons
The school canteen gives every child a coupon for a full plate of rice, 500 coupons in all, but the cook knows from experience that most children only eat half a plate. So instead of cooking 500 full plates he cooks enough for about 300, serves on demand and makes more as the pot empties, which saves a lot of rice and money.
The danger is a festival day when every child turns up hungry, because if the pot runs empty and nobody noticed in time, children holding coupons get nothing. A good cook keeps an eye on the pot and starts the next batch when it drops to a certain mark, and he never hands out more than, say, three times the coupons the kitchen can really feed.
In storage terms, the coupons are the provisioned capacity and the rice served is the written capacity, while the mark on the pot is the pool threshold and the coupon limit is the overprovisioning ratio limit.
Engineer's View
ESE volumes on DS8A00
- A volume is either fully provisioned (standard) or thin provisioned (ESE). The DS8A00 creates thin volumes by default, and volumes on FlashCore Module drives must be thin.
- A thin volume gets space when a write is destaged from cache into an extent that hasn’t been allocated yet, which is how a volume can be bigger than the free space in its pool.
- The metadata for a thin volume, on the other hand, is allocated for the whole provisioned size when you create the volume, not as data arrives.
- Thin provisioning comes with the Base Function licence and works for both FB and CKD volumes.
- Small (16 MiB) extents are the better choice for thin volumes because space then grows in small steps.
- A few capacity terms: provisioned capacity is what the volumes promise, written capacity is what’s actually used, and the overprovisioned ratio is provisioned divided by usable.
- For pool warnings there are system thresholds at 15% and 0% free, plus your own threshold set with
chextpool -threshold(default 15% free). Pool status can be 0 (above threshold), 1 (at or below threshold) or 10 (no space left), and SNMP trap 223 reports pool capacity warnings. mkextpool/chextpool -opratiolimitputs a cap on the overprovisioning ratio. Once it’s set, the DS8000 blocks volume creation, expansion, migration, rank depopulation, pool merges and turning on Easy Tier space reservation whenever they’d break the limit.- When a pool hits about 100% use it goes write-inhibit, and its Emergency Space Reserve keeps the metadata safe while you add capacity.
- Space release from hosts (SCSI UNMAP, VMware VAAI) only works on ESE volumes with small extents, and FCMs reclaim on track boundaries (64 KB open, 56 KB CKD). Unmap is part of the Base Function licence.
initfbvol -action releasespacefrees every extent of an ESE volume, and all its data is lost.
On DS8900F: ESE works the same way. The older track space efficient (TSE) volumes aren’t supported on G10, so don’t use -sam tse.
How it works, step by step
Let’s follow the space as a software company creates ten 2 TB thin volumes for a new customer platform.
1Create thin volumes
mkfbvol -sam ese creates the volumes and the host sees ten 2,000 GiB disks straight away. The pool only loses a little metadata space, since there’s no data yet.
2The pool now promises more than it has
Ten times 2,000 GiB is 20,000 GiB provisioned, so if the pool holds about 17,700 GiB it’s overprovisioned at roughly 1.13 : 1. That’s fine as long as the hosts never write everything at once.
3Writes allocate extents
When a host writes and the data is destaged from cache to an extent that isn’t allocated yet, the DS8000 gives that volume one extent from the pool. With 16 MiB extents a 500 GiB write takes 32,000 extents, and the rest of the 2,000 GiB stays unallocated.
4Watch provisioned, used and available
You keep an eye on three numbers: provisioned capacity (what you promised), used capacity (what’s been written) and available capacity (what’s left). Your job is to make sure available never gets to zero.
5Thresholds warn you early
When free space falls below the pool threshold, the pool status changes and an SNMP trap goes out, and in lsextpool the status column switches from below to exceeded. That’s your signal to add ranks, move volumes or free up space while there’s still time.
6Overprovisioning limits stop runaway promises
A ratio limit such as -opratiolimit 3 means the pool will never promise more than three times its usable capacity. Any new volume, expansion or migration that would cross that line is refused, so a busy team can’t quietly push the ratio up to 10 : 1.
7Space comes back in two ways
Hosts can give space back on their own. When a host deletes data and sends SCSI UNMAP (VMware does this through VAAI space release), the DS8000 frees the space, though only on ESE volumes with small 16 MiB extents, and FCM drives can even reclaim on a 64 KB track boundary for open systems.
If you want a whole volume’s space back in one go, you use initfbvol -action releasespace, which throws away everything on that volume. Use it for scratch, test and decommissioned volumes and never for live data.
If a pool does get to about 100%, writes to its thin volumes stop. The Emergency Space Reserve protects the metadata, but applications get write errors until someone adds space.
Hands-on lab: thin volumes, pool numbers and space release
Before you run any command, double-check it
Read every command twice before you press Enter. Check the target: the system or account, the IDs, the names and the sizes. These commands are for learning and were tested in our lab, not on your system. At work, run the read-only list 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.
In this lab you create ten thin volumes, write data to a few of them, read the pool numbers, release some space and set a ratio limit. Start in C:\ds8k-lab (shell setup is in Lesson 1).
Practice shell note: the practice shell is our own teaching tool, not IBM software, and real DS CLI output looks very close to this without being identical. Lines starting with SIM come from the shell’s simctl commands, which pretend to be host writes, and CMUN02041E is a practice shell message. The initfbvol messages are the ones IBM shows in its Redbook.
1Build one pool with a setup script
Save this as C:\ds8k-lab\setup-15.txt, run simctl reset and quit in the shell, and then run the script and log in again:
mkarray -raidtype 6 -arsite S7
mkrank -array A0 -keygrp 1 -stgtype fb
mkextpool -rankgrp 0 -keygrp 1 -stgtype fb thin_0
chrank -extpool P0 R0Run this:
python ds8sim.py -hmc1 10.0.0.1 -user admin -passwd YourPassw0rd -script setup-15.txt
python ds8sim.py✅ Checkpoint: The script ends with “chrank: Rank R0 successfully modified”.
2Create ten 2,000 GiB thin volumes
Type these at the dscli> prompt:
mkfbvol -extpool P0 -cap 2000 -sam ese -name app_#h 2000-2009
lsextpool -lYou should see this:
dscli> mkfbvol -extpool P0 -cap 2000 -sam ese -name app_#h 2000-2009
CMUC00025I mkfbvol: FB volume 2000 successfully created.
CMUC00025I mkfbvol: FB volume 2001 successfully created.
...
CMUC00025I mkfbvol: FB volume 2009 successfully created.
dscli> lsextpool -l
Date/Time: 24 October 2026 11:23:35 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols totalLogicalCap(MiB/cyl) usedLogicalCap(MiB/cyl) provisionedCap(MiB/cyl) totalPhysicalCap(MiB/cyl) usedPhysicalCap(MiB/cyl)
====================================================================================================================================================================================================================
thin_0 P0 fb 0 below 17701 0 1132901 64 10 18127440 1024 20480000 18127441 1024You’ve just created 20,000 GiB of volumes in a pool of about 17,700 GiB and availstor hasn’t moved, which is thin provisioning in action. (The ten success lines are shortened with “…”.)
The columns on the far right are the ones to read. provisionedCap is 20,480,000 MiB, the promise made to the hosts, totalLogicalCap is 18,127,440 MiB, what the pool really holds, and usedLogicalCap is only 1,024 MiB, the shell’s small reserve. Divide provisioned by total and you get the overprovisioning ratio, about 1.13.
✅ Checkpoint: numvols is 10, but %allocated is still 0.
3Write data and watch the pool
simctl write pretends a host wrote this many GiB to a volume.
Type these at the dscli> prompt:
simctl write 2000 500
simctl write 2001 300
lsextpool
showfbvol 2000You should see this:
dscli> simctl write 2000 500
SIM0102I simctl: volume 2000 now has 32000 allocated extents (500 GiB written).
dscli> simctl write 2001 300
SIM0102I simctl: volume 2001 now has 19200 allocated extents (300 GiB written).
dscli> lsextpool
Date/Time: 24 October 2026 11:23:35 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols
========================================================================================
thin_0 P0 fb 0 below 16901 5 1081701 64 10
dscli> showfbvol 2000
Date/Time: 24 October 2026 11:23:35 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name app_2000
...
exts 128000
...
cap (2^30B) 2000.0
...
sam ESE
...
realextents 32000
virtualextents 201
realcap (MiB) 512000
...You wrote 800 GiB, and availstor dropped by exactly 800 GiB to 16,901, with %allocated now at 5.
In showfbvol (shortened), exts 128000 is the full 2,000 GiB in 16 MiB extents, while realextents 32000 is what’s actually allocated, 500 GiB or a realcap of 512,000 MiB. sam ESE confirms it’s thin, and virtualextents is the shell’s metadata count for the full size.
✅ Checkpoint: availstor dropped to 16,901 and realextents is 32,000.
4Release a scratch volume’s space
Volume 2001 held a test load nobody needs any more. Without -quiet the DS CLI asks you to confirm with Y first and warns that all data on the volume will be lost, but you add -quiet here because the decision’s already made.
Type these at the dscli> prompt:
initfbvol -action releasespace -quiet 2001
lsextpoolYou should see this:
dscli> initfbvol -action releasespace -quiet 2001
CMUC00340I initfbvol: 2001: The command releasespace has completed successfully.
dscli> lsextpool
Date/Time: 24 October 2026 11:23:35 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols
========================================================================================
thin_0 P0 fb 0 below 17201 3 1100901 64 10The data on 2001 is gone for good. The volume itself still exists and still looks like 2,000 GiB to the host, but its 300 GiB of extents are back in the pool, and availstor went up from 16,901 to 17,201.
✅ Checkpoint: availstor is back up to 17,201.

5Set an overprovisioning limit
Type this at the dscli> prompt:
chextpool -opratiolimit 1.5 P0You should see this:
dscli> chextpool -opratiolimit 1.5 P0
CMUC00001I chextpool: Extent pool P0 successfully modified.On a real DS8000, P0 can now promise at most 1.5 times its usable capacity, and any new volume, expansion or migration that would go past that gets refused. The practice shell accepts the setting without enforcing it, so use the calculator below to see the effect.
✅ Checkpoint: chextpool reports CMUC00001I.
6Watch the ratio and the runway every day
Pools don’t fill up in one go, they fill a bit every day. So rather than doing a one-off sum, you’ll build the kind of small watcher storage teams really run. Once a day it reads lsextpool -l through the DS CLI, adds a line per pool to a CSV history and works out the overprovisioning ratio and the runway from real growth.
Save it on your laptop as C:\ds8k-lab\thin_calc.py, next to ds8sim.py. It runs on the laptop, not on the DS8000.
A script can’t answer password prompts, so you first save your password in a password file. If security.dat and auto.profile are already in your lab folder from an earlier lesson, skip this bit (the shell would only say the record already exists).
Run this (PowerShell, with your own password both times):
python ds8sim.py -hmc1 10.0.0.1 -user admin -passwd YourPassw0rd managepwfile -action add -name admin -pw YourPassw0rd -pwfile security.datYou should see this:
CMUC00206I managepwfile: Record 10.0.0.1/admin successfully added to password file security.dat.Then save these eight lines as auto.profile in the same folder. With banner: off, header: on and format: delim, every list comes back as one header row followed by comma-separated rows, which Python reads easily. Implementation Lesson 2 covers profiles in full.
auto.profile:
hmc1: 10.0.0.1
username: admin
pwfile: security.dat
devid: IBM.2107-78SV001
banner: off
header: on
format: delim
delim: ,The script:
# thin_calc.py - daily thin-pool watcher: overprovisioning ratio and runway from real growth
# Runs on your workstation or jump server, not on the DS8000.
# It talks to the DS8000 only through the DS CLI (auto.profile: banner off, header on, format delim).
import csv, datetime, os, subprocess, sys
DSCLI = ["python", "ds8sim.py", "-cfg", "auto.profile"] # at work: ["dscli", "-cfg", "auto.profile"]
def dscli(*args):
"""Run one DS CLI command and return its rows as dictionaries."""
out = subprocess.run(DSCLI + list(args), capture_output=True, text=True).stdout
lines = [l for l in out.splitlines() if l and not l.startswith("SaatVedha") and not l.startswith("CMUC")]
return list(csv.DictReader(lines))
HISTORY = "thin_history.csv" # one row per pool per day, kept on the jump server
RATIO_LIMIT = 1.5 # what you set with chextpool -opratiolimit (lsextpool doesn't list it)
# --date is for the lab only, to pretend days have passed. At work the scheduler just runs it daily.
today = sys.argv[sys.argv.index("--date") + 1] if "--date" in sys.argv else datetime.date.today().isoformat()
# 1. Today's numbers from the DS8000, appended to the history (once per pool per day)
old = []
if os.path.exists(HISTORY):
with open(HISTORY, newline="") as f:
old = list(csv.DictReader(f))
pools = dscli("lsextpool", "-l")
new = [{"date": today, "pool": p["ID"], "total": p["totalLogicalCap(MiB/cyl)"],
"used": p["usedLogicalCap(MiB/cyl)"], "provisioned": p["provisionedCap(MiB/cyl)"]}
for p in pools if not any(h["date"] == today and h["pool"] == p["ID"] for h in old)]
with open(HISTORY, "a", newline="") as f:
w = csv.DictWriter(f, fieldnames=["date", "pool", "total", "used", "provisioned"])
if not old:
w.writeheader()
w.writerows(new)
history = old + new
# 2. Ratio and runway for every pool
for p in pools:
unit, div = ("GiB", 1024) if p["stgtype"] == "fb" else ("cyl", 1) # FB columns are MiB, CKD are cylinders
total = int(p["totalLogicalCap(MiB/cyl)"]) / div
used = int(p["usedLogicalCap(MiB/cyl)"]) / div
prov = int(p["provisionedCap(MiB/cyl)"]) / div
warn = int(dscli("showextpool", p["ID"])[0]["%threshold"]) / 100
ratio = prov / total # overprovisioning ratio = provisioned / usable
print(f"{today} {p['ID']} {p['Name']}: {used:,.0f} of {total:,.0f} {unit} used ({100*used/total:.0f}%), "
f"{prov:,.0f} {unit} provisioned")
print(f" Overprovisioning ratio: {ratio:.2f} : 1 (limit {RATIO_LIMIT}, room for "
f"{total*RATIO_LIMIT - prov:,.0f} {unit} more volumes)")
day = lambda h: datetime.date.fromisoformat(h["date"])
mine = sorted((h for h in history if h["pool"] == p["ID"]), key=day)
last = mine[-1]
first = [h for h in mine if (day(last) - day(h)).days <= 30][0] # growth over the last 30 days at most
days = (day(last) - day(first)).days
if days == 0:
print(f" Runway: first sample saved in {HISTORY}; run again tomorrow to measure growth")
continue
growth = (int(last["used"]) - int(first["used"])) / div / days # real growth per day from the history
if growth <= 0:
print(f" Growth over {days} days: none, no runway to worry about")
continue
print(f" Growth: {growth:,.0f} {unit}/day over {days} days")
print(f" Days until the {warn:.0%} warning: {(total*warn - used)/growth:.0f} | "
f"days until full: {(total - used)/growth:.0f}")The ratio is provisionedCap / totalLogicalCap and the runway is the space left divided by growth per day. It’s the same maths you’d do on paper, only with numbers straight from the box, and the warning level comes from %threshold in showextpool.
You can’t wait five days in a lab, so --date lets you pretend. It’s only a practice switch, and at work the scheduler runs the script every morning.
Run this (day 1):
python thin_calc.py --date 2026-11-01You should see this:
2026-11-01 P0 thin_0: 501 of 17,703 GiB used (3%), 20,000 GiB provisioned
Overprovisioning ratio: 1.13 : 1 (limit 1.5, room for 6,554 GiB more volumes)
Runway: first sample saved in thin_history.csv; run again tomorrow to measure growthA single sample can’t show growth, so the script saves it and waits. Now pretend five days of host writes, 600 GiB onto volume 2002 at 120 GiB a day.
Type this at the dscli> prompt:
simctl write 2002 600You should see this:
dscli> simctl write 2002 600
SIM0102I simctl: volume 2002 now has 38400 allocated extents (600 GiB written).Run this (day 6):
python thin_calc.py --date 2026-11-06You should see this:
2026-11-06 P0 thin_0: 1,101 of 17,703 GiB used (6%), 20,000 GiB provisioned
Overprovisioning ratio: 1.13 : 1 (limit 1.5, room for 6,554 GiB more volumes)
Growth: 120 GiB/day over 5 days
Days until the 85% warning: 116 | days until full: 138The ratio is 1.13 : 1 and the 1.5 limit still leaves room for 6,554 GiB more volumes. The runway is what you need to watch: at 120 GiB a day this pool reaches the 85% warning in about four months and is full 22 days later. With only 22 days between “warning” and “out of space”, the threshold has to trigger real action rather than just an email.
Open thin_history.csv in Excel and you can chart the pool’s growth without any other tools. At work, Task Scheduler or cron on the jump server runs python thin_calc.py (with dscli instead of ds8sim.py) every morning and mails the output, so the history builds up by itself and the runway always reflects this month’s real growth.
✅ Checkpoint: Your second run prints 1.13 : 1, 120 GiB/day and 138 days until full.
Type quit when you’re done.
Break It, Then Fix It
Thin pools tend to go wrong in two ways: they run out, or someone tries to “release” the wrong kind of volume. Keep the shell from the lab open.
1Break it: fill the pool, then write more
simctl poolfill pretends other volumes have filled the pool to 90%, and then a host tries to write 2,000 GiB to volume 2002.
Type these at the dscli> prompt:
simctl poolfill P0 90
lsextpool
simctl write 2002 2000You’ll get this:
dscli> simctl poolfill P0 90
SIM0109I simctl: extent pool P0 is now 90% allocated (113291 extents available).
dscli> lsextpool
Date/Time: 24 October 2026 11:29:12 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols
==========================================================================================
thin_0 P0 fb 0 exceeded 1770 90 113291 64 10
dscli> simctl write 2002 2000
SIM0005E simctl write: extent pool P0 has no free extents. The host write fails (out of space). Free space with initfbvol -action releasespace, delete volumes or add a rank.
You got two warnings before it failed. status exceeded means the pool is past its 85% threshold, and availstor 1770 shows only 1,770 GiB left. The host still had a 2,000 GiB disk, so it tried to write 2,000 GiB and the pool couldn’t back that promise. (SIM lines are practice shell messages; on a real DS8000 the host gets write errors and the pool goes write-inhibit near 100%.)
To fix it, free up space you can safely give away and then retry:
initfbvol -action releasespace -quiet 2000
simctl write 2002 2000
lsextpoolYou should see this:
dscli> initfbvol -action releasespace -quiet 2000
CMUC00340I initfbvol: 2000: The command releasespace has completed successfully.
dscli> simctl write 2002 2000
SIM0102I simctl: volume 2002 now has 128000 allocated extents (2000 GiB written).
dscli> lsextpool
Date/Time: 24 October 2026 11:29:13 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols
==========================================================================================
thin_0 P0 fb 0 exceeded 270 98 17291 64 10In the lab, volume 2000 was a test load, so releasing its 500 GiB was enough. Look at what you’re left with, though: 98% allocated and 270 GiB free, which isn’t a fix so much as borrowed time. At work the real fixes are adding ranks to the pool, moving volumes to another pool or deleting volumes nobody uses, and they should happen at the threshold rather than at 98%.
✅ Checkpoint: volume 2002 now has 128,000 allocated extents.
2Break it: release space on a standard volume
A colleague creates a fully provisioned volume and later tries to shrink its footprint the “thin” way.
Type these at the dscli> prompt:
mkfbvol -extpool P0 -cap 100 -name std_#h 2010
initfbvol -action releasespace -quiet 2010You’ll get this error:
dscli> mkfbvol -extpool P0 -cap 100 -name std_#h 2010
CMUC00025I mkfbvol: FB volume 2010 successfully created.
dscli> initfbvol -action releasespace -quiet 2010
CMUN02041E initfbvol: 2010: The volume is not a space efficient (ESE) volume.Why: a standard volume took all its extents when it was created and keeps them, because space release only exists for ESE volumes. (Practice shell message text.) What you do next depends on what you want. If the data isn’t needed, delete the volume with rmfbvol, and if you want thin behaviour, create it with -sam ese next time.
Notice too that creating 2010 needed 100 GiB of real extents from a pool that only had 270 GiB left, so fully provisioned volumes in a nearly full thin pool make things worse.
✅ Checkpoint: You can explain why initfbvol refused volume 2010.
This happened at work
Three hundred percent, and nobody watching
A SaaS company sold an HR and payroll platform to mid-sized firms, and every new customer got a set of thin volumes on the company’s DS8000, 4 TB each, “because it costs nothing until they use it”. After two years one pool pair had promised about 300% of its usable capacity. Most customers only used a fraction of their space, so for a long time nothing happened. The pool threshold had been set, but its SNMP traps were going to a monitoring server that had been retired months earlier.
On the last working day of the month, at 1:40 a.m., payroll runs for dozens of customers kicked off together, each one writing big temporary files and reports, and the pool went from 88% to full in under two hours. By 3:15 a.m. writes to every thin volume in that pool were failing. Databases for over forty customers crashed or went read-only, and payroll for thousands of employees stopped halfway through.
Impact: roughly four hours of outage for those customers, emergency calls with IBM and service credits paid out that month.
Root cause: overprovisioning with no ratio limit, warnings going nowhere, and nobody tracking how fast written capacity was growing ahead of month-end.
Fix that night: the team released space on a batch of old test volumes, deleted the volumes of two decommissioned customers and migrated a few large volumes to a quieter pool. The following week they added ranks, set -opratiolimit on every pool, pointed traps and alerts at the live monitoring system and started a weekly report of written capacity per pool.
Lesson: thin provisioning moves the risk from the day you buy to some random night. Set a ratio limit, make sure threshold alerts reach a real person, and plan for the busiest day instead of the average one.
Common mistakes and troubleshooting
| Symptom | Likely cause | What to check / fix |
|---|---|---|
| Pool status exceeded | Free space below the threshold | Add ranks, or move or delete volumes, straight away, and check lsextpool daily. |
| Host writes fail on thin volumes | Pool out of extents (write-inhibit near 100%) | Free space immediately, then fix the plan and set up alerts. |
| Nobody saw the pool warnings | SNMP traps or alerts going to an old address | Test that traps get delivered and check trap 223 handling end to end. |
| initfbvol says the volume is not ESE | Standard (fully provisioned) volume | Space release only works on ESE volumes, so delete or recreate the volume. |
| Host deleted files but pool didn’t shrink | No UNMAP from the host, or large extents | Turn on host space release, and remember UNMAP only works on ESE volumes with 16 MiB extents. |
| Volume creation refused in a pool with space | Overprovisioning ratio limit reached | Check the pool’s ratio, then add capacity or raise the limit after a review. |
| Someone wants -sam tse | Old habit from earlier DS8000 models | Track space efficient volumes aren’t supported on G10, so use ESE. |
The number that matters most isn’t how full the pool is today but how fast written capacity is growing. Track it weekly and you’ll see a crisis coming months before it lands.
Interview questions
Click a question to open it. Each is phrased the way an interviewer might ask it, and underneath you’ll find why they ask it and one way to answer in your own words.
Fresher level
1. What is thin provisioning on a DS8000, and what’s an ESE volume?
Why they ask this: They want the basic idea and IBM’s name for it.
How you might answer: Thin provisioning means a volume shows the host its full size but only takes extents from the pool when data is actually written. On the DS8000 a thin volume is called an ESE (extent space efficient) volume, and you create it with mkfbvol -sam ese.
On a DS8A00 thin is the default, and FlashCore Module pools won’t accept anything else.
2. What’s the risk of thin provisioning?
Why they ask this: They want to hear that you see both sides.
How you might answer: The pool can promise more than it physically has, so if hosts write more than expected it can run out, and then writes to every thin volume in that pool fail.
That’s why you need thresholds, alerts that reach a person, an overprovisioning limit and somebody watching the growth.
2–5 years experience
3. How would you monitor a thin pool day to day?
Why they ask this: They’re checking your practical habits, not only definitions.
How you might answer: I’d check lsextpool for status, %allocated and availstor, and showextpool for provisioned against total capacity so I know the overprovisioning ratio. The pool threshold raises SNMP trap 223, so I’d make sure those traps reach our monitoring and whoever’s on call.
I’d also track written capacity week by week, because the growth rate tells me how many days of runway I’ve really got.
4. A thin pool is at 97% at 2 a.m. What do you do, in order?
Why they ask this: It’s a pressure scenario and they want calm, ordered steps.
How you might answer: First I’d stop the bleeding by freeing space I can safely give up, like old test or decommissioned volumes, using initfbvol -action releasespace or rmfbvol once the owners confirm. If I can, I’d migrate a large volume to another pool that has room.
Then I’d add capacity, more ranks for example, as soon as possible, and afterwards fix the cause with a ratio limit, working alerts and a growth report. I’d also let the application teams know so they can hold back heavy jobs if needed.
Senior level
5. How do you choose an overprovisioning ratio limit for a pool?
Why they ask this: Senior people are expected to turn risk into a number they can defend.
How you might answer: I’d start from history: how much of their provisioned space the hosts really write, how fast that grows and how spiky it gets, month-end batch for instance. Then I’d pick a limit where even a bad day stays under the threshold, and go lower for pools with critical workloads.
The DS8000 enforces it through -opratiolimit, blocking new volumes, expansions, migrations and pool merges that would break it, and I’d review the limit any time the pool size changes.
6. Why does extent size matter for thin provisioning on a DS8000?
Why they ask this: They want you to connect extent design with space efficiency.
How you might answer: Thin volumes allocate a whole extent at a time. With 16 MiB extents the allocated space stays close to what’s really been written, but with 1 GiB extents scattered writes can claim whole gigabytes.
On top of that, host space release with UNMAP only works on ESE volumes with small extents, so for thin pools I’d always go with 16 MiB extents.
Quick quiz
Q1. When does an ESE volume take extents from its pool?
- When it is created
- When data is written (destaged)
- When it is mapped to a host
- Never
Show answer
B: space is allocated on write, when data is destaged from cache.
Q2. Which flag creates a thin FB volume?
- -sam standard
- -sam tse
- -sam ese
- -thin
Show answer
C: -sam ese creates an extent space efficient (thin) volume.
Q3. What does initfbvol -action releasespace do?
- Shrinks a volume
- Frees all extents of an ESE volume and loses its data
- Moves a volume
- Deletes a pool
Show answer
B: it frees every extent of the ESE volume and the data is lost.
Q4. What does -opratiolimit control?
- Pool threshold percent
- Maximum overprovisioning ratio
- Extent size
- RAID level
Show answer
B: it caps the pool’s provisioned capacity divided by usable capacity.
Q5. Which volumes must be thin on DS8A00?
- All CKD volumes
- Volumes on FlashCore Module pools
- Volumes over 4 TiB
- IBM i volumes
Show answer
B: FCM capacity needs thin (ESE) volumes.
Quick recap
- ESE volumes show their full size but only take extents when data is written.
- Thin is the default on DS8A00 and required on FlashCore Module pools.
- Provisioned divided by usable gives you the overprovisioning ratio, and -opratiolimit caps it.
- Pool thresholds and SNMP trap 223 warn you, so make sure someone actually receives them.
- initfbvol -action releasespace frees all extents of an ESE volume and destroys its data.
- Host UNMAP releases space only on ESE volumes with 16 MiB extents.
Next lesson
Lesson 16: Easy Tier: automatic data placement → Next you see how Easy Tier tracks extent heat and moves hot data to the fastest flash tier.
Further reading: DS8000 thin provisioning
Want to go deeper into DS8000 thin provisioning? Section 3.4.4 of IBM’s IBM Storage DS8A00 Architecture and Implementation Guide (IBM Redbooks) covers ESE volumes, capacity controls and overprovisioning limits. For the pools behind them, go back to Lesson 12: DS8000 extent pools.
You can also see the full plan for this course on the IBM DS8000 Architecture course page.
