Extent pools, rank groups and server affinity
-
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 extent pools are where your ranks finally get an owner. A pool gathers the extents of one or more ranks, and as soon as a rank joins a pool it belongs to either server 0 or server 1, so if you get the pools wrong one server ends up doing all the work while the other sits idle.
Back in Lesson 11 you cut arrays into extents, and now those extents go into pools, which is where every volume is carved from. We’ll cover rank groups, why pools nearly always come in pairs, what can and can’t share a pool, and how the DS8000 spreads one volume across several ranks.
Phase 2 roadmap: 9 Virtualization → 10 RAID → 11 Ranks and extents → 12 Extent pools (you are here) → 13 FB and CKD volumes → 14 LSS and LCU → 15 Thin provisioning → 16 Easy Tier → 17 Volume groups.
| Time | You need | By the end you can |
|---|---|---|
| 60 to 75 minutes | Python 3 and the practice shell in C:\ds8k-lab (set up in Lesson 1) | Explain rank groups and server affinity, build a balanced FB pool pair, see a volume striped over two ranks, and estimate pool metadata |
What it is, in one line
An extent pool is a named group of ranks that share the same storage type and extent size, and the pool’s rank group (0 or 1) decides which DS8000 server manages every volume you carve from it.
In Simple Words
Two school canteens
A big school has two canteens, one in the left wing and one in the right, each with its own cook and its own store room. Sacks of rice arrive every morning and the headmaster decides which store room each sack goes to, and once a sack is in the left store room only the left cook uses it.
If the headmaster sends every sack to the left canteen, the left cook is worn out by lunchtime and students queue for ages, while the right cook stands around next to an empty store room. Nothing’s broken, the school is just badly run. Store rooms also keep things tidy, with rice in one and flour in another, because you don’t mix them in one sack.
On a DS8000 the two cooks are server 0 and server 1, the store rooms are extent pools and the sacks are ranks.
You play the headmaster when you pick the rank group of each pool, and rice versus flour is FB versus CKD (or small versus large extents).
Engineer's View
What the Redbook says about pools
- An extent pool groups the extents of a set of ranks, and a volume always takes its extents from one pool. It can’t span two.
- Ranks don’t have a server of their own. They get their affinity when you assign them to a pool, and a rank can belong to only one pool.
- Every pool has three key attributes: server affinity (rank group 0 or 1), extent type (FB or CKD) and encryption group (0 = not encrypted, 1 = encrypted, and there’s one setting for the whole system).
- All the ranks in one server’s pools make up a rank group, so rank group 0 is managed by server 0 and rank group 1 by server 1. On DS8A00 both servers can still reach every drive over the four internal NVMe paths.
- You need a minimum two pools, one per server, and four if you run both FB and CKD (one of each per server). For most systems, one pool pair per storage type gives the best overall performance.
- A pool holds one extent size, and its first rank sets it. Small extents are the default. You can’t mix FCM capacity with other flash in one pool, and pools built on FCM ranks need Easy Tier and take only thin (ESE) volumes.
- Put more than one rank in each pool so volumes can stripe and Easy Tier has room to rebalance, and when a pool is getting full, add several ranks together.
- Striping does carry a risk. If a whole RAID array is lost, every volume striped over that rank is hit, which means the whole pool is affected.
- Emergency Space Reserve: when a pool reaches about 100% use it goes write-inhibit, and a reserved slice keeps the metadata safe while you add space.
On DS8900F: the pool pair design and rank group rules are the same. The FCM rules above come from the DS8A00 Redbook, so check your own system’s documentation before you apply them elsewhere.
How it works, step by step
Say you’re building pools for a new DS8A50 that will host VMware datastores and Oracle databases, all FB.
1Decide the pool layout first
Since it’s FB only, the classic design is one pool pair: an FB pool on rank group 0 and another on rank group 1. If IBM Z joins later you add a CKD pool pair next to it. Write the plan down before you type a single command.
2Create the pools with a rank group
mkextpool -rankgrp 0 -stgtype fb name creates an empty pool for server 0, and -rankgrp 1 gives you one for server 1. The DS8000 numbers pools so the ID tells you the rank group: even IDs (P0, P2) are rank group 0 and odd IDs (P1, P3) are rank group 1.
3Assign ranks, half to each side
chrank -extpool P0 R0 puts a rank into a pool, and from then on that rank shows Group 0 and is managed by server 0. Split your ranks evenly by capacity rather than by count, so each server owns roughly half the space and half the work.
4Volumes take extents from the pool, not from a rank
When you create a volume you name the pool and the DS8000 picks the ranks. By default it rotates extents across all the ranks in the pool, so a big volume ends up spread over every rank and every drive behind them.
5Rotate extents, rotate volumes, or Easy Tier
There are two allocation methods. Rotate extents (storage pool striping) takes each new extent from the next rank in turn, while rotate volumes keeps a volume on one rank until that rank fills up.
These days IBM prefers to let Easy Tier manage extent placement inside the pool, and in a multitier pool striping is always used.
More ranks in a pool means more drives working for every volume.
6Pools grow, merge and warn
You grow a pool by adding ranks. Two pools can be merged if they share the same extent size, drive type, FB or CKD format and server affinity, and the volumes stay online while it happens. When free space drops below the pool’s threshold you get a warning, and at the very end Emergency Space Reserve protects it.
7If a server fails, the other one takes the pool
Rank groups describe normal ownership; they aren’t hard walls. If server 0 fails, server 1 takes over rank group 0 too and hosts keep running (you’ll see this in Lesson 18), and when server 0 comes back, rank group 0 fails back to it.
This is why balance matters every day: if one server already carries most of the load, the other has to be able to carry all of it during a failover.
Hands-on lab: build a balanced extent pool pair
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 build a balanced FB pool pair from four FlashCore Module ranks, create volumes on both servers and watch a single volume spread over two ranks. Start the practice shell in C:\ds8k-lab (setup is in Lesson 1).
Practice shell note: the practice shell is our own teaching tool, not IBM software. Real DS CLI output looks very close to this but isn’t identical. The capacity numbers come from the shell’s own simple formulas (including a pretend FCM compression factor), and CMUN02031E and CMUN02020E are practice shell messages.
1Load four ranks with a setup script
You’ve already made arrays and ranks by hand, so this time a script does it. Create C:\ds8k-lab\setup-12.txt with these lines:
mkarray -raidtype 6 -arsite S1
mkarray -raidtype 6 -arsite S2
mkarray -raidtype 6 -arsite S3
mkarray -raidtype 6 -arsite S4
mkrank -array A0 -keygrp 1 -stgtype fb
mkrank -array A1 -keygrp 1 -stgtype fb
mkrank -array A2 -keygrp 1 -stgtype fb
mkrank -array A3 -keygrp 1 -stgtype fbReset the shell, then run the script from PowerShell (use your own password):
Run this:
python ds8sim.py -hmc1 10.0.0.1 -user admin -passwd YourPassw0rd -script setup-12.txtYou should see this:
SaatVedha DS8000 practice shell — not IBM software. Real DS CLI output looks like this but is not identical.
CMUC00004I mkarray: Array A0 successfully created.
CMUC00004I mkarray: Array A1 successfully created.
CMUC00004I mkarray: Array A2 successfully created.
CMUC00004I mkarray: Array A3 successfully created.
CMUC00007I mkrank: Rank R0 successfully created.
CMUC00007I mkrank: Rank R1 successfully created.
CMUC00007I mkrank: Rank R2 successfully created.
CMUC00007I mkrank: Rank R3 successfully created.In script mode the shell runs one DS CLI command per line and stops at the first error. At work you’ll often build whole systems from scripts like this, because someone can review them before anyone touches the box. Before you run it, type simctl reset at the dscli> prompt and then quit, so you start clean.
✅ Checkpoint: Eight success messages, R0 to R3 created.
2Create the pool pair and split the ranks
Start python ds8sim.py again and log in.
Type these at the dscli> prompt:
mkextpool -rankgrp 0 -keygrp 1 -stgtype fb fcm_fb_0
mkextpool -rankgrp 1 -keygrp 1 -stgtype fb fcm_fb_1
chrank -extpool P0 R0
chrank -extpool P0 R1
chrank -extpool P1 R2
chrank -extpool P1 R3
lsrank
lsextpoolYou should see this:
dscli> mkextpool -rankgrp 0 -keygrp 1 -stgtype fb fcm_fb_0
CMUC00000I mkextpool: Extent pool P0 successfully created.
dscli> mkextpool -rankgrp 1 -keygrp 1 -stgtype fb fcm_fb_1
CMUC00000I mkextpool: Extent pool P1 successfully created.
dscli> chrank -extpool P0 R0
CMUC00008I chrank: Rank R0 successfully modified.
dscli> chrank -extpool P0 R1
CMUC00008I chrank: Rank R1 successfully modified.
dscli> chrank -extpool P1 R2
CMUC00008I chrank: Rank R2 successfully modified.
dscli> chrank -extpool P1 R3
CMUC00008I chrank: Rank R3 successfully modified.
dscli> lsrank
Date/Time: 24 October 2026 11:04:18 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
ID Group State datastate Array RAIDtype extpoolID stgtype
==========================================================
R0 0 Normal Normal A0 6 P0 fb
R1 0 Normal Normal A1 6 P0 fb
R2 1 Normal Normal A2 6 P1 fb
R3 1 Normal Normal A3 6 P1 fb
dscli> lsextpool
Date/Time: 24 October 2026 11:04:18 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols
==========================================================================================
fcm_fb_0 P0 fb 0 below 199152 0 12745728 128 0
fcm_fb_1 P1 fb 1 below 238982 0 15294900 128 0Notice the Group column changed from - to 0 or 1 as each rank joined a pool, which is server affinity being set. P0 (even) is rank group 0 and P1 (odd) is rank group 1.
In availstor you’ll see P1 is bigger than P0, and that’s expected. R0 and R1 sit on S1 and S2, the sites that keep spares (5+P+Q+S), while R2 and R3 are 6+P+Q. reserved 128 is the shell’s 64-extent reserve for each of the two ranks.
The FCM numbers look large because the shell pretends to compress; Lesson 7 explains real FCM capacity.
✅ Checkpoint: Each pool has two ranks: R0, R1 in Group 0 and R2, R3 in Group 1.
3Create volumes on both servers
FCM pools only take thin (ESE) volumes, so you add -sam ese. Even LSS 20 goes in P0 and odd LSS 21 in P1, and simctl write pretends the host has written 20 GiB to volume 2000.
Type these at the dscli> prompt:
mkfbvol -extpool P0 -cap 500 -sam ese -name db_#h 2000-2001
mkfbvol -extpool P1 -cap 500 -sam ese -name db_#h 2100-2101
simctl write 2000 20
showfbvol -rank 2000You should see this:
dscli> mkfbvol -extpool P0 -cap 500 -sam ese -name db_#h 2000-2001
CMUC00025I mkfbvol: FB volume 2000 successfully created.
CMUC00025I mkfbvol: FB volume 2001 successfully created.
dscli> mkfbvol -extpool P1 -cap 500 -sam ese -name db_#h 2100-2101
CMUC00025I mkfbvol: FB volume 2100 successfully created.
CMUC00025I mkfbvol: FB volume 2101 successfully created.
dscli> simctl write 2000 20
SIM0102I simctl: volume 2000 now has 1280 allocated extents (20 GiB written).
dscli> showfbvol -rank 2000
Date/Time: 24 October 2026 11:04:18 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name db_2000
ID 2000
...
extpool P0
exts 32000
...
sam ESE
eam rotateexts
realextents 1280
...
==============Rank extents==============
rank extents capacity (MiB/cyl) metadata
========================================
R0 640 10240 yes
R1 640 10240 noThe showfbvol output is trimmed to the lines that matter (the shell prints about 40). exts 32000 is the full 500 GiB in 16 MiB extents, but realextents 1280 shows only 20 GiB has been allocated so far, because the volume is thin.
The rank table at the bottom is the main thing to look at in this lab. Those 1,280 extents were split 640 and 640 over R0 and R1, which is eam rotateexts (storage pool striping) doing its job: one volume using two ranks and all their drives. metadata yes tells you which rank holds the volume’s metadata.
✅ Checkpoint: The rank table shows 640 extents on R0 and 640 on R1.

4Estimate metadata and check the balance
The Redbook gives a quick formula for metadata overhead in large-extent pools, and that first part is planning maths on paper. The second part asks the box itself, through the DS CLI, how the data drives are split between the two servers.
Save it on your laptop as C:\ds8k-lab\pool_plan.py, next to ds8sim.py. It runs on your 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 tell you 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 is easy for Python to read. 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:
# pool_plan.py - Redbook pool metadata estimate + live server balance check
# 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, math, re, subprocess
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))
# Part 1, planning maths (no DS8000 needed): metadata for large-extent pools (1 GiB / 1113 cyl)
def overhead(volumes, volume_extents, per_meta_extent):
# (number of volumes x 2 + total volume extents / 10) / 64 for FB, / 53 for CKD, rounded up
return math.ceil((volumes * 2 + volume_extents / 10) / per_meta_extent)
print("CKD pool, 700 volumes, 6,190 extents :", overhead(700, 6190, 53), "metadata extents")
print("FB pool, 100 thin volumes, 12,380 ext:", overhead(100, 12380, 64), "metadata extents")
print()
# Part 2, live check: how the data drives split between rank group 0 (server 0) and 1 (server 1)
data = {a["Array"]: int(re.search(r"\((\d+)", a["RAIDtype"]).group(1)) for a in dscli("lsarray", "-l")}
ranks = dscli("lsrank", "-l")
pools = dscli("lsextpool", "-l")
total = sum(data[r["Array"]] for r in ranks if r["extpoolID"] != "-")
for p in pools:
mine = [r for r in ranks if r["extpoolID"] == p["ID"]]
drives = sum(data[r["Array"]] for r in mine)
print(f"{p['ID']} {p['Name']} (rank group {p['rankgrp']}, server {p['rankgrp']}): "
f"{', '.join(r['ID'] for r in mine)}, {drives} data drives, {100*drives/total:.0f}% of capacity, "
f"{int(p['numvols'])} volumes")
LIMIT = 55 # most you accept on one server, in % of data drives
big = max(100 * sum(data[r["Array"]] for r in ranks if r["Group"] == g) / total for g in "01")
print(f"Busiest server has {big:.1f}% of the data drives:", "OK" if big <= LIMIT else f"over {LIMIT}%, rebalance")Run this in a second PowerShell window in C:\ds8k-lab:
python pool_plan.pyYou should see this:
CKD pool, 700 volumes, 6,190 extents : 39 metadata extents
FB pool, 100 thin volumes, 12,380 ext: 23 metadata extents
P0 fcm_fb_0 (rank group 0, server 0): R0, R1, 10 data drives, 45% of capacity, 2 volumes
P1 fcm_fb_1 (rank group 1, server 1): R2, R3, 12 data drives, 55% of capacity, 2 volumes
Busiest server has 54.5% of the data drives: OKThe first two lines match IBM’s own worked examples in the Redbook, 39 and 23 metadata extents. The formula overestimates slightly on purpose, and when you’re planning that’s what you want.
The balance lines come from lsarray -l, lsrank -l and lsextpool -l. The lab is close to even but not quite, 45% against 55%, because R0 and R1 keep spares. On a real system you’d try to put spare-holding arrays on both sides, or balance through volume placement, so neither server gets much more work than the other.
At work you’d run the same script from the jump server with dscli after every capacity change, so a pool pair drifting past your limit gets caught before one server is carrying most of the load.
✅ Checkpoint: Your script prints 39 and 23, matching the Redbook, and 54.5% for the busiest server.
Type quit when you’re done.
Break It, Then Fix It
Here are two pool rules people tend to break in their first month. Keep the shell from the lab open.
1Break it: a fully provisioned volume in an FCM pool
The Oracle team wants a 500 GiB redo log volume “fully allocated, no thin stuff”, so you leave out -sam and the default (standard, fully provisioned) gets used.
Type this at the dscli> prompt:
mkfbvol -extpool P0 -cap 500 -name log_#h 2002You’ll get this error:
dscli> mkfbvol -extpool P0 -cap 500 -name log_#h 2002
CMUN02031E mkfbvol: P0: Only thin provisioned ESE volumes (-sam ese) can be created in an extent pool with FlashCore Module ranks.
Why: the Redbook says volumes on FlashCore Module drives must be thin provisioned and FCM pools need Easy Tier. FCMs compress data inside the drive, so the DS8000 has no way of knowing in advance how much physical space a “full” volume will need. (The message text comes from the practice shell.)
Tell the DBAs that thin doesn’t mean slow here, it only means space gets allocated as data is written. If they really need fully provisioned volumes, those belong in a pool built on industry-standard flash.
Fix it:
mkfbvol -extpool P0 -cap 500 -sam ese -name log_#h 2002
lsfbvol -l -extpool P0You should see this:
dscli> mkfbvol -extpool P0 -cap 500 -sam ese -name log_#h 2002
CMUC00025I mkfbvol: FB volume 2002 successfully created.
dscli> lsfbvol -l -extpool P0
Date/Time: 24 October 2026 11:04:33 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID accstate datastate configstate deviceMTM datatype extpool sam captype cap (2^30B) ... ranks ... eam
================================================================================================== ... ===== ... ==========
db_2000 2000 Online Normal Normal 2107-900 FB 512 P0 ESE DS 500.0 ... 2 ... rotateexts
db_2001 2001 Online Normal Normal 2107-900 FB 512 P0 ESE DS 500.0 ... 0 ... rotateexts
log_2002 2002 Online Normal Normal 2107-900 FB 512 P0 ESE DS 500.0 ... 0 ... rotateextsAll three show sam ESE. The ranks column tells you how many ranks hold data for each volume: 2 for db_2000 (you wrote 20 GiB to it) and 0 for the others, since nothing’s been written to them yet. A few columns are cut with “…” to fit.
✅ Checkpoint: log_2002 shows sam ESE.
2Break it: put an FB rank in a CKD pool
The mainframe team has asked for a CKD pool on server 0. You create it and grab the next free rank, which happens to be FB.
Type these at the dscli> prompt:
mkarray -raidtype 6 -arsite S7
mkrank -array A4 -keygrp 1 -stgtype fb
mkextpool -rankgrp 0 -keygrp 1 -stgtype ckd ckd_0
chrank -extpool P2 R4You’ll get this error:
dscli> mkarray -raidtype 6 -arsite S7
CMUC00004I mkarray: Array A4 successfully created.
dscli> mkrank -array A4 -keygrp 1 -stgtype fb
CMUC00007I mkrank: Rank R4 successfully created.
dscli> mkextpool -rankgrp 0 -keygrp 1 -stgtype ckd ckd_0
CMUC00000I mkextpool: Extent pool P2 successfully created.
dscli> chrank -extpool P2 R4
CMUN02020E chrank: R4: The storage type of rank R4 (fb) does not match the storage type of extent pool P2 (ckd).Why: a pool is either FB or CKD, and only ranks of the same type can join it. An FB rank’s extents are 16 MiB or 1 GiB, while a CKD pool counts in cylinders. (Practice shell message text.)
Notice too that the new pool got the ID P2, an even number, because it’s rank group 0.
Check the state:
lsextpool -lYou should see this:
dscli> lsextpool -l
Date/Time: 24 October 2026 11:04:33 UTC IBM DSCLI Version: 7.10.10.348 DS: IBM.2107-78SV001
Name ID stgtype rankgrp status availstor (2^30B) %allocated available reserved numvols ...
========================================================================================== ...
fcm_fb_0 P0 fb 0 below 199132 0 12744448 128 3 ...
fcm_fb_1 P1 fb 1 below 238982 0 15294900 128 2 ...
ckd_0 P2 ckd 0 full 0 100 0 0 0 ...An empty pool shows status full and %allocated 100, because with zero extents it’s full by definition. The proper fix is to build a CKD rank for it (mkrank -stgtype ckd on an unused array), as the mainframe lessons do, and R4 stays as an unassigned FB rank ready for an FB pool.
✅ Checkpoint: ckd_0 exists as P2 with stgtype ckd, and R4 is still unassigned.
This happened at work
Server 0 at 90%, server 1 at 15%
This was at a mobile network operator that ran its billing, CRM and network inventory databases on a DS8000. Over three years the storage team added capacity four times, and each time someone either created a new pool or added ranks to whichever pool had a familiar name, without anyone noticing that every pool they touched was on rank group 0.
Then one Monday the month-end billing run slowed to a crawl. Response times on the billing database went from 1 ms to over 15 ms, and yet the DS8000 showed no errors and no failed parts. It was the performance report that finally explained it: server 0 was running at about 90% busy while server 1 sat around 15%. Every volume the billing database used was in an LSS owned by server 0, because every pool those volumes came from was in rank group 0. The DS8000 was perfectly healthy, it was just loaded on one side.
Impact: billing finished six hours late and invoices to enterprise customers went out a day behind.
Root cause: nobody had looked at the rankgrp column when adding pools and ranks, so a design built for two servers was running on one. Worse still, if server 0 had failed, server 1 would have inherited a load it was never sized to share.
Fix: over the next two months the team built new pools on rank group 1, moved ranks and volumes across with Easy Tier volume migration and started spreading new volumes over even and odd LSSs. Load settled near 50/50 and the month-end runs went back to normal.
Lesson: after every capacity change, run lsextpool and lsrank and put rank group 0 and 1 side by side. There’s a reason pools come in pairs.
Common mistakes and troubleshooting
| Symptom | Likely cause | What to check / fix |
|---|---|---|
| One server much busier than the other | Pools and ranks mostly in one rank group | Compare capacity per rankgrp in lsextpool, then rebalance with new pools and volume migration. |
chrank fails with a storage type error | FB rank into a CKD pool or the reverse | Check stgtype in lsrank -l and lsextpool -l. |
| mkfbvol refuses a standard volume | Pool is on FlashCore Module ranks | Use -sam ese, or a pool on industry-standard flash. |
| A new, empty pool shows status full | Pool has no ranks yet | Assign at least one rank, and plan for several so volumes can stripe. |
| Pool merge not allowed | Different extent size, drive type, format or rank group | Merge only matching pools on the same server. |
| A volume uses only one rank | Pool has one rank, or the volume was created with rotate volumes | Add ranks (several at once) and let Easy Tier rebalance. |
| Pool near 100% and writes stop | Pool reached its limit; write-inhibit with Emergency Space Reserve | Add ranks or move volumes straight away, and set a sensible threshold so you get warned sooner next time. |
Make it a small daily habit: run lsextpool once and look at rankgrp, %allocated and status. It takes thirty seconds and it would have spared the operator in the story a very bad month-end.
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 an extent pool, and what does the rank group decide?
Why they ask this: They want the basic definition and how it ties to the two servers.
How you might answer: An extent pool groups the extents of one or more ranks that share a storage type and extent size, and you create volumes from it. Its rank group, 0 or 1, says which server manages it, so rank group 0 is server 0 and rank group 1 is server 1.
A rank doesn’t have a server of its own until it joins a pool.
2. Why do DS8000 pools usually come in pairs?
Why they ask this: They’re checking you understand load balance and failover.
How you might answer: So that each server owns about half the capacity and half the I/O. You’d have one FB pool on rank group 0 and one on rank group 1, and the same again for CKD if there’s mainframe storage.
If everything’s in one rank group, one server does all the work while the other is idle, and that makes a failover riskier too.
2–5 years experience
3. You see server 0 at 90% and server 1 at 15%. How do you find the cause and fix it?
Why they ask this: It’s a real troubleshooting scenario and they want to hear your method.
How you might answer: I’d start with lsextpool and lsrank to compare capacity and ranks per rank group, and then check which LSSs the busy volumes sit in. Nine times out of ten you’ll find most pools, or the hot application’s volumes, on rank group 0.
Then I’d build or grow pools on rank group 1, migrate volumes across with Easy Tier volume migration while they stay online, and from then on spread new volumes over even and odd LSSs.
4. Can you put FB and CKD, or small and large extents, in one pool? What about FCM and industry-standard flash?
Why they ask this: They want the exact rules, because mixing mistakes can cost days of rework.
How you might answer: No to all of them. A pool has one storage type and one extent size, set by its first rank, and you can’t change the extent size later. You also can’t mix FCM capacity with other flash in the same pool.
On top of that, FCM pools need Easy Tier and only take thin ESE volumes, so I’d design the FCM and non-FCM pool pairs separately.
Senior level
5. Storage pool striping improves performance. What risk does it add, and how do you manage it?
Why they ask this: At senior level they expect you to see both sides of a design choice.
How you might answer: Because volumes are striped over every rank in the pool, losing a whole RAID array would hit every volume in that pool rather than a handful. RAID 6 makes that very unlikely, but if it happens the blast radius is the whole pool.
I’d manage it with RAID 6, by not building one giant pool for unrelated critical systems when policy asks for separation, and by mirroring the important data to a second DS8000 with Metro Mirror or Global Mirror.
6. How would you plan pool capacity, including metadata, for a mainframe pool with 700 volumes?
Why they ask this: They want to see you use the real formula and leave headroom.
How you might answer: For large extents the Redbook has a formula: number of volumes times two, plus total volume extents divided by ten, then divided by 53 for CKD or 64 for FB, and rounded up. For 700 volumes on 6,190 extents that comes to 39 metadata extents.
I’d add that overhead, keep room for Easy Tier moves and growth, set the pool threshold so we hear about it early, and keep the CKD pool pair balanced across both rank groups.
Quick quiz
Q1. When does a rank get its server affinity?
- When the array is created
- When the rank is created
- When the rank is assigned to an extent pool
- When a volume is mapped
Show answer
C: a rank has no server until it joins a pool, and the pool’s rank group decides which one.
Q2. Which server manages rank group 1?
- server0
- server1
- Both equally
- The HMC
Show answer
B: rank group 0 is server 0 and rank group 1 is server 1.
Q3. A system has FB and CKD storage. What is the usual minimum number of pools?
- 1
- 2
- 4
- 8
Show answer
C: one FB and one CKD pool per server, so four pools.
Q4. Which volumes can you create in a pool built on FlashCore Module ranks?
- Standard only
- ESE (thin) only
- Both
- None
Show answer
B: FCM capacity has to be thin provisioned, so only ESE volumes are allowed.
Q5. Which pools can be merged?
- Any two FB pools
- Pools with the same extent size, drive type, format and rank group
- Any pools on server 0
- Pools with the same name
Show answer
B: dynamic pool merge needs a matching extent size, drive type, FB/CKD format and server affinity.
Quick recap
- An extent pool groups ranks of one storage type and one extent size, and every volume comes from a single pool.
- The pool’s rank group sets the server, 0 for server 0 and 1 for server 1.
- Build pools in pairs and balance capacity across both servers, not only the rank count.
- With several ranks per pool, volumes can stripe and Easy Tier can rebalance, so add ranks in groups.
- FCM pools need Easy Tier, take only thin ESE volumes and can’t be mixed with other flash.
- Estimate metadata with the Redbook formula and keep some headroom below the threshold.
Next lesson
Lesson 13: FB and CKD volumes → Next you create open systems LUNs and mainframe 3390 volumes and see how their sizes map to extents.
Further reading: DS8000 extent pools
Want to go deeper into DS8000 extent pools? Section 3.4 of IBM’s IBM Storage DS8A00 Architecture and Implementation Guide (IBM Redbooks) covers pools, rank groups, merging and metadata. For the extent sizes behind every pool, revisit Lesson 11: DS8000 ranks and extents.
You can also see the full plan for this course on the IBM DS8000 Architecture course page.
