Post

My Latest Build 112 Threads 2Tb Ram 128Tb Ssd Storage Freebsd And Llamacpp

My Latest Build 112 Threads 2Tb Ram 128Tb Ssd Storage Freebsd And Llamacpp

Introduction

The relentless growth of data‑intensive workloads has turned storage architecture into a cornerstone of modern homelab and self‑hosted environments. When a single build ships with 112 logical threads, 2 TB of ECC memory, and a staggering 128 TB of SSD capacity, the challenge shifts from simply adding disks to mastering the nuances of file‑system selection, data tiering, and I/O scheduling. This post dissects the storage subsystem of a recent high‑end test rig that runs FreeBSD 15.1 alongside Llama.cpp for local LLM experimentation. Readers will gain a clear understanding of why the choices made here matter for anyone building a resilient, high‑performance storage layer in a DevOps‑centric homelab.

Key takeaways include:

  • How to evaluate and provision massive SSD pools on FreeBSD using ZFS.
  • Practical tuning parameters that extract maximum throughput from 128 TB of flash.
  • Strategies for organizing model weights, datasets, and backups without compromising performance.
  • Integration points between storage management and compute‑heavy workloads such as Llama.cpp.

By the end of this guide, you will have a blueprint for designing a storage fabric that scales with both capacity and workload complexity, while staying firmly within the boundaries of open‑source best practices.


Understanding the Topic

What is “My Latest Build 112 Threads 2Tb Ram 128Tb Ssd Storage Freebsd And Llamacpp”?

The phrase describes a concrete hardware and software configuration:

  • Compute – Four Intel Xeon Gold 6140 CPUs delivering 56 physical cores and 112 threads at 3.7 GHz.
  • Memory – 2 TB of DDR4 ECC RAM operating at 3200 MHz.
  • Storage – Sixteen Samsung 9100 Pro 8 TB SSDs aggregated into a 128 TB pool.
  • Network – 100 GbE connectivity for low‑latency data exchange.
  • Operating System – FreeBSD 15.1, chosen for its mature ZFS implementation and robust networking stack.
  • Application – Llama.cpp, a lightweight C++ inference engine for running large language models locally.

In the context of storage management, the focus is on how the 128 TB SSD array is organized, formatted, and accessed to support both high‑throughput file serving and the demanding I/O patterns of LLM inference.

Historical Context

ZFS arrived on FreeBSD in 2014, bringing features such as copy‑on‑write semantics, integrated data integrity verification, and native compression. Over the years, the platform has matured to support large‑scale SSD deployments, but the fundamentals of pool design remain unchanged. The current generation of NVMe‑based SSDs, however, pushes the envelope for sequential and random I/O, demanding a fresh look at vdev composition, ashift settings, and allocation policies.

Core Capabilities

  • Pool Layout – The 16 × 8 TB Samsung 9100 Pro drives are arranged into four vdevs, each comprising four drives in a mirrored configuration. This yields a 64 TB raw capacity per vdev, combined into a 128 TB mirrored pool with double‑sided redundancy.
  • Filesystem Tuning – ZFS parameters such as ashift=12, compression=lz4, and recordsize=128K are selected to align with the typical block size of model checkpoint files and to maximize sequential read/write efficiency.
  • Performance Characteristics – With 2 TB of RAM, the system can cache a substantial portion of the SSD dataset, reducing latency for repeated LLM model loads.
  • Integration with Llama.cpp – Model files (often several gigabytes each) are stored as regular files within a dedicated ZFS dataset, enabling memory‑mapped loading directly into the inference process.

Pros and Cons

AdvantageExplanation
Data IntegrityZFS checksums every block, protecting against silent corruption on high‑capacity media.
Scalable RedundancyMirror‑based vdevs provide fault tolerance without the overhead of parity‑heavy RAID‑Z.
Native CompressionLZ4 compression reduces stored footprint of model checkpoints by up to 30 % with negligible CPU impact.
High Thread Count112 logical threads can saturate multiple I/O pipelines simultaneously, ideal for concurrent model serving.
LimitationMitigation
Complex vdev PlanningUse automated tools like zpool create scripts to validate mirror sizing before deployment.
Memory PressureReserve a portion of RAM for ZFS ARC to avoid swapping under heavy load.
SSD WearEnable zfs set autotrim=on and schedule periodic trims to distribute write amplification evenly.

Comparison to Alternatives

  • Hardware RAID Controllers – FreeBSD’s native ZFS eliminates the need for external RAID cards, reducing cost and complexity while preserving end‑to‑end data integrity.
  • Ceph or GlusterFS – Distributed object stores introduce network overhead that is unnecessary for a single‑node homelab; ZFS provides sufficient performance for local workloads.
  • EXT4 or XFS – Traditional file systems lack built‑in checksumming and compression, making them less suitable for large, integrity‑sensitive datasets.

Real‑World Applications

  • Model Repository Hosting – Storing dozens of LLM checkpoints (e.g., LLaMA‑2‑13B, GPT‑Neo‑2.7B) on a shared ZFS dataset enables rapid provisioning of new models via simple cp operations.
  • Backup Targets – Snapshots of critical datasets can be replicated to an off‑site NFS server, providing point‑in‑time recovery without disrupting active workloads.
  • Data‑Intensive Analytics – Large CSV or Parquet files used for training data pipelines benefit from ZFS’s recordsize tuning, achieving throughput comparable to dedicated storage appliances.

Prerequisites

Hardware Requirements

ComponentMinimum SpecificationRecommended Specification
CPUs4 × Xeon Gold 6140 (or equivalent)Same or newer generation with AVX‑512 support
Memory2 TB DDR4 ECC2 TB DDR4 ECC, 3200 MHz
Storage128 TB SSD capacity128 TB SSD, NVMe‑based, 8 TB modules
Network10 GbE minimum100 GbE NIC with appropriate cabling
MotherboardServer‑grade with sufficient PCIe lanesWorkstation or server board with 4‑socket support

Software Requirements

ItemVersionNotes
FreeBSD15.1Must be installed with ZFS enabled in the kernel.
OpenZFS utilities2.2.0Provides zpool, zfs, and zfsd utilities.
Llama.cpp0.2.0 (or latest)Compiled from source; requires a C++17 compiler.
SSHOpenSSH 9.2For remote administration.
MonitoringPrometheus Node Exporter 1.8.2Optional, for metrics collection.

Network and Security Considerations

  • Network Segmentation – Place the storage node on a dedicated VLAN to isolate traffic from production workloads.
  • SSH Hardening – Disable root login, enforce key‑based authentication, and limit SSH to specific IP ranges.
  • Firewall – Use pf to restrict inbound access to only necessary ports (e.g., 22 for SSH, 80/443 for web‑based model browsers).

User Permissions

  • Create a dedicated system user llama for running inference processes.
  • Grant zfs dataset permissions to this user via chmod or POSIX ACLs, ensuring that only authorized processes can read model files.

Pre‑Installation Checklist

  1. Verify that all 16 SSDs are detected by camcontrol and report the correct device names.
  2. Confirm that the system BIOS is set to AHCI mode for optimal NVMe performance.
  3. Allocate a separate ZFS pool for the OS (rpool) to avoid mixing system and data volumes.
  4. Reserve at least 64 GB of RAM for the ZFS ARC cache, leaving the remainder for application workloads.
  5. Backup the current /etc/fstab and /etc/rc.conf files before making modifications.

Installation & Setup

Creating the ZFS Pool

The following command assembles the 128 TB pool from sixteen 8 TB Samsung 9100 Pro drives. Each vdev consists of four drives in a mirrored configuration, providing both capacity and redundancy.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Identify the raw devices
$ ls /dev/da*

# Example output: da0 da1 da2 da3 da4 da5 da6 da7 da8 da9 da10 da11 da12 da13 da14 da15

# Create four vdevs, each a mirror of four disks
$ zpool create -f \
  -o ashift=12 \
  -O compression=lz4 \
  -O atime=off \
  -O recordsize=128K \
  -m none \
  data mirror /dev/da0 /dev/da1 \
  mirror /dev/da2 /dev/da3 \
  mirror /dev/da4 /dev/da5 \
  mirror /dev/da6 /dev/da7 \
  mirror /dev/da8 /dev/da9 \
  mirror /dev/da10 /dev/da11 \
  mirror /dev/da12 /dev/da13 \
  mirror /dev/da14 /dev/da15

# Verify pool status
$ zpool status data

Explanation of Flags

  • -ashift=12 – Aligns writes to 4 KB sectors, optimal for 4 KB‑native SSDs.
  • -O compression=lz4 – Enables on‑the‑fly LZ4 compression, reducing stored size without significant CPU overhead.
  • -O recordsize=128K – Sets a larger record size suited for large model checkpoint files, improving sequential throughput.

Dataset Creation

Within the data pool, create separate datasets for model storage, backups, and temporary workspace.

1
2
3
4
5
6
7
8
# Create a dataset for LLM model weights
$ zfs create -o mountpoint=/mnt/models data/models

# Create a dataset for backups
$ zfs create -o mountpoint=/mnt/backups data/backups

# Create a temporary workspace for large data shuffles
$ zfs create -o mountpoint=/mnt/tmp data/tmp

Set appropriate permissions for the llama user:

1
2
3
# Allow the llama user to read/write in the models dataset
$ chown -R llama:llama /mnt/models
$ chmod -R 750 /mnt/models

Mounting the Datasets

Ensure datasets are automatically mounted at boot by adding entries to /etc/fstab.

1
2
3
4
# /etc/fstab entries
data/models   /mnt/models   zfs   defaults   0   0
data/backups  /mnt/backups  zfs   defaults   0   0
data/tmp      /mnt/tmp      zfs   defaults   0   0

Reload the file system table without rebooting:

1
$ mount -a

Installing Llama.cpp

Clone the repository, compile, and install the binary to a location in the system PATH.

1
2
3
4
5
6
7
8
9
# Clone the source
$ git clone https://github.com/ggerganov/llama.cpp.git /opt/llama.cpp

# Build with AVX2/AVX512 optimizations
$ cd /opt/llama.cpp
$ make LLAMA_AVX=1 LLAMA_AVX2=1 LLAMA_AVX512=1

# Install the binary globally
$ sudo cp ./main /usr/local/bin/llama.cpp

Verify the installation:

1
2
$ llama.cpp --version
llama.cpp version 0.2.0

Loading Model Files

Place model checkpoint files (e.g., ggml-model-q4_0.bin) into /mnt/models. The inference command can directly memory‑map these files:

1
$ llama.cpp -m /mnt/models/ggml-model-q4_0.bin -p "Hello, world!" -n 128

The -m flag points to the model file, while -p supplies the prompt and -n controls the generation length.


Configuration & Optimization

ZFS Tuning Parameters

  • ARC Size – Reserve a fixed portion of RAM for the Adaptive Replacement Cache.
1
2
# Set ARC_MAX to 1.5 TB (leaving ~500 GB for applications)
$ sysctl vfs.zfs.arc_max=1572864000
  • Log Device (SLOG) – For workloads requiring synchronous writes, consider adding a dedicated NVMe
This post is licensed under CC BY 4.0 by the author.