Accelerating IO500 with IBM Storage Scale Data Acceleration Tier (DAT)
One of the most satisfying performance improvements comes from putting previously idle resources to
The Saguaro cluster, one of the IBM Storage Scale systems used for our IO500 submissions, consists of 10 AMD client nodes connected through InfiniBand to a single IBM Storage Scale System 6000 building block. Each client contains eight 3.2 TB NVMe SSDs. One drive is used for the operating system, leaving seven available for other purposes—a total of NVMe devices across the cluster.
For our SC24 IO500 submission, those 70 devices remained idle during benchmark execution. The system still delivered strong performance for a single storage building block but leaving that much high-performance NVMe capacity unused during a storage benchmark was a clear opportunity.
In 2025, IBM Storage Scale introduced decentralized data acceleration tier (also known as decentralized DAT). The key benefits of this feature include:
- NVMe devices can be attached to client nodes to participate in an IBM Storage Scale file system as a distributed performance tier.
-
reside simultaneously in two storage pools:
1) A high-performance local copy within the client node
2) A highly resilient copy stored on the IBM Storage Scale System servers.
-
Provides affinity-aware allocation, which allows performance replicas to be placed on selected client nodes, thus making it possible to position data close to the applications that will consume it.
The decentralized DAT feature is particularly beneficial for AI and HPC workloads that exhibit predictable, locality-sensitive data access patterns. By placing data closer to the compute resources that consume it, DAT improves application performance, reduces data movement, and increases infrastructure efficiency. With the introduction of Decentralized DAT, we asked whether our knowledge of the IO500 data-access pattern could be used to place replicas on the same nodes that would later read the data. The answer was yes. By aligning replica placement with the benchmark’s access pattern, we enabled the IO500 workload to read from client-local NVMe and exploit the aggregate bandwidth of all 70 devices. This locality-aware design produced substantial performance gains by putting storage already installed in the client nodes to productive use, without adding new hardware.
The most dramatic improvements were observed in the ior-easy workloads that were moved onto the DAT performance pool built from client-local NVMe devices.
The improvements came from two sources:
- The aggregate bandwidth of the client NVMe drives exceeded the bandwidth available from the IBM Storage Scale System 6000 alone.
- DAT allowed data to be placed close to the nodes that would later read it, thus reducing network traffic and improving locality.
System Architecture
The following figure describes the Saguaro configuration that was used for the SC25 submission:
- A single IBM Storage Scale System 6000 building block provided the primary storage infrastructure.
- Seven NVMe drives on each of the 10 client nodes were combined into a decentralized DAT performance pool.
- Metadata-intensive benchmarks and the ior-hard workloads continued to use the IBM Storage Scale System 6000. The optimization focused only on the ior-easy files.
Understanding the IO500 Access Pattern
The IO500 benchmark deliberately avoids simple client-cache effects.
During the ior-easy write phase, each MPI task creates its own file. In the subsequent read phase, IO500 uses the IOR -C (reorderTasks) option to ensure that clients do not read the files they originally created. Instead, each task reads a file written by another task.
This processing is intended to prevent benchmark results from being inflated by local caching.
However, it also creates a predictable relationship between the node that writes a file and the node that will later read it.
That predictability creates an opportunity for locality-aware placement.
Using DAT to Exploit Locality
Instead of placing each file on the node that created it, we used DAT placement policies to place each file on the node that would later consume it.
- Enable an IBM Storage Scale policy (shown in the next figure) that implements a placement policy that places the ior-easy files on the nodes that will end up reading them.
- As a result of the policy, IO500 creates the ior-easy files only on the clients disk of the DAT performance pool, and writes the files to the clients that will read them.
- During the read phases, the consuming client reads the file directly from its own local NVMe storage.
Note: The SC25 version of IO500 allowed this approach for both ior-easy-read and ior-rnd4K-easy-read, but the latest io500 code updates the use of IOR -C and IOR -Q options to force the ior-rnd4K-easy-read benchmark to operate on a data file written by a different node.
The resulting data flow is shown in the following figure:
In effect, the benchmark still accessed files through a single IBM Storage Scale namespace, but the physical location of the files is optimized.
This optimization reduced network traffic while allowing the benchmark to exploit the aggregate bandwidth of the client-local NVMe devices.
The placement policy established a deterministic relationship between:
Conceptually, the policy mapped ranges of files to specific DAT placement groups:
Files 0-24 -> Placement Group 10, which maps to Storage Scale's "Failure Group ID 1,0,10"
Files 25-49 -> Placement Group 1, which maps to Storage Scale's "Failure Group ID 1,0,1"
Files 50-74 -> Placement Group 2, which maps to Storage Scale's "Failure Group ID 1,0,2"
[…]
Files 225-249 -> Placement Group 9, which maps to Storage Scale's "Failure Group ID 1,0,3"
Each placement group corresponded to storage located on a particular client node.
The full policy used for the benchmark is shown below:
cat ior_policy.pol
RULE 'ior_file_easy.0-24' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000000' AND name <= 'ior_file_easy.00000024') AND (setWADFGP(1,0,10))
RULE 'ior_file_easy.25-49' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000025' AND name <= 'ior_file_easy.00000049') AND (setWADFGP(1,0,1))
RULE 'ior_file_easy.50-74' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000050' AND name <= 'ior_file_easy.00000074') AND (setWADFGP(1,0,2))
RULE 'ior_file_easy.75-99' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000075' AND name <= 'ior_file_easy.00000099') AND (setWADFGP(1,0,3))
RULE 'ior_file_easy.100-124' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000100' AND name <= 'ior_file_easy.00000124') AND (setWADFGP(1,0,4))
RULE 'ior_file_easy.125-149' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000125' AND name <= 'ior_file_easy.00000149') AND (setWADFGP(1,0,5))
RULE 'ior_file_easy.150-174' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000150' AND name <= 'ior_file_easy.00000174') AND (setWADFGP(1,0,6))
RULE 'ior_file_easy.175-199' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000175' AND name <= 'ior_file_easy.00000199') AND (setWADFGP(1,0,7))
RULE 'ior_file_easy.200-224' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000200' AND name <= 'ior_file_easy.00000224') AND (setWADFGP(1,0,8))
RULE 'ior_file_easy.225-249' SET POOL 'system' REPLICATE(0:1) WHERE (name >= 'ior_file_easy.00000225' AND name <= 'ior_file_easy.00000249') AND (setWADFGP(1,0,9))
RULE 'default' SET POOL 'system'
Mechanics of Building a DAT File System
The previous policy, and the overall IO500 optimization described here, depended on first creating a decentralized DAT file system. In a decentralized DAT deployment, the DAT performance pool is built from NVMe devices that physically reside in the client nodes rather than in centralized storage enclosures. IBM Storage Scale combines these distributed devices into a shared file system while maintaining a single global namespace, as described in the decentralized DAT deployment instructions.
For the Saguaro configuration, the process was straightforward:
- An IBM Storage Scale System 6000 building block hosted the IBM Storage Scale RAID pool (also called GPFS Native RAID, or GNR) pool, where data was protected by using erasure coding. The GNR pool worked in conjunction with the client-local DAT performance pool, which maintained performance replicas on the client NVMe devices. Together, the two pools provided both high performance and data resilience.
- For this configuration, the fs1 file system was created by using the standard deployment procedure for an IBM Storage Scale System 6000 performance model (equipped with 48 NVMe drives).
- Seven of the local NVMe drives on each of the 10 client nodes were designated as DAT performance-pool devices, for a total of 70 drives. An NSD stanza file for the performance pool NSDs was created, to define each of these drives. Shown below, the file begins with a pool stanza that defines the performance pool characteristics as supporting affinitized allocations (allowWriteAffinity=yes), followed by NSD stanzas to list each of the disks:
cat DAT.stanzas # this DAT.stanzas file is passed to mmcrnsd to create the DAT NSDs
pool:
pool=perf
allowWriteAffinity=yes
performancePool=yes
layoutMap=cluster
blockSize=16M
%nsd:
device=/dev/nvme0n1
server=saguaro1ib
nsd=saguaro1_NSD1
usage=dataOnly
pool=perf
failureGroup=1,0,1
[... NSD stanzas for saguaro1_NSD2 – saguaro1_NSD5 (disks 2 -5 on saguaro1) are skipped here . . .]
%nsd:
device=/dev/nvme7n1
server=saguaro1ib
nsd=saguaro1_NSD6
usage=dataOnly
pool=perf
failureGroup=1,0,1
%nsd:
device=/dev/nvme1n1
server=saguaro2ib
nsd=saguaro2_NSD1
usage=dataOnly
pool=perf
failureGroup=1,0,2
[... NSD stanzas for saguaro2 follow the same format as
saguaro1 but use failureGroup=1,0,2 instead of = 1,0,1 ...]
%nsd:
device=/dev/nvme6n1
server=saguaro2ib
nsd=saguaro2_NSD6
usage=dataOnly
pool=perf
failureGroup=1,0,2
[... NSD stanzas continue following the same pattern, up.
until the end of the file, with saguaro10 being the last
client, which is assigned failureGroup=1,0,10 ...]
%nsd:
device=/dev/nvme6n1
server=saguaro10ib
nsd=saguaro10_NSD6
usage=dataOnly
pool=perf
failureGroup=1,0,10
The DAT.stanzas file is passed to mmcrnsd to create the NSDs that will make up the performance pool:
mmcrnsd -F DAT.stanzas -v no
This command creates one NSD for each disk defined in DAT.stanzas. After the NSDs have been created, their names can be obtained from the output of:
mmlsnsd –X
The resulting NSD names are then passed to mmvdisk filesystem add. This command adds the performance-pool NSDs to the fs1 file system created in step 1, making the file system DAT-enabled:
mmvdisk filesystem add --fs fs1 --nsd \
<comma-separated_list_of_NSD_names> --pools \ perf,performancePool=yes,allowWriteAffinity=yes,writeAffinityDepth=1,layoutMap=cluster,blockSize=8M
After the DAT file system is created, we mount it to all nodes and make the default number of performance replicas equal to 0, since we will only create performance replicas for the ior-easy files as defined by the previous policy:
mmchfs fs1 --perf-replicas 0
Allocation of performance pool replicas is controlled by the ior_policy.polpolicy (shown in the previous DAT Placement Policy section), which we enable via mmapplypolicy:
mmchpolicy fs1 DEFAULT # start with default, which is no policy enabled
mmchpolicy fs1 ior_policy.pol # the full ior_policy.pol is shown above
mmlspolicy fs1 –L # list policy to make sure it matches input policy
After this policy is configured, applications access files exactly as they would in any other IBM Storage Scale file system. The difference is that placement policies can influence where the data is physically stored. In our case, policy rules directed the IO500 ior-easy files to specific placement groups (called failure groups) that mapped to the NVMe resources of the nodes that would later consume the data.
One of the key advantages of decentralized DAT is that it allows locally attached NVMe resources to participate in a clustered IBM Storage Scale file system without requiring applications to directly manage data placement. The shared namespace remains unchanged, while IBM Storage Scale handles the mapping between files, placement groups, and the underlying client-local storage.
For more information about decentralized DAT deployment, consult the complete setup procedure, best practices, and file-system creation steps in the IBM Storage Scale documentation for decentralized DAT deployments: decentralized DAT deployment instructions.
The significance of this result extends beyond IO500.
Many IBM Storage Scale deployments already contain substantial storage capacity within compute or client nodes. Those devices often sit idle or are reserved for specialized applications.
Decentralized DAT allows those resources to participate in the IBM Storage Scale architecture while preserving a shared namespace and normal application access patterns.
Applications continue to access files normally. Placement policies determine where the data is physically located.
Many AI and HPC workflows exhibit predictable data-access patterns that can benefit from locality-aware placement.
- AI training pipelines
- Data preparation workflows
- Checkpoint processing
- Simulation post-processing
- Analytics pipeline
- Temporary and intermediate datasets
Whenever future data consumption can be predicted, decentralized DAT can be used to place that data closer to where it will be needed.
The most important result was not the 21% improvement in overall IO500 score. The real value proposition is that decentralized DAT enables IBM Storage Scale to incorporate client-local storage into a file system, with the ability to control data placement.
In the case of the Saguaro cluster, decentralized DAT transformed seventy previously underutilized NVMe drives into a high-performance distributed storage tier. By aligning data placement with the benchmark access pattern, we increased ior-easy write performance by 58%, ior-easy read performance by 49%, and overall bandwidth by 45%. All of this, without adding storage hardware.
As storage systems continue to scale, locality-aware placement can become increasingly powerful. And decentralized DAT provides the framework needed to exploit that locality while maintaining the operational simplicity of a shared IBM Storage Scale file system.