DACH Storage Scale System 6000 - 2 BBs

IBM Ehningen System · IBM bb78nvme · Fully Reproducible

System Purpose

Question asked

Please describe the purpose and general usage of the submitted system.  This would include the types of typical applications it supports (e.g., defense applications, molecular dynamics, benchmarking, system test, systems research), and the general use and purpose of the data generated by the applications running on it.

The system is primarily used for performance engineering, test, and measurements/benchmarking.  An example of performance engineering work would be debugging customer reported performance issues. 

Availability

Question asked

Please provide the deployment timeframe of the submitted system, or for on-demand cloud systems, the general period over which it is deployed and destroyed.

Please describe the availability of the system to users and who are its set of most regular users.

These resources are always in use and generally in the same cluster format although the Storage Scale servers may be connected in different manners (e.g. multiple building blocks of storage and the client nodes may mount other file systems for different storage servers).   Various configurations of clients and servers typically last in the range of days to weeks before reconfiguration.

The system is available for team members that work on IBM Storage Scale, with the primary users being performance engineers.

Storage System Software

Question asked

How is this storage software available? (e.g., commercially, open-source, not publicly available) Note that if the storage software is not open-source or commercially available, then a general description would be requested, but this would limit the submission’s reproducibility score.

Can anyone download/purchase this software?

List either product webpage or open-source repo of the exact software used in IO500.

Give any and all additional details of this specific storage deployment: (e.g., type of storage server product such IBM ESS or DDN SFA400X2, use of Ext4 or some other file system on each storage node, dual connected storage media to storage servers).

IBM Storage Scale (the file system software) and Red Hat (the operating system) are generally commercially available. 

Anyone can purchase the Storage Scale software or download a limited use version (it is available commercially).  

On top of G/A code, the Storage Scale System 6000 servers are running a development build based on the IBM Storage Scale 6.0.1 code stream, incoporating updates currently planned for the IBM Storage Scale 6.0.2 release (tentatively targeted for 4Q 2026).   For the development build that incoporates updates currently planned for the IBM Storage Scale 6.0.2in question, IBM intends to keep a copy of the build available for the purposes of reproducing this io500 submission results.

The product webpage is https://www.ibm.com/products/storage-scale

Runtime Environment

Question asked

State here that you provided all scripts/documentation that would allow someone else to reproduce your environment and attempt to achieve a similar IO500 score as the submitted system.

NOTE: provide all files/documentation/scripts that would enable a user to build your environment and deploy the custom scripts, software, or config files once they have obtained the appropriate storage system hardware and software. These may be included into the io500.tgz or into the extraCodes upload on the submission form.

Several examples include:

  • Commands used to set striping information (either for the entire system or for particular directories)
  • File system config and tuning information (or a reason why this is not available due to lack of root access, etc) on each node type (e.g., non-default config parameters on all three types of Lustre nodes: MDS, OSS, and client)
  • Any additional scripts utilized that impact IO500 execution beyond the io500 config file. For example, with IBM Spectrum Scale, the output of mmlsconfig, mmlscluster, mmlsfs, and mmlsfileset commands (and possibly even a dump of the configuration if possible). Each file system probably has similar type of config/tuning information that would need to be shared for a user to fully reproduce the environment.

As previously noted the Storage Scale System 6000 servers are running a development build based on the IBM Storage Scale 6.0.1 code stream, incoporating updates currently planned for the IBM Storage Scale 6.0.2 release (tentatively targeted for 4Q 2026).  In the case we need to reproduce our results, IBM intends to keep this code available for several months for reproduction purposes.

Details on the runtime environment are:

1.    The configuration is captured in mmlsconfig below:

mmlsconfig

Configuration data for cluster storage.ess6000:

-----------------------------------------------

clusterName storage.ess6000

clusterId 8861791687003745391

dmapiFileHandleSize 32

minReleaseLevel 6.0.0.0

tscCmdAllowRemoteConnections no

ccrEnabled yes

sdrNotifyAuthEnabled yes

maxblocksize 16m

[bb7]

nspdQueues 2045

[bb7,bb8,bb9]

nspdBufferMemPerQueue 24m

nspdThreadsPerQueue 2

nsdMinWorkerThreads 3842

nsdMaxWorkerThreads 3842

nsdRAIDEventLogToConsole all

nsdRAIDBlockDeviceMaxSectorsKB 0

nsdRAIDBlockDeviceNrRequests 0

nsdRAIDBlockDeviceQueueDepth 0

nsdRAIDBlockDeviceScheduler off

nsdRAIDSmallThreadRatio 2

nsdRAIDDefaultGeneratedFD no

nsdRAIDMasterBufferPoolSize 2G

nsdRAIDSSDPerformanceShortTimeConstant 2500000

nsdRAIDDiskDiagTimeout 130

numaMemoryInterleave yes

panicOnIOHang yes

pitWorkerThreadsPerNode 32

nsdRAIDClientOnlyChecksum yes

nsdRAIDEnableSpaceMonitor 1

nsdRAIDFastWriteFSMetadataLimit 256k

nsdRAIDMaxPdiskQueueDepth default:0;hdd:128;ssd:0;nvme:0;nvdimm:0;nvram:0

nsdRAIDEnableMasterBufferRootLG yes

nsdRAIDEnableRGCMRebalanceWeight yes

pagepoolMaxPhysMemPct 90

[bb7]

nsdRAIDPagepoolBaseline 973399941120

[bb8,bb9]

nspdQueues 240

[bb8]

nsdRAIDPagepoolBaseline 486345535488

[all16,ubuntu]

proactiveReconnect no

[common]

verbsRdmaCm enable

allToAllConnection all

[all16,bb7,bb8,bb9,turin,ubuntu]

prefetchPct 50

[all16,turin,ubuntu]

dataShipClientBufferPct 50

dataShipClientBuffersPerServer 50

[common]

mmhealth_gpfs_essconfigsyncmonitor_disable yes

mmhealth-gpfs-essconfigsyncmonitor_disable yes

[bb7]

maxReceiverThreadsOverride yes

maxReceiverThreads 96

[common]

cesSharedRoot /gpfs/bb7ces

cesCidrPool <IP=10.200.3.45><ATTRIBUTE=><GROUP=><PREFIX=>+<IP=10.200.3.46><ATTRIBUTE=><GROUP=><PREFIX=>+<IP=10.200.3.47><ATTRIBUTE=><GROUP=><PREFIX=>+<IP=10.200.3.48><ATTRIBUTE=><GROUP=><PREFIX=>

autoload no

[bb9]

ignorePrefetchLUNCount yes

nsdRAIDPagepoolBaseline 973393426022

[bb7,bb8,bb9]

nsdRAIDTracks 320K

nsdRAIDThreadsPerQueue 16

[common]

disablePrefetchThreadRebalance yes

[bb7,bb8,bb9]

nsdSmallThreadRatio 1

[bb7,bb8,bb9]

nsdRAIDReconstructAggressiveness 0

nsdRAIDDesiredThreadPct 100

nsdRAIDBufferPoolSizePct 80

[bb8]

nsdRAIDDefaultIoTimeout 50000

[fscc-ess6000-2-a,bb7,bb8,bb9]

backgroundSpaceReclaim Good: 1 10% 60 1% Info: 0 6% 30 1% Warning: 0 3% 10 0% Critical: 0 2% 5 0% OOS: 0 1% 1 0%

[common]

readReplicaPolicy fastest

verbsRdmaSend yes

[all16,bb7,bb8,bb9,turin,ubuntu]

maxMBpS 50000

[common]

subnets 10.200.0.0/16 10.200.0.0/client.all16 10.200.0.0/storage.ess3500

cipherList AUTHONLY

verbsRdma enable

maxTcpConnsPerNodeConn 2

[bb7,bb8,bb9]

dataShipServerBufferPct 50

[bb7]

pagepool 973399941120

[bb8]

pagepool 486345535488

[bb9]

pagepool 973393426022

[clients]

pagepool 140G

[bb7,bb8,bb9,client]

logBufferCount 64

[common]

preferDesignatedMnode yes

[clients]

prefetchPartitions 2

[bb7,bb8,bb9,clients]

workerThreads 1024

maxFilesToCache 131072

maxStatCache 131072

[all16,bb7,bb8,bb9,turin,ubuntu]

fsyncIsGlobal no

[bb7,bb8,bb9,clients]

nBucketGroups 1024

[common]

fgdlTokenBatchAcquire yes

autoCompactDir no

dataShipAssertOnFailure yes

[bb7,bb8,bb9,clients]

maxBufferDescs 10000000

[clients]

prefetchMaxThreadsPerOpenFile 12

maxPrefetchInstDelay 160000

[common]

inodePrefetchThreshold 5

[bb8]

traceRecycle local

[bb9,clients]

traceRecycle off

[bb8,bb9,clients]

tracedevOverwriteBufferSize 4294967296

tracedevTimeFormat absolute

tracedevWriteMode overwrite

trace all 4 tm 2 thread 1 mutex 1 vnode 2 ksvfs 3 klockl 2 io 3 pgalloc 1 mb 1 lock 2 fsck 3 fsckx 3 iolite 0

[bb7,bb8]

verbsPorts mlx5_0/1/77 mlx5_1/1/78 mlx5_2/1/77 mlx5_3/1/78 mlx5_4/1/77 mlx5_5/1/78 mlx5_6/1/77 mlx5_7/1/78

[all16]

verbsPorts mlx5_0/1/77 mlx5_0/1/78 mlx5_1/1/77 mlx5_1/1/78

[fscc-sr650-54,fscc-sr655v3-13,turin,ubuntu]

verbsPorts mlx5_0/1/77 mlx5_0/1/78

[bb9]

verbsPorts mlx5_0/1/77 mlx5_1/1/77 mlx5_2/1/77 mlx5_3/1/77 mlx5_0/1/78 mlx5_1/1/78 mlx5_2/1/78 mlx5_3/1/78

[fscc-ess6000-4-a]

verbsPorts mlx5_0/1/77 mlx5_1/1/77 mlx5_2/1/77 mlx5_3/1/99

[fscc-ess6000-4-b]

verbsPorts mlx5_0/1/78 mlx5_1/1/78 mlx5_2/1/78  mlx5_3/1/99

[common]

adminMode central

File systems in cluster storage.ess6000:

----------------------------------------

/dev/bb78nvme16m

Using the ‘mmchnode’ all nodes (clients and servers) have been defined as ‘manager’ role nodes as shown in ‘mmlscluster’ data below:

mmlscluster

GPFS cluster information

========================

GPFS cluster name:         storage.ess6000

GPFS cluster id:           8861791687003745391

GPFS UID domain:           storage.ess6000

Remote shell command:      /usr/bin/ssh

Remote file copy command:  /usr/bin/scp

Repository type:           CCR

Node  Daemon node name  IP address   Admin node name   Designation

--------------------------------------------------------------------

1   fscc-ess6000-2-a  9.87.92.114  fscc-ess6000-2-a  manager-perfmon

2   fscc-ess6000-2-b  9.87.92.116  fscc-ess6000-2-b  manager-perfmon

3   fscc-ess6000-3-a  9.87.93.171  fscc-ess6000-3-a  manager-perfmon

4   fscc-ess6000-3-b  9.87.93.173  fscc-ess6000-3-b  manager-perfmon

5   fscc-un002vm      9.87.95.209  fscc-un002vm      perfmon

7   fscc-sr655v3-18   9.87.92.137  fscc-sr655v3-18   manager-perfmon

8   fscc-sr655v3-19   9.87.92.193  fscc-sr655v3-19   manager-perfmon

9   fscc-sr655v3-20   9.87.92.195  fscc-sr655v3-20   manager-perfmon

10   fscc-sr655v3-21   9.87.92.197  fscc-sr655v3-21   manager-perfmon

11   fscc-sr655v3-22   9.87.92.199  fscc-sr655v3-22   manager-perfmon
  12   fscc-sr655v3-23   9.87.92.201  fscc-sr655v3-23   manager-perfmon

13   fscc-sr655v3-24   9.87.92.203  fscc-sr655v3-24   manager-perfmon

14   fscc-sr655v3-25   9.87.92.236  fscc-sr655v3-25   manager-perfmon

15   fscc-sr655v3-26   9.87.92.250  fscc-sr655v3-26   manager-perfmon

16   fscc-sr655v3-27   9.87.92.75   fscc-sr655v3-27   manager-perfmon

17   fscc-sr655v3-28   9.87.92.77   fscc-sr655v3-28   manager-perfmon

18   fscc-sr655v3-29   9.87.93.164  fscc-sr655v3-29   manager-perfmon

19   fscc-sr655v3-30   9.87.93.204  fscc-sr655v3-30   manager-perfmon

20   fscc-sr655v3-31   9.87.93.31   fscc-sr655v3-31   manager-perfmon

21   fscc-sr655v3-32   9.87.93.68   fscc-sr655v3-32   manager-perfmon

22   fscc-sr655v3-1    9.87.92.26   fscc-sr655v3-1    manager-perfmon

23   fscc-sr655v3-2    9.87.92.28   fscc-sr655v3-2    manager-perfmon

24   fscc-sr655v3-3    9.87.92.30   fscc-sr655v3-3    manager-perfmon

25   fscc-sr655v3-4    9.87.92.32   fscc-sr655v3-4    manager-perfmon

26   fscc-sr655v3-5    9.87.92.34   fscc-sr655v3-5    manager-perfmon

27   fscc-sr655v3-6    9.87.92.46   fscc-sr655v3-6    manager-perfmon

28   fscc-sr655v3-7    9.87.92.48   fscc-sr655v3-7    manager-perfmon

29   fscc-sr655v3-8    9.87.92.50   fscc-sr655v3-8    manager-perfmon

30   fscc-sr655v3-9    9.87.92.52   fscc-sr655v3-9    manager-perfmon

31   fscc-sr655v3-10   9.87.92.55   fscc-sr655v3-10   manager-perfmon

32   fscc-sr655v3-11   9.87.92.57   fscc-sr655v3-11   manager-perfmon

33   fscc-sr655v3-12   9.87.92.59   fscc-sr655v3-12   manager-perfmon

34   fscc-sr655v3-13   9.87.92.61   fscc-sr655v3-13   manager-perfmon

35   fscc-sr655v3-14   9.87.94.201  fscc-sr655v3-14   manager-perfmon

36   fscc-sr655v3-15   9.87.94.203  fscc-sr655v3-15   manager-perfmon

37   fscc-sr655v3-16   9.87.94.205  fscc-sr655v3-16   manager-perfmon

40   fscc-sr650-54     9.87.95.80   fscc-sr650-54     quorum-perfmon

73   fscc-sr655v3-33   9.87.92.128  fscc-sr655v3-33   manager-perfmon

74   fscc-sr655v3-34   9.87.92.208  fscc-sr655v3-34   manager-perfmon

75   fscc-sr655v3-35   9.87.92.232  fscc-sr655v3-35   manager-perfmon

76   fscc-sr655v3-36   9.87.93.106  fscc-sr655v3-36   manager-perfmon

77   fscc-sr655v3-37   9.87.93.112  fscc-sr655v3-37   manager-perfmon

78   fscc-sr655v3-38   9.87.93.114  fscc-sr655v3-38   manager-perfmon

79   fscc-sr655v3-39   9.87.93.116  fscc-sr655v3-39   manager-perfmon

80   fscc-sr655v3-40   9.87.93.208  fscc-sr655v3-40   manager-perfmon

81   fscc-sr655v3-41   9.87.94.131  fscc-sr655v3-41   manager-perfmon

82   fscc-sr655v3-42   9.87.94.138  fscc-sr655v3-42   manager-perfmon

83   fscc-sr655v3-43   9.87.94.218  fscc-sr655v3-43   manager-perfmon

84   fscc-sr655v3-44   9.87.92.24   fscc-sr655v3-44   manager-perfmon

85   fscc-sr655v3-45   9.87.92.78   fscc-sr655v3-45   manager-perfmon

86   fscc-sr655v3-46   9.87.92.80   fscc-sr655v3-46   manager-perfmon

87   fscc-sr655v3-47   9.87.92.82   fscc-sr655v3-47   manager-perfmon

88   fscc-sr655v3-48   9.87.92.87   fscc-sr655v3-48   manager-perfmon

89   fscc-arm-07       9.87.95.123  fscc-arm-07

91   fscc-ess6000-4-a  9.87.92.188  fscc-ess6000-4-a  manager-perfmon

92   fscc-ess6000-4-b  9.87.92.190  fscc-ess6000-4-b  manager-perfmon

95   fscc-sr655v3-17   9.87.92.101  fscc-sr655v3-17   manager

2.    In this version of the Storage Scale Server The PCI tuning option PCI_WR_ORDERING has been enabled in the ESS code.

The client nodes have manually enabled this setting using this process:
 
Find the MST device name of each adapter, e.g.:

mst start
mst status
/dev/mst/mt4123_pciconf0

Enable PC_WR_ORDERING for each such device, e.g.:

mlxconfig -d /dev/mst/mt4123_pciconf0 s PCI_WR_ORDERING=1 
<reboot for the change to take effect>


The server nodes also have manually set INT_LOG_MAX_PAYLOAD_SIZE to the default/automatic setting as follows:

Find the MST device name of each adapter, e.g.:

mst start
mst status
/dev/mst/mt4123_pciconf0

Set INT_LOG_MAX_PAYLOAD_SIZE for each such device, e.g.:

echo y | mlxconfig -d $i -e s INT_LOG_MAX_PAYLOAD_SIZE=0
<reboot for the change to take effect>


3.    The file system block is 16MB (file system block size is a choice based on the use case)

Instead of using an external pfind script to control inode prefetch, a helper script is run (as shown in the 'runit' script attached to the io500 submission).

cat find_script/track_io500.sh

RESULT_FILE="${RESULT_DIR}/${WRK_DIR}/result.txt"

#echo "work_dir: $WRK_DIR $RESULT_FILE"

#echo "result_file:: $RESULT_FILE"

# look out for

mdtest_hard_write='\[mdtest-hard-write\]'

find='\[find\]'

ior_easy_read='\[ior-easy-read\]'

disable_inodePrefetchThreshold () {

date

echo 999 | mmchconfig inodePrefetchThreshold=2000000 -i -N $HOSTLIST

sleep 5s

mmfsadm dump config | grep inodePrefetchThreshold

printf "Disable complete\n"

date

}

enable_inodePrefetchThreshold () {

date

echo 999 | mmchconfig inodePrefetchThreshold=5 -i -N $HOSTLIST

sleep 5s

mmfsadm dump config | grep inodePrefetchThreshold

printf "Enable complete\n"

date

}

tail -fn 0 $RESULT_FILE | while read line; do

if echo "$line" | grep -qE '\[.*?\]'; then

printf "%s workload started ... \n" "$line"

fi

if echo "$line" | grep -qE "$find"; then

printf "Disabling inodePrefetchThreshold\n"

disable_inodePrefetchThreshold

fi

if echo "$line" | grep -qE "$ior_easy_read"; then

printf "enabling inodePrefetchThreshold\n"

enable_inodePrefetchThreshold

break

fi

done

4.    The choice of erasure encoding used is 16+2P, and while this is available on ECE systems already, it is being used here slightly before 16+2P G/A's on ESS.


5.    The file system created for the io500 run preallocates 1500M inodes and uses a file system version of 6.0.0.0 (--mmcrfs --inode-limit 2000M:1500M --version=6.0.0.0)

Fault Tolerance Mechanisms

Question asked

Does your system have a single point of failure as defined by “Definition 7” of a Production System? Please describe all mechanisms that provide fault tolerance for the submitted storage system. Be specific to your submission, not general storage system capabilities.

  • Power (For example, can power failure of a node or rack bring down the storage system?)
  • Networking (For example, can failure of a single NIC bring down the storage system? Remember that any networking failure that brings down multiple nodes is acceptable)
  • Inter storage data and metadata server (For example, what type of data protection mechanism does the storage system use to keep operating during node failures, e.g., active-active servers, client-directed RAID, declustered RAID, erasure-coding, 3-way replication)
  • Intra storage data and metadata server storage media (For example, how does the storage eysstem protect against fiailure of a single storage device within a node, e.g., raid5)

Please list any additional information needed to determine whether this system has a single point of failure.

IBM Storage Scale servers are designed with power redundancy in mind.


The network switch is a single point of failure (not-dual redundant switches) but Storage Scale supports such redundant switch configurations.


This run uses a storage subsystem employing IBM Storage Scale RAID with a 16+2P erasure encoding for data and metadata.

Execution

Question asked

Please provide a description of how the IO500 benchmark was executed, e.g., via system scheduler (e.g., SLURM) to run a job on the compute cluster, which initially ran a setup process to configure the client and file system, and then started the full benchmark.

During the IO500 benchmark execution was the system entirely dedicated to running the benchmark or were there other jobs running in the same cluster and storage system?

The benchmark was executed by building io500 with openMPI and calling the io500.sh script directly as shown in the 'runit' script attached to the submission:
./io500.sh config_withFGWS_PFIND_FGRS.bb8nvme16m.ini  24

The entire system was dedicated to the io500 run.

Note the very small changes to io500.sh that allow passing in the tasks per node as a parameter:

# This script takes its parameters from the same .ini file as io500 binary.
io500_ini="$1"          # You can set the ini file here
TPN="${2:-1}"
NNODES=$(grep -v '^\s*#' host.list | grep -v '^\s*$' | wc -l)
let TT=$TPN*$NNODES
io500_mpirun="mpiexec"
io500_mpiargs="-n $TT --oversubscribe -npernode $TPN --hostfile host.list"

Caching

Question asked

Please describe all caching mechanisms in client/server that were utilized during the IO500 run. This could include caching in any storage medium (e.g., SSD, RAM).

A few examples would include:

  • Client data/metadata caching (in Linux page cache or in other memory cache)
  • Client side NVMe read-only data cache
  • Storage server metadata/data caching in RAM
  • Storage controller caching
  • RAID card caching

On the client side, the Storage Scale pagepool (in RAM) is used to cache data in the same manner that the Linux file cache is used to cache data with other file systems such as ext4.  Data is not cached on NVMe drives on the clients as those client drives are not used in the I/O path by the Storage Scale file system.

On the server side, a portion of the servers’ Storage Scale pagepool (RAM) is also available for caching.  The effect of this caching provides similar caching to that obtained using solid state drive caching systems, and the NVMe drives on the servers also provide solid state caching.

Data Source

Question asked

Is the submitted system a stand-alone storage system or an acceleration layer in front of another storage system that is the source of truth for all application data? This question relates to whether the submitted system is a burst buffer layered on primary storage or primary storage itself.

There is no burst buffer used – it is the primary storage itself.  Caching on the server-side page pool is analogous to how disk drive caching works.

Trust

Question asked

Please describe any steps taken to ensure that the results are trustworthy.

  • Did you run the benchmark multiple times and get similar scores?
  • Did you validate the score is below the physical capabilities of the deployed hardware?
  • How did you validate that the storage system follows the IO500 rules regarding persistence, which states, "All data must be written to persistent storage within the measured time for the individual benchmark, e.g. if a file system caches data, it must ensure that data is persistently stored before acknowledging the close"?

Very similar scores have been achieved in several other runs of the benchmark on the same system.

We have validated that the scores achieved are within the physical capabilities of the system.