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#scratch-nfs-write).
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 locations data blocks throughout the volume, and track 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
We'll go through our throughput tests that we've done before.
143
144
#### SCRATCH NFS WRITE
145
146
```
147
SCRATCH-NFS-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
148
fio-3.28
149
Starting 1 process
150
SCRATCH-NFS-WRITE: Laying out IO file (1 file / 1024MiB)
151
152
SCRATCH-NFS-WRITE: (groupid=0, jobs=1): err= 0: pid=22026: Wed Jul 12 05:22:48 2023
153
write: IOPS=27, BW=54.9MiB/s (57.5MB/s)(4090MiB/74528msec); 0 zone resets
154
slat (usec): min=1115, max=10854, avg=1488.93, stdev=295.11
155
clat (usec): min=3, max=51284, avg=44515.98, stdev=6766.35
156
lat (usec): min=1470, max=62092, avg=46005.17, stdev=6788.76
157
clat percentiles (usec):
158
| 1.00th=[ 6915], 5.00th=[37487], 10.00th=[42730], 20.00th=[43254],
159
| 30.00th=[45876], 40.00th=[46400], 50.00th=[46400], 60.00th=[46924],
160
| 70.00th=[46924], 80.00th=[46924], 90.00th=[47449], 95.00th=[47449],
161
| 99.00th=[49021], 99.50th=[50070], 99.90th=[51119], 99.95th=[51119],
162
| 99.99th=[51119]
163
bw ( KiB/s): min=254076, max=1352340, per=100.00%, avg=930701.33, stdev=392448.73, samples=9
164
iops : min= 124, max= 660, avg=454.22, stdev=191.53, samples=9
165
lat (usec) : 4=0.20%
166
lat (msec) : 2=0.20%, 4=0.20%, 10=0.83%, 20=1.37%, 50=96.77%
167
lat (msec) : 100=0.44%
168
cpu : usr=0.41%, sys=4.87%, ctx=264481, majf=0, minf=12
169
IO depths : 1=0.2%, 2=0.4%, 4=0.8%, 8=1.6%, 16=3.1%, 32=93.9%, >=64=0.0%
170
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
171
complete : 0=0.0%, 4=99.8%, 8=0.0%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
172
issued rwts: total=0,2044,0,0 short=0,0,0,0 dropped=0,0,0,0
173
latency : target=0, window=0, percentile=100.00%, depth=32
174
175
Run status group 0 (all jobs):
176
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
177
```
178
179
#### SCRATCH NFS READ
180
181
```
182
SCRATCH-NFS-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
183
fio-3.28
184
Starting 1 process
185
186
SCRATCH-NFS-READ: (groupid=0, jobs=1): err= 0: pid=22145: Wed Jul 12 05:25:15 2023
187
read: IOPS=26, BW=52.1MiB/s (54.6MB/s)(3170MiB/60845msec)
188
slat (msec): min=13, max=1759, avg=38.18, stdev=180.47
189
clat (usec): min=5, max=2299.4k, avg=1134958.95, stdev=792260.44
190
lat (msec): min=15, max=2312, avg=1173.14, stdev=796.95
191
clat percentiles (msec):
192
| 1.00th=[ 72], 5.00th=[ 460], 10.00th=[ 542], 20.00th=[ 550],
193
| 30.00th=[ 558], 40.00th=[ 558], 50.00th=[ 558], 60.00th=[ 558],
194
| 70.00th=[ 2056], 80.00th=[ 2072], 90.00th=[ 2265], 95.00th=[ 2299],
195
| 99.00th=[ 2299], 99.50th=[ 2299], 99.90th=[ 2299], 99.95th=[ 2299],
196
| 99.99th=[ 2299]
197
bw ( KiB/s): min= 4098, max=188508, per=100.00%, avg=85947.24, stdev=41220.53, samples=74
198
iops : min= 2, max= 92, avg=41.95, stdev=20.12, samples=74
199
lat (usec) : 10=0.25%
200
lat (msec) : 20=0.19%, 50=0.19%, 100=0.57%, 250=1.70%, 500=2.65%
201
lat (msec) : 750=56.82%, 2000=0.95%, >=2000=36.68%
202
cpu : usr=0.02%, sys=6.16%, ctx=5123, majf=0, minf=16408
203
IO depths : 1=0.3%, 2=0.5%, 4=1.0%, 8=2.0%, 16=4.0%, 32=92.2%, >=64=0.0%
204
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
205
complete : 0=0.0%, 4=99.7%, 8=0.0%, 16=0.0%, 32=0.3%, 64=0.0%, >=64=0.0%
206
issued rwts: total=1584,0,0,0 short=0,0,0,0 dropped=0,0,0,0
207
latency : target=0, window=0, percentile=100.00%, depth=32
208
209
Run status group 0 (all jobs):
210
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
211
```
212
213
#### LOCAL WRITE
214
215
```
216
LOCAL-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
217
fio-3.28
218
Starting 1 process
219
LOCAL-WRITE: Laying out IO file (1 file / 1024MiB)
220
221
LOCAL-WRITE: (groupid=0, jobs=1): err= 0: pid=22283: Wed Jul 12 05:28:20 2023
222
write: IOPS=173, BW=348MiB/s (365MB/s)(10.0GiB/29446msec); 0 zone resets
223
slat (usec): min=1087, max=4394, avg=1238.50, stdev=131.52
224
clat (usec): min=3, max=42947, avg=37143.29, stdev=5337.20
225
lat (usec): min=1156, max=44101, avg=38382.06, stdev=5314.32
226
clat percentiles (usec):
227
| 1.00th=[ 6980], 5.00th=[32375], 10.00th=[35914], 20.00th=[37487],
228
| 30.00th=[38011], 40.00th=[38011], 50.00th=[38011], 60.00th=[38536],
229
| 70.00th=[38536], 80.00th=[39060], 90.00th=[39584], 95.00th=[39584],
230
| 99.00th=[40633], 99.50th=[41157], 99.90th=[41681], 99.95th=[42730],
231
| 99.99th=[42730]
232
bw ( KiB/s): min=426192, max=1667886, per=100.00%, avg=1046875.40, stdev=424328.54, samples=20
233
iops : min= 208, max= 814, avg=510.90, stdev=207.06, samples=20
234
lat (usec) : 4=0.21%
235
lat (msec) : 2=0.10%, 4=0.20%, 10=1.02%, 20=1.58%, 50=96.89%
236
cpu : usr=1.83%, sys=31.39%, ctx=7684, majf=0, minf=17
237
IO depths : 1=0.2%, 2=0.4%, 4=0.9%, 8=1.6%, 16=3.1%, 32=93.8%, >=64=0.0%
238
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
239
complete : 0=0.0%, 4=99.8%, 8=0.1%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
240
issued rwts: total=0,5118,0,0 short=0,0,0,0 dropped=0,0,0,0
241
latency : target=0, window=0, percentile=100.00%, depth=32
242
243
Run status group 0 (all jobs):
244
WRITE: bw=348MiB/s (365MB/s), 348MiB/s-348MiB/s (365MB/s-365MB/s), io=10.0GiB (10.7GB), run=29446-29446msec
245
246
Disk stats (read/write):
247
sda: ios=3456/8439, merge=0/45, ticks=445/135160, in_queue=135700, util=92.35%
248
```
249
250
#### LOCAL READ
251
252
```
253
LOCAL-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
254
fio-3.28
255
Starting 1 process
256
257
LOCAL-READ: (groupid=0, jobs=1): err= 0: pid=22386: Wed Jul 12 05:29:52 2023
258
read: IOPS=170, BW=341MiB/s (357MB/s)(10.0GiB/30065msec)
259
slat (usec): min=3203, max=10216, avg=5714.25, stdev=336.53
260
clat (usec): min=2, max=182102, avg=171437.90, stdev=26459.08
261
lat (msec): min=3, max=190, avg=177.15, stdev=26.48
262
clat percentiles (msec):
263
| 1.00th=[ 21], 5.00th=[ 138], 10.00th=[ 167], 20.00th=[ 178],
264
| 30.00th=[ 178], 40.00th=[ 178], 50.00th=[ 178], 60.00th=[ 180],
265
| 70.00th=[ 180], 80.00th=[ 180], 90.00th=[ 180], 95.00th=[ 180],
266
| 99.00th=[ 182], 99.50th=[ 182], 99.90th=[ 182], 99.95th=[ 182],
267
| 99.99th=[ 182]
268
bw ( KiB/s): min=208998, max=458976, per=100.00%, avg=349013.00, stdev=63311.60, samples=60
269
iops : min= 102, max= 224, avg=170.33, stdev=30.90, samples=60
270
lat (usec) : 4=0.02%, 10=0.20%
271
lat (msec) : 4=0.20%, 10=0.21%, 20=0.23%, 50=1.21%, 100=1.60%
272
lat (msec) : 250=96.33%
273
cpu : usr=0.14%, sys=30.15%, ctx=5561, majf=0, minf=16411
274
IO depths : 1=0.2%, 2=0.4%, 4=0.9%, 8=1.6%, 16=3.1%, 32=93.8%, >=64=0.0%
275
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
276
complete : 0=0.0%, 4=99.8%, 8=0.1%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
277
issued rwts: total=5118,0,0,0 short=0,0,0,0 dropped=0,0,0,0
278
latency : target=0, window=0, percentile=100.00%, depth=32
279
280
Run status group 0 (all jobs):
281
READ: bw=341MiB/s (357MB/s), 341MiB/s-341MiB/s (357MB/s-357MB/s), io=10.0GiB (10.7GB), run=30065-30065msec
282
283
Disk stats (read/write):
284
sda: ios=10530/9, merge=50/1, ticks=46614/7, in_queue=46621, util=97.41%
285
```
286
287
#### BeeGFS WRITE
288
289
```
290
BeeGFS-WRITE: (g=0): rw=write, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
291
fio-3.28
292
Starting 1 process
293
BeeGFS-WRITE: Laying out IO file (1 file / 1024MiB)
294
295
BeeGFS-WRITE: (groupid=0, jobs=1): err= 0: pid=22709: Wed Jul 12 05:35:38 2023
296
write: IOPS=34, BW=68.9MiB/s (72.2MB/s)(4132MiB/60005msec); 0 zone resets
297
slat (msec): min=13, max=1582, avg=29.04, stdev=149.64
298
clat (usec): min=7, max=2013.4k, avg=851876.99, stdev=690184.39
299
lat (msec): min=14, max=2027, avg=880.92, stdev=696.79
300
clat percentiles (msec):
301
| 1.00th=[ 57], 5.00th=[ 426], 10.00th=[ 439], 20.00th=[ 439],
302
| 30.00th=[ 443], 40.00th=[ 443], 50.00th=[ 443], 60.00th=[ 443],
303
| 70.00th=[ 447], 80.00th=[ 1955], 90.00th=[ 1972], 95.00th=[ 1989],
304
| 99.00th=[ 2005], 99.50th=[ 2005], 99.90th=[ 2005], 99.95th=[ 2022],
305
| 99.99th=[ 2022]
306
bw ( KiB/s): min= 4098, max=249978, per=100.00%, avg=108783.27, stdev=52595.86, samples=77
307
iops : min= 2, max= 122, avg=53.09, stdev=25.67, samples=77
308
lat (usec) : 10=0.19%, 20=0.05%
309
lat (msec) : 20=0.24%, 50=0.44%, 100=0.73%, 250=1.60%, 500=68.81%
310
lat (msec) : 2000=26.44%, >=2000=1.50%
311
cpu : usr=0.86%, sys=9.71%, ctx=445229, majf=0, minf=16
312
IO depths : 1=0.2%, 2=0.5%, 4=1.0%, 8=1.9%, 16=3.4%, 32=93.0%, >=64=0.0%
313
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
314
complete : 0=0.0%, 4=99.7%, 8=0.0%, 16=0.0%, 32=0.3%, 64=0.0%, >=64=0.0%
315
issued rwts: total=0,2065,0,0 short=0,0,0,0 dropped=0,0,0,0
316
latency : target=0, window=0, percentile=100.00%, depth=32
317
318
Run status group 0 (all jobs):
319
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
320
```
321
322
#### BeeGFS READ
323
324
```
325
BeeGFS-READ: (g=0): rw=read, bs=(R) 2049KiB-2049KiB, (W) 2049KiB-2049KiB, (T) 2049KiB-2049KiB, ioengine=libaio, iodepth=32
326
fio-3.28
327
Starting 1 process
328
BeeGFS-READ: Laying out IO file (1 file / 1024MiB)
329
330
BeeGFS-READ: (groupid=0, jobs=1): err= 0: pid=22827: Wed Jul 12 05:37:41 2023
331
read: IOPS=67, BW=135MiB/s (142MB/s)(8106MiB/60001msec)
332
slat (msec): min=14, max=215, avg=14.80, stdev= 8.33
333
clat (usec): min=8, max=669906, avg=444903.42, stdev=80659.05
334
lat (msec): min=14, max=684, avg=459.70, stdev=81.14
335
clat percentiles (msec):
336
| 1.00th=[ 72], 5.00th=[ 359], 10.00th=[ 443], 20.00th=[ 447],
337
| 30.00th=[ 447], 40.00th=[ 447], 50.00th=[ 447], 60.00th=[ 447],
338
| 70.00th=[ 447], 80.00th=[ 447], 90.00th=[ 464], 95.00th=[ 642],
339
| 99.00th=[ 651], 99.50th=[ 651], 99.90th=[ 659], 99.95th=[ 667],
340
| 99.99th=[ 667]
341
bw ( KiB/s): min=12294, max=266370, per=99.22%, avg=137265.78, stdev=28838.77, samples=119
342
iops : min= 6, max= 130, avg=66.99, stdev=14.07, samples=119
343
lat (usec) : 10=0.05%, 20=0.15%
344
lat (msec) : 20=0.20%, 50=0.39%, 100=0.59%, 250=2.17%, 500=91.09%
345
lat (msec) : 750=5.36%
346
cpu : usr=0.06%, sys=20.48%, ctx=448073, majf=0, minf=16412
347
IO depths : 1=0.2%, 2=0.4%, 4=0.8%, 8=1.6%, 16=3.2%, 32=93.9%, >=64=0.0%
348
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
349
complete : 0=0.0%, 4=99.8%, 8=0.0%, 16=0.0%, 32=0.2%, 64=0.0%, >=64=0.0%
350
issued rwts: total=4051,0,0,0 short=0,0,0,0 dropped=0,0,0,0
351
latency : target=0, window=0, percentile=100.00%, depth=32
352
353
Run status group 0 (all jobs):
354
READ: bw=135MiB/s (142MB/s), 135MiB/s-135MiB/s (142MB/s-142MB/s), io=8106MiB (8500MB), run=60001-60001msec
355
```
356
357
Tests all ran on `IMAGING-02`.
358
Scratch NFS = ~57MB/s read/write
359
BeeGFS = ~80MB/s write, ~140MB/s read
360
361
This is about a 50% improvement for write operations,
362
and a 150% improvement for read operations.