Hardware Checklist
Use the following checklist when planning the hardware configuration for a production, distributed Buckit deployment.
Considerations
When selecting hardware for your Buckit implementation, take into account the following factors:
Expected amount of data in tebibytes to store at launch
Expected growth in size of data for at least the next two years
Number of objects by average object size
Average retention time of data in years
Number of sites to be deployed
Number of expected buckets
Production Hardware Recommendations
Buckit, like any distributed system, benefits from selecting identical configurations for all nodes in a given server pool. Ensure a consistent selection of hardware (CPU, memory, motherboard, storage adapters) and software (operating system, kernel settings, system services) across pool nodes.
Deployments may exhibit unpredictable performance if nodes have varying hardware or software configurations. Workloads that benefit from storing aged data on lower-cost hardware should instead deploy a dedicated “warm” or “cold” Buckit deployment and transition data to that tier.
Description |
Minimum |
Recommended |
|
|---|---|---|---|
Dedicated Baremetal or Virtual Hosts (“hosts”). |
4 dedicated hosts |
8+ dedicated hosts |
|
4 drives per Buckit Server |
8+ drives per Buckit Server |
||
25GbE |
100GbE |
||
Server-grade CPUs with support for modern SIMD instructions (AVX-512), such as Intel® Xeon® Scalable or better. |
8 CPU/socket or vCPU per host |
16+ CPU/socket or vCPU per host |
|
Available memory to meet or exceed per-server usage by a reasonable buffer. |
32GB of available memory per host |
128GB+ of available memory per host |
Important
The following areas have the greatest impact on Buckit performance, listed in order of importance:
Network Infrastructure |
Insufficient or limited throughput constrains performance |
|---|---|
Storage Controller |
Old firmware, limited throughput, or failing hardware constrains performance and affects reliability |
Storage (Drive) |
Old firmware, or slow/aging/failing hardware constrains performance and affects reliability |
Prioritize securing the necessary components for each of these areas before focusing on other hardware resources, such as compute-related constraints.
The minimum recommendations above reflect Buckit’s experience with assisting enterprise customers in deploying on a variety of IT infrastructures while maintaining the desired SLA/SLO. While Buckit may run on less than the minimum recommended topology, any potential cost savings come at the risk of decreased reliability, performance, or overall functionality.
Networking
Buckit recommends high speed networking to support the maximum possible throughput of the attached storage (aggregated drives, storage controllers, and PCIe busses). The following table provides a general guideline for the maximum storage throughput supported by a given physical or virtual network interface. This table assumes all network infrastructure components, such as routers, switches, and physical cabling, also supports the NIC bandwidth.
NIC Bandwidth (Gbps) |
Estimated Aggregated Storage Throughput (GBps) |
10Gbps |
1.25GBps |
25Gbps |
3.125GBps |
50Gbps |
6.25GBps |
100Gbps |
12.5GBps |
Networking has the greatest impact on Buckit performance, where low per-host bandwidth artificially constrains the potential performance of the storage. The following examples of network throughput constraints assume spinning disks with ~100MB/S sustained I/O
1GbE network link can support up to 125MB/s, or one spinning disk
10GbE network can support approximately 1.25GB/s, potentially supporting 10-12 spinning disks
25GbE network can support approximately 3.125GB/s, potentially supporting ~30 spinning disks
Memory
Memory primarily constrains the number of concurrent simultaneous object API requests per node.
Buckit automatically admits requests based on an estimated in-flight request memory budget when api requests_max is unset.
The request memory budget is calculated as:
\(freeSystemRam * 0.90 * 0.75\)
Buckit uses the following request memory estimates for object reads and writes:
Request Type |
Estimated Request Cost |
|---|---|
GET |
|
PUT |
|
erasureSetDriveCount is the number of drives in the largest erasure set.
The following table lists example maximum concurrent requests on a node based on free system RAM. GET capacity is independent of erasure set width. PUT capacity depends on the largest erasure set drive count:
Request Type |
32 GiB of RAM |
64 GiB of RAM |
128 GiB of RAM |
256 GiB of RAM |
512 GiB of RAM |
|---|---|---|---|---|---|
GET |
11,059 |
22,118 |
44,236 |
88,473 |
176,947 |
PUT, 4-drive erasure set |
1,579 |
3,159 |
6,319 |
12,639 |
25,278 |
PUT, 8-drive erasure set |
1,005 |
2,010 |
4,021 |
8,043 |
16,086 |
PUT, 16-drive erasure set |
582 |
1,164 |
2,328 |
4,656 |
9,313 |
The following table provides general guidelines for allocating memory for use by Buckit based on the total amount of local storage on the node:
Total Host Storage |
Recommended Host Memory |
|---|---|
Up to 1 Tebibyte (Ti) |
8GiB |
Up to 10 Tebibyte (Ti) |
16GiB |
Up to 100 Tebibyte (Ti) |
32GiB |
Up to 1 Pebibyte (Pi) |
64GiB |
More than 1 Pebibyte (Pi) |
128GiB |
Storage
Exclusive access to drives
Buckit requires exclusive access to the drives or volumes provided for object storage. No other processes, software, scripts, or persons should perform any actions directly on the drives or volumes provided to Buckit or the objects or files Buckit places on them.
Do not use scripts or tools to directly modify, delete, or move any of the data shards, parity shards, or metadata files on the provided drives, including from one drive or node to another. Such operations are very likely to result in widespread corruption and data loss beyond Buckit’s ability to heal.
Storage Mediums
HDD and flash-based (NVMe or SSD) storage devices are all supported, but their performance varies. Workloads with higher throughput or latency requirements should account for the performance characteristics of the selected storage medium.
Prefer Direct-Attached “Local” Storage (DAS)
DAS, such as locally-attached JBOD (Just a Bunch of Disks) arrays, provide significant performance and consistency advantages over networked (NAS, SAN, NFS) storage.
Configure the JBOD arrays without any RAID, pooling, or similar software-level layers, such that the storage is presented directly to Buckit.
For virtual machines or systems that require provising storage as a virtual volume, Buckit recommends using thick LUNs only.
Network File System Volumes Break Consistency Guarantees
Buckit’s strict read-after-write and list-after-write consistency model requires local drive filesystems. Buckit cannot provide consistency guarantees if the underlying storage volumes are NFS or a similar network-attached storage volume.
Use XFS-Formatted Drives with Consistent Mounting
Format drives as XFS and present them to Buckit as a JBOD array with no RAID or other pooling configurations. Using any other type of backing storage (SAN/NAS, ext4, RAID, LVM) typically results in a reduction in performance, reliability, predictability, and consistency.
When formatting XFS drives, apply a unique label per drive. For example, the following command formats four drives as XFS and applies a corresponding drive label.
mkfs.xfs /dev/sdb -L BUCKITDRIVE1
mkfs.xfs /dev/sdc -L BUCKITDRIVE2
mkfs.xfs /dev/sdd -L BUCKITDRIVE3
mkfs.xfs /dev/sde -L BUCKITDRIVE4
Buckit requires that drives maintain their ordering at the mounted position across restarts. Buckit does not support arbitrary migration of a drive with existing Buckit data to a new mount position, whether intentional or as the result of OS-level behavior.
You must use /etc/fstab or a similar mount control system to mount drives at a consistent path.
For example:
$ nano /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=BUCKITDRIVE1 /mnt/drive-1 xfs defaults,noatime 0 2
LABEL=BUCKITDRIVE2 /mnt/drive-2 xfs defaults,noatime 0 2
LABEL=BUCKITDRIVE3 /mnt/drive-3 xfs defaults,noatime 0 2
LABEL=BUCKITDRIVE4 /mnt/drive-4 xfs defaults,noatime 0 2
You can use mount -a to mount those drives at those paths during initial setup.
The Operating System should otherwise mount these drives as part of the node startup process.
Buckit strongly recommends using label-based mounting rules over UUID-based rules.
Label-based rules allow swapping an unhealthy or non-working drive with a replacement that has matching format and label.
UUID-based rules require editing the /etc/fstab file to replace mappings with the new drive UUID.
Note
Cloud environment instances which depend on mounted external storage may encounter boot failure if one or more of the remote file mounts return errors or failure.
For example, an AWS ECS instance with mounted persistent EBS volumes may not boot with the standard /etc/fstab configuration if one or more EBS volumes fail to mount.
You can set the nofail option to silence error reporting at boot and allow the instance to boot with one or more mount issues.
You should not use this option on systems with locally attached disks, as silencing drive errors prevents both Buckit and the OS from responding to those errors in a normal fashion.
Disable XFS Retry On Error
Buckit strongly recommends disabling retry-on-error behavior using the max_retries configuration for the following error classes:
EIOError when reading or writingENOSPCError no space left on devicedefaultAll other errors
The default max_retries setting typically directs the filesystem to retry-on-error indefinitely instead of propagating the error.
Buckit can handle XFS errors appropriately, such that the retry-on-error behavior introduces at most unnecessary latency or performance degradation.
Note
Buckit installed from the official .deb or .rpm package — including clusters deployed, migrated, or upgraded with the Buckit Manager — applies these settings automatically through the buckit-xfs-retry.timer systemd timer.
The timer also re-applies the settings after a drive hot-swap, whose fresh mount otherwise resets them to the kernel default.
The manual script and cron job below are only required for non-packaged installations, such as a tarball deployment.
The following script iterates through all drives at the specified mount path and sets the XFS max_retries setting to 0 or “fail immediately on error” for the recommended error classes.
The script ignores any drives not mounted, either manually or through /etc/fstab.
Modify the /mnt/drive line to match the pattern used for your Buckit drives.
#!/bin/bash
for i in $(df -h | grep /mnt/drive | awk '{ print $1 }'); do
mountPath="$(df -h | grep $i | awk '{ print $6 }')"
deviceName="$(basename $i)"
echo "Modifying xfs max_retries and retry_timeout_seconds for drive $i mounted at $mountPath"
echo 0 > /sys/fs/xfs/$deviceName/error/metadata/EIO/max_retries
echo 0 > /sys/fs/xfs/$deviceName/error/metadata/ENOSPC/max_retries
echo 0 > /sys/fs/xfs/$deviceName/error/metadata/default/max_retries
done
exit 0
For non-packaged installations, you must run this script on all Buckit nodes and configure the script to re-run on reboot, as Linux Operating Systems do not typically persist these changes.
You can use a cron job with the @reboot timing to run the above script whenever the node restarts and ensure all drives have retry-on-error disabled.
Use crontab -e to create the following job, modifying the script path to match that on each node:
@reboot /opt/minio/xfs-retry-settings.sh
Use Consistent Drive Type and Capacity
Ensure a consistent drive type (NVMe, SSD, HDD) for the underlying storage in a Buckit deployment. Buckit does not distinguish between storage types and does not support configuring “hot” or “warm” drives within a single deployment. Mixing drive types typically results in performance degradation, as the slowest drives in the deployment become a bottleneck regardless of the capabilities of the faster drives.
Use the same capacity and type of drive across all nodes in each Buckit server pool. Buckit limits the maximum usable size per drive to the smallest size in the deployment. For example, if a deployment has 15 10TB drives and 1 1TB drive, Buckit limits the per-drive capacity to 1TB.
Recommended Hardware Tests
Operating System Diagnostic Tools
Test each drive independently on all servers to ensure they are identical in performance. Use the results of these OS-level tools to verify the capabilities of your storage hardware. Record the results for later reference.
Test the drive’s performance during write operations
This tests checks a drive’s ability to write new data (uncached) to the drive by creating a specified number of blocks at up to a certain number of bytes at a time to mimic how a drive would function with writing uncached data. This allows you to see the actual drive performance with consistent file I/O.
dd if=/dev/zero of=/mnt/driveN/testfile bs=128k count=80000 oflag=direct conv=fdatasync > dd-write-drive1.txt
Replace
driveNwith the path for the drive you are testing.ddThe command to copy and paste data.
if=/dev/zeroRead from
/dev/zero, an system-generated endless stream of 0 bytes used to create a file of a specified sizeof=/mnt/driveN/testfileWrite to
/mnt/driveN/testfilebs=128kWrite up to 128,000 bytes at a time
count=80000Write up to 80000 blocks of data
oflag=directUse direct I/O to write to avoid data from caching
conv=fdatasyncPhysically write output file data before finishing
> dd-write-drive1.txtWrite the contents of the operation’s output to
dd-write-drive1.txtin the current working directoryThe operation returns the number of files written, total size written in bytes, the total length of time for the operation (in seconds), and the speed of the writing in some order of bytes per second.
Test the drive’s performance during read operations
dd if=/mnt/driveN/testfile of=/dev/null bs=128k iflag=direct > dd-read-drive1.txt
Replace
driveNwith the path for the drive you are testing.ddThe command to copy and paste data
if=/mnt/driveN/testfileRead from
/mnt/driveN/testfile; replace with the path to the file to use for testing the drive’s read performanceof=/dev/nullWrite to
/dev/null, a virtual file that does not persist after the operation completesbs=128kWrite up to 128,000 bytes at a time
count=80000Write up to 80000 blocks of data
iflag=directUse direct I/O to read and avoid data from caching
> dd-read-drive1.txtWrite the contents of the operation’s output to
dd-read-drive1.txtin the current working directoryUse a sufficiently sized file that mimics the primary use case for your deployment to get accurate read test results.
The following guidelines may help during performance testing:
Small files: < 128KB
Normal files: 128KB – 1GB
Large files: > 1GB
You can use the
headcommand to create a file to use. The following command example creates a 10 Gigabyte file calledtestfile.head -c 10G </dev/urandom > testfile
The operation returns the number of files read, total size read in bytes, the total length of time for the operation (in seconds), and the speed of the reading in bytes per second.
Third Party Diagnostic Tools
IO Controller test
Use IOzone to test the input/output controller and all drives in combination. Document the performance numbers for each server in your deployment.
iozone -s 1g -r 4m -i 0 -i 1 -i 2 -I -t 160 -F /mnt/sdb1/tmpfile.{1..16} /mnt/sdc1/tmpfile.{1..16} /mnt/sdd1/tmpfile.{1..16} /mnt/sde1/tmpfile.{1..16} /mnt/sdf1/tmpfile.{1..16} /mnt/sdg1/tmpfile.{1..16} /mnt/sdh1/tmpfile.{1..16} /mnt/sdi1/tmpfile.{1..16} /mnt/sdj1/tmpfile.{1..16} /mnt/sdk1/tmpfile.{1..16} > iozone.txt
|
Size of 1G per file |
|
4m 4MB block size |
|
0=write/rewrite, 1=read/re-read, 2=random-read/write |
|
Direct-IO modern |
|
Number of threads (\(numberOfDrives * 16\)) |
|
list of files (the above command tests with 16 files per drive) |