Blame

973186 Dave LeBlanc 2026-11-13 19:59:58
Initial BeeGFS updated on Fri Nov 13 19:59:21 2026
1
# BeeGFS
6a3b54 Dave LeBlanc 2026-11-13 20:18:19
BeeGFS updated on Fri Nov 13 20:18:04 2026
2
3
A particular need has risen that a research group needs large amounts of storage space, yet reliable and fast.
4
5
Traditionally, central file storage is relatively slow, especially when implemented with NFS, as its designed for availability and reliability and not speed.
6
7
As an option, we've installed additional 14TB drives in a few machines, 7TB drives in a few others, and made those available as an aggregate storage volume that is faster than NFS.
8
The disadvantage is that this architecture requires several services to be up and running else the entire volume/filesystem will become unavailable or unstable.
9
10
After considerable testing and experimentation, BeeGFS tends to perform better than other alternatives, though with the aforementioned downside of required services.
11
For specifics on the testing done, see [Throughput](/Main/BeeGFS#throughput-testing).
12
13
## Implementation
14
We're going off the [BeeGFS Quickstart](https://doc.beegfs.io/latest/quick_start_guide/quick_start_guide.html#example-setup).
15
16
We're installing on Ubuntu 22.04 LTS.
17
First, we'll add the repositories, then we'll add the packages and configure.
18
19
### Repository Keys
20
Since things have changed slightly since the test (below), we need to add the GPG repository key in a different way than is noted in BeeGFS Quickstart.
21
`wget -qOhttps://website/release/GPG-KEY | apt-key add -` will no longer work as it has been DEPRECATED.
22
Now, use the following format:
23
24
```
25
wget -qO- https://www.beegfs.io/release/beegfs_7.3.4/gpg/GPG-KEY-beegfs | \
26
gpg --dearmor > /etc/apt/trusted.gpg.d/beegfs.gpg
27
```
28
29
which will strip the key of its encryption, creating it as a binary.
30
Next, we'll add the repo:
31
32
```
33
# /etc/apt/sources.list.d/beegfs-jammy.list
34
deb https://www.beegfs.io/release/beegfs_7.3.4 jammy non-free
35
```
36
37
This should make all beegfs packages available to us.
38
39
### BeeGFS-MGMTD
40
We need to have a `mgmtd` server, to orchestrate the goings on.
41
In Imaging, we'll make this `IMAGING-01`.
42
This means that the MGMTD service needs to be constantly running and available on IMAGING-01, else the BeeGFS filesystem will appear unavailable.
43
This is done ala:
44
45
```
46
> /opt/beegfs/sbin/beegfs-setup-mgmtd -p /opt/beegfs/mgmtd
47
48
```
49
50
This will create files in `/opt/beegfs/mgmtd` to keep track.
51
We will need to edit the `/etc/beegfs/beegfs-mgmtd.conf` file to include the `connauthfile` directive.
52
We'll create the `connauthfile`:
53
54
```
55
> dd if=/dev/random of=/etc/beegfs/connauthfile bs=128 count=1
56
> chown root.root /etc/beegfs/connauthfile
57
> chmod 400 /etc/beegfs/connauthfile
58
```
59
60
And that file we will need to be copied to every participating node, whether storage, client, or other.
61
62
### BeeGFS-META
63
We need to have a `-meta` server to keep track of the files in the filesystem.
64
This will be the service that locates data blocks throughout the volume, and tracks which system the data is on.
65
This service also needs to be constantly available, else clients will not be able to access data.
66
67
We'll mirror this later, but for now we only need one, and install it onto `IMAGING-01` with:
68
69
```
70
> /opt/beegfs/sbin/beegfs-setup-meta -p /opt/beegfs/meta/ -s 1 -m imaging-01
71
```
72
Then edit the `/etc/beegfs/beegfs-meta.conf` file to include the `connauthfile` directive.
73
74
### BeeGFS-STORAGE
75
Of course we have to declare the storage, and in Imaging its no different.
76
The following is a breakout:
77
78
| Host | Device | Size |
79
| ------------ | ---------------- | ---- |
80
| `IMAGING-01` | `/dev/sdb1` | 12T |
81
| `IMAGING-02` | `/dev/sdb1` | 12T |
82
| `IMAGING-03` | `/dev/nvme1n1p1` | 7T |
83
| `IMAGING-04` | `/dev/nvme1n1p1` | 7T |
84
This should create a 37T volume of space, located under… we'll get to that.
85
First, configuration with:
86
87
```
88
> /opt/beegfs/sbin/beegfs-setup-storage -p /mnt/14t_drive -s1 -i 101 -m imaging-01
89
```
90
91
The `/mnt/14t_drive` is different on `-03` and `-04`, as those are mounted as `/mnt/7t_drive`.
92
The `-s1` and `-i 101` here indicate that we're on `IMAGING-01`, the first server, and naming the storage target the first one.
93
On `IMAGING-02`, it would look like `-s2 -i 201`, with the same `-m imaging-01` since that is still our `-mgmtd` node.
94
Also, edit the `/etc/beegfs/beegfs-storage.conf` to include the `connauthfile` directive.
95
96
### BeeGFS-CLIENT
97
Of course each system is going to be its own client.
98
99
```
100
> /opt/beegfs/sbin/beegfs-setup-client -m imaging-01
101
```
102
103
Also, edit the `/etc/beegfs/beegfs-client.conf` to include the `connauthfile` directive.
104
Additionally, we'll need the `beegfs-helperd` package installed, and configured via the `/etc/beegfs/beegfs-helperd.conf` file to include the `connauthfile` directive.
105
106
### BeeGFS-MOUNT
107
Finally, each client that will be mounting the filesystem will have a list of mounted and client config files in `/etc/beegfs/beegfs-mount.conf` that looks similar to:
108
109
```
110
/srv/tmp /etc/beegfs/beegfs-client.conf
111
```
112
113
As you guessed it, the system will mount the filesystem onto `/srv/tmp`.
114
115
## Daemon Launch/Enable
116
On `IMAGING-01` (the `-mgmtd` and `-meta` node),
117
Launch:
118
`systemctl start beegfs-mgmtd`
119
`systemctl start beegfs-meta`
120
and check for errors (they may fail silently).
121
122
On all participating nodes (`IMAGING-01 thru -04`)
123
Launch:
124
`systemctl start beegfs-storage`
125
`systemctl start beegfs-helperd`
126
`systemctl start beegfs-client`
127
and check for errors.
128
129
## Checking Validity
130
If everything went as expected, you should be able to verify with some `beegfs-utils` commands ala:
131
132
```bash
133
> beegfs-ctl --listnodes --nodetype=management --details
134
> beegfs-ctl --listnodes --nodetype=meta --details
135
> beegfs-ctl --listnodes --nodetype=storage --details
136
> beegfs-ctl --listnodes --nodetype=client --details
137
> beegfs-df
138
> beegfs-net
139
> beegfs-check-servers
140
```
141
142
### Throughput testing
143
We'll go through our throughput tests that we've done before.
144
145
#### SCRATCH NFS WRITE
146
147
```
148
SCRATCH-NFS-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
149
fio-3.28
150
Starting 1 process
151
SCRATCH-NFS-WRITE: Laying out IO file (1 file / 1024MiB)
152
153
SCRATCH-NFS-WRITE: (groupid=0, jobs=1): err= 0: pid=22026: Wed Jul 12 05:22:48 2023
154
write: IOPS=27, BW=54.9MiB/s (57.5MB/s)(4090MiB/74528msec); 0 zone resets
155
slat (usec): min=1115, max=10854, avg=1488.93, stdev=295.11
156
clat (usec): min=3, max=51284, avg=44515.98, stdev=6766.35
157
lat (usec): min=1470, max=62092, avg=46005.17, stdev=6788.76
158
clat percentiles (usec):
159
| 1.00th=[ 6915], 5.00th=[37487], 10.00th=[42730], 20.00th=[43254],
160
| 30.00th=[45876], 40.00th=[46400], 50.00th=[46400], 60.00th=[46924],
161
| 70.00th=[46924], 80.00th=[46924], 90.00th=[47449], 95.00th=[47449],
162
| 99.00th=[49021], 99.50th=[50070], 99.90th=[51119], 99.95th=[51119],
163
| 99.99th=[51119]
164
bw ( KiB/s): min=254076, max=1352340, per=100.00%, avg=930701.33, stdev=392448.73, samples=9
165
iops : min= 124, max= 660, avg=454.22, stdev=191.53, samples=9
166
lat (usec) : 4=0.20%
167
lat (msec) : 2=0.20%, 4=0.20%, 10=0.83%, 20=1.37%, 50=96.77%
168
lat (msec) : 100=0.44%
169
cpu : usr=0.41%, sys=4.87%, ctx=264481, majf=0, minf=12
170
IO depths : 1=0.2%, 2=0.4%, 4=0.8%, 8=1.6%, 16=3.1%, 32=93.9%, >=64=0.0%
171
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
172
complete : 0=0.0%, 4=99.8%, 8=0.0%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
173
issued rwts: total=0,2044,0,0 short=0,0,0,0 dropped=0,0,0,0
174
latency : target=0, window=0, percentile=100.00%, depth=32
175
176
Run status group 0 (all jobs):
177
WRITE: bw=54.9MiB/s (57.5MB/s), 54.9MiB/s-54.9MiB/s (57.5MB/s-57.5MB/s), io=4090MiB (4289MB), run=74528-74528msec
178
```
179
180
#### SCRATCH NFS READ
181
182
```
183
SCRATCH-NFS-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
184
fio-3.28
185
Starting 1 process
186
187
SCRATCH-NFS-READ: (groupid=0, jobs=1): err= 0: pid=22145: Wed Jul 12 05:25:15 2023
188
read: IOPS=26, BW=52.1MiB/s (54.6MB/s)(3170MiB/60845msec)
189
slat (msec): min=13, max=1759, avg=38.18, stdev=180.47
190
clat (usec): min=5, max=2299.4k, avg=1134958.95, stdev=792260.44
191
lat (msec): min=15, max=2312, avg=1173.14, stdev=796.95
192
clat percentiles (msec):
193
| 1.00th=[ 72], 5.00th=[ 460], 10.00th=[ 542], 20.00th=[ 550],
194
| 30.00th=[ 558], 40.00th=[ 558], 50.00th=[ 558], 60.00th=[ 558],
195
| 70.00th=[ 2056], 80.00th=[ 2072], 90.00th=[ 2265], 95.00th=[ 2299],
196
| 99.00th=[ 2299], 99.50th=[ 2299], 99.90th=[ 2299], 99.95th=[ 2299],
197
| 99.99th=[ 2299]
198
bw ( KiB/s): min= 4098, max=188508, per=100.00%, avg=85947.24, stdev=41220.53, samples=74
199
iops : min= 2, max= 92, avg=41.95, stdev=20.12, samples=74
200
lat (usec) : 10=0.25%
201
lat (msec) : 20=0.19%, 50=0.19%, 100=0.57%, 250=1.70%, 500=2.65%
202
lat (msec) : 750=56.82%, 2000=0.95%, >=2000=36.68%
203
cpu : usr=0.02%, sys=6.16%, ctx=5123, majf=0, minf=16408
204
IO depths : 1=0.3%, 2=0.5%, 4=1.0%, 8=2.0%, 16=4.0%, 32=92.2%, >=64=0.0%
205
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
206
complete : 0=0.0%, 4=99.7%, 8=0.0%, 16=0.0%, 32=0.3%, 64=0.0%, >=64=0.0%
207
issued rwts: total=1584,0,0,0 short=0,0,0,0 dropped=0,0,0,0
208
latency : target=0, window=0, percentile=100.00%, depth=32
209
210
Run status group 0 (all jobs):
211
READ: bw=52.1MiB/s (54.6MB/s), 52.1MiB/s-52.1MiB/s (54.6MB/s-54.6MB/s), io=3170MiB (3324MB), run=60845-60845msec
212
```
213
214
#### LOCAL WRITE
215
216
```
217
LOCAL-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
218
fio-3.28
219
Starting 1 process
220
LOCAL-WRITE: Laying out IO file (1 file / 1024MiB)
221
222
LOCAL-WRITE: (groupid=0, jobs=1): err= 0: pid=22283: Wed Jul 12 05:28:20 2023
223
write: IOPS=173, BW=348MiB/s (365MB/s)(10.0GiB/29446msec); 0 zone resets
224
slat (usec): min=1087, max=4394, avg=1238.50, stdev=131.52
225
clat (usec): min=3, max=42947, avg=37143.29, stdev=5337.20
226
lat (usec): min=1156, max=44101, avg=38382.06, stdev=5314.32
227
clat percentiles (usec):
228
| 1.00th=[ 6980], 5.00th=[32375], 10.00th=[35914], 20.00th=[37487],
229
| 30.00th=[38011], 40.00th=[38011], 50.00th=[38011], 60.00th=[38536],
230
| 70.00th=[38536], 80.00th=[39060], 90.00th=[39584], 95.00th=[39584],
231
| 99.00th=[40633], 99.50th=[41157], 99.90th=[41681], 99.95th=[42730],
232
| 99.99th=[42730]
233
bw ( KiB/s): min=426192, max=1667886, per=100.00%, avg=1046875.40, stdev=424328.54, samples=20
234
iops : min= 208, max= 814, avg=510.90, stdev=207.06, samples=20
235
lat (usec) : 4=0.21%
236
lat (msec) : 2=0.10%, 4=0.20%, 10=1.02%, 20=1.58%, 50=96.89%
237
cpu : usr=1.83%, sys=31.39%, ctx=7684, majf=0, minf=17
238
IO depths : 1=0.2%, 2=0.4%, 4=0.9%, 8=1.6%, 16=3.1%, 32=93.8%, >=64=0.0%
239
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
240
complete : 0=0.0%, 4=99.8%, 8=0.1%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
241
issued rwts: total=0,5118,0,0 short=0,0,0,0 dropped=0,0,0,0
242
latency : target=0, window=0, percentile=100.00%, depth=32
243
244
Run status group 0 (all jobs):
245
WRITE: bw=348MiB/s (365MB/s), 348MiB/s-348MiB/s (365MB/s-365MB/s), io=10.0GiB (10.7GB), run=29446-29446msec
246
247
Disk stats (read/write):
248
sda: ios=3456/8439, merge=0/45, ticks=445/135160, in_queue=135700, util=92.35%
249
```
250
251
#### LOCAL READ
252
253
```
254
LOCAL-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
255
fio-3.28
256
Starting 1 process
257
258
LOCAL-READ: (groupid=0, jobs=1): err= 0: pid=22386: Wed Jul 12 05:29:52 2023
259
read: IOPS=170, BW=341MiB/s (357MB/s)(10.0GiB/30065msec)
260
slat (usec): min=3203, max=10216, avg=5714.25, stdev=336.53
261
clat (usec): min=2, max=182102, avg=171437.90, stdev=26459.08
262
lat (msec): min=3, max=190, avg=177.15, stdev=26.48
263
clat percentiles (msec):
264
| 1.00th=[ 21], 5.00th=[ 138], 10.00th=[ 167], 20.00th=[ 178],
265
| 30.00th=[ 178], 40.00th=[ 178], 50.00th=[ 178], 60.00th=[ 180],
266
| 70.00th=[ 180], 80.00th=[ 180], 90.00th=[ 180], 95.00th=[ 180],
267
| 99.00th=[ 182], 99.50th=[ 182], 99.90th=[ 182], 99.95th=[ 182],
268
| 99.99th=[ 182]
269
bw ( KiB/s): min=208998, max=458976, per=100.00%, avg=349013.00, stdev=63311.60, samples=60
270
iops : min= 102, max= 224, avg=170.33, stdev=30.90, samples=60
271
lat (usec) : 4=0.02%, 10=0.20%
272
lat (msec) : 4=0.20%, 10=0.21%, 20=0.23%, 50=1.21%, 100=1.60%
273
lat (msec) : 250=96.33%
274
cpu : usr=0.14%, sys=30.15%, ctx=5561, majf=0, minf=16411
275
IO depths : 1=0.2%, 2=0.4%, 4=0.9%, 8=1.6%, 16=3.1%, 32=93.8%, >=64=0.0%
276
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
277
complete : 0=0.0%, 4=99.8%, 8=0.1%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
278
issued rwts: total=5118,0,0,0 short=0,0,0,0 dropped=0,0,0,0
279
latency : target=0, window=0, percentile=100.00%, depth=32
280
281
Run status group 0 (all jobs):
282
READ: bw=341MiB/s (357MB/s), 341MiB/s-341MiB/s (357MB/s-357MB/s), io=10.0GiB (10.7GB), run=30065-30065msec
283
284
Disk stats (read/write):
285
sda: ios=10530/9, merge=50/1, ticks=46614/7, in_queue=46621, util=97.41%
286
```
287
288
#### BeeGFS WRITE
289
290
```
291
BeeGFS-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
292
fio-3.28
293
Starting 1 process
294
BeeGFS-WRITE: Laying out IO file (1 file / 1024MiB)
295
296
BeeGFS-WRITE: (groupid=0, jobs=1): err= 0: pid=22709: Wed Jul 12 05:35:38 2023
297
write: IOPS=34, BW=68.9MiB/s (72.2MB/s)(4132MiB/60005msec); 0 zone resets
298
slat (msec): min=13, max=1582, avg=29.04, stdev=149.64
299
clat (usec): min=7, max=2013.4k, avg=851876.99, stdev=690184.39
300
lat (msec): min=14, max=2027, avg=880.92, stdev=696.79
301
clat percentiles (msec):
302
| 1.00th=[ 57], 5.00th=[ 426], 10.00th=[ 439], 20.00th=[ 439],
303
| 30.00th=[ 443], 40.00th=[ 443], 50.00th=[ 443], 60.00th=[ 443],
304
| 70.00th=[ 447], 80.00th=[ 1955], 90.00th=[ 1972], 95.00th=[ 1989],
305
| 99.00th=[ 2005], 99.50th=[ 2005], 99.90th=[ 2005], 99.95th=[ 2022],
306
| 99.99th=[ 2022]
307
bw ( KiB/s): min= 4098, max=249978, per=100.00%, avg=108783.27, stdev=52595.86, samples=77
308
iops : min= 2, max= 122, avg=53.09, stdev=25.67, samples=77
309
lat (usec) : 10=0.19%, 20=0.05%
310
lat (msec) : 20=0.24%, 50=0.44%, 100=0.73%, 250=1.60%, 500=68.81%
311
lat (msec) : 2000=26.44%, >=2000=1.50%
312
cpu : usr=0.86%, sys=9.71%, ctx=445229, majf=0, minf=16
313
IO depths : 1=0.2%, 2=0.5%, 4=1.0%, 8=1.9%, 16=3.4%, 32=93.0%, >=64=0.0%
314
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
315
complete : 0=0.0%, 4=99.7%, 8=0.0%, 16=0.0%, 32=0.3%, 64=0.0%, >=64=0.0%
316
issued rwts: total=0,2065,0,0 short=0,0,0,0 dropped=0,0,0,0
317
latency : target=0, window=0, percentile=100.00%, depth=32
318
319
Run status group 0 (all jobs):
320
WRITE: bw=68.9MiB/s (72.2MB/s), 68.9MiB/s-68.9MiB/s (72.2MB/s-72.2MB/s), io=4132MiB (4333MB), run=60005-60005msec
321
```
322
323
#### BeeGFS READ
324
325
```
326
BeeGFS-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
327
fio-3.28
328
Starting 1 process
329
BeeGFS-READ: Laying out IO file (1 file / 1024MiB)
330
331
BeeGFS-READ: (groupid=0, jobs=1): err= 0: pid=22827: Wed Jul 12 05:37:41 2023
332
read: IOPS=67, BW=135MiB/s (142MB/s)(8106MiB/60001msec)
333
slat (msec): min=14, max=215, avg=14.80, stdev= 8.33
334
clat (usec): min=8, max=669906, avg=444903.42, stdev=80659.05
335
lat (msec): min=14, max=684, avg=459.70, stdev=81.14
336
clat percentiles (msec):
337
| 1.00th=[ 72], 5.00th=[ 359], 10.00th=[ 443], 20.00th=[ 447],
338
| 30.00th=[ 447], 40.00th=[ 447], 50.00th=[ 447], 60.00th=[ 447],
339
| 70.00th=[ 447], 80.00th=[ 447], 90.00th=[ 464], 95.00th=[ 642],
340
| 99.00th=[ 651], 99.50th=[ 651], 99.90th=[ 659], 99.95th=[ 667],
341
| 99.99th=[ 667]
342
bw ( KiB/s): min=12294, max=266370, per=99.22%, avg=137265.78, stdev=28838.77, samples=119
343
iops : min= 6, max= 130, avg=66.99, stdev=14.07, samples=119
344
lat (usec) : 10=0.05%, 20=0.15%
345
lat (msec) : 20=0.20%, 50=0.39%, 100=0.59%, 250=2.17%, 500=91.09%
346
lat (msec) : 750=5.36%
347
cpu : usr=0.06%, sys=20.48%, ctx=448073, majf=0, minf=16412
348
IO depths : 1=0.2%, 2=0.4%, 4=0.8%, 8=1.6%, 16=3.2%, 32=93.9%, >=64=0.0%
349
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
350
complete : 0=0.0%, 4=99.8%, 8=0.0%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
351
issued rwts: total=4051,0,0,0 short=0,0,0,0 dropped=0,0,0,0
352
latency : target=0, window=0, percentile=100.00%, depth=32
353
354
Run status group 0 (all jobs):
355
READ: bw=135MiB/s (142MB/s), 135MiB/s-135MiB/s (142MB/s-142MB/s), io=8106MiB (8500MB), run=60001-60001msec
356
```
357
358
Tests all ran on `IMAGING-02`.
359
Scratch NFS = ~57MB/s read/write
360
BeeGFS = ~80MB/s write, ~140MB/s read
361
362
This is about a 50% improvement for write operations,