Performance Probleme

Feb 2, 2024
98
3
8
Guten Tag,

zum Einsatz kommen Dell PowerEdge Server (neuste Generation) mit NVMe Enterprise SSD. Sowohl auf Proxmox VE Seite, als auch auf PBS Seite.
Es laufen immer 3 parallele Backups von 3 Proxmox VE Knoten auf einen PBS Server.

Das Problem, das wir haben ist, dass der Proxmox Backup Server nicht mehr als 1,5 Gbit/s schafft. Angebunden sind die PBS und PVE mit jeweils 10Gbit/s
Es werden pro Nacht mehrere Hundert VMs gebackuped.

Als Dateisystem auf dem PBS kommt ext4 zum Einsatz auf einem Dell NVMe Hardware RAID.
Wenn wir händisch eine Datei von einem PVE zum PBS kopieren, dann erreichen wir 3,5 Gbit/s

Die Frage ist, wo liegen die Performance Probleme? Was kann / muss man optimieren auf PBS Seite?

Danke
 
#proxmox-backup-client benchmark
SHA256 speed: 1750.18 MB/s
Compression speed: 525.96 MB/s
Decompress speed: 844.84 MB/s
AES256/GCM speed: 10200.08 MB/s
Verify speed: 569.75 MB/s
 
#proxmox-backup-client benchmark
SHA256 speed: 1750.18 MB/s
Compression speed: 525.96 MB/s
Decompress speed: 844.84 MB/s
AES256/GCM speed: 10200.08 MB/s
Verify speed: 569.75 MB/s
Ganz klar, die falsche CPU im Host gewählt. Das Backup führt der Proxmox Backup Client aus auf dem PVE. Dieser muss die Daten auch Komprimieren, was von der Single Core Performance des Hosts abhängt. Da die CPU nur 525MB/s Compression schafft und das bei 3 Hosts, dann kommt da im Summe 1,5GB/s raus. Also alles ganz normal und im Rahmen. Restore wird etwas schneller gehen, da die CPU schneller beim Decompress ist.
 
Verbaut sind 2x INTEL(R) XEON(R) SILVER 4509Y
Eigentlich keine schlechte CPU oder?
Was Single Core Performance angeht schon. Aber da ist Intel eh generell schlechter.
 
  • Like
Reactions: Johannes S
Bist du dir sicher dass du nur 1,5 GBit erreichst. Beim Backup wird immer MB/s oder GB/s angegeben.
Warum erreichst du denn dann nur 3,5 GBit beim kopieren? Da stimmt ja generell etwas nicht. Eventuell mal das Sizing posten.
Wenn du mit Raid Controller im PBS arbeitest, verschenkst du sowieso Performance der NVMe und wenn man dann Raid6 nutzt aber ohne Batterie Write Cache, dann wird es noch deutlich langsamer.
Erzähl mal mehr über das Sizing und dann können wir vermutlich schnell das Bottleneck identifizieren.
 
Ja ich bin mir sicher. Wir überwachen den Link mit Cacti. Phasenweise sind es mal 2,0 Gbit/s

Zum Einsatz kommt ein Dell Raid Controller mit Batterie.
PowerEdge 16. Generation
Datacenter NVMe von Dell

Mir ist bewusst, dass wir hier etwas Performance liegen lassen, im Vergleich ohne Hardware Raid

Aber wenn ich eine Datei direkt mit rsync / scp kopiere, dann erreichen wir 3,5Gbit/s

Wie gesagt Netzwerk ist 10Gbit. Kein Routing oder ähnliches. Klassischer Netzwerkswitch

Was brauchst du noch an Infos
 
Ja ich bin mir sicher. Wir überwachen den Link mit Cacti. Phasenweise sind es mal 2,0 Gbit/s

Zum Einsatz kommt ein Dell Raid Controller mit Batterie.
PowerEdge 16. Generation
Datacenter NVMe von Dell

Mir ist bewusst, dass wir hier etwas Performance liegen lassen, im Vergleich ohne Hardware Raid
Aber wenn ich eine Datei direkt mit rsync / scp kopiere, dann erreichen wir 3,5Gbit/s

Wie gesagt Netzwerk ist 10Gbit. Kein Routing oder ähnliches. Klassischer Netzwerkswitch

Was brauchst du noch an Infos
Das klingt bei der Hardware viel zu langsam.
Ein aktueller RAID Controller sollte Werte zwischen 3-5 GB/s bringen und 10 GBit immer sättigen.
Ich vermute Mal irgendwo falsche Konfiguration, sonst bekommt man das Setup nicht so langsam.

Wie ist denn die logische Disk auf dem RAID Controller konfiguriert? Wird der Batteriecache überhaupt genutzt?
 
Also ich habe über iperf3 das Netzwerk geprüft. Dies liefert die volle Geschwindigkeit.
Auch habe ich über fio die Disk geprüft. Diese ist auch schnell:

# fio --name=seqwrite --directory=/mnt/datastore/Backup --size=30G --bs=1M --rw=write --iodepth=32 --numjobs=4 --direct=1 --runtime=60 --time_based
seqwrite: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync, iodepth=32
...
fio-3.39
Starting 4 processes
seqwrite: Laying out IO file (1 file / 30720MiB)
seqwrite: Laying out IO file (1 file / 30720MiB)
seqwrite: Laying out IO file (1 file / 30720MiB)
seqwrite: Laying out IO file (1 file / 30720MiB)
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
Jobs: 4 (f=4): [W(4)][100.0%][w=5000MiB/s][w=5000 IOPS][eta 00m:00s]
seqwrite: (groupid=0, jobs=1): err= 0: pid=2234897: Tue Dec 30 15:34:45 2025
write: IOPS=1313, BW=1314MiB/s (1377MB/s)(77.0GiB/60001msec); 0 zone resets
clat (usec): min=373, max=1581, avg=731.38, stdev=62.13
lat (usec): min=391, max=1740, avg=761.05, stdev=59.42
clat percentiles (usec):
| 1.00th=[ 578], 5.00th=[ 627], 10.00th=[ 652], 20.00th=[ 676],
| 30.00th=[ 701], 40.00th=[ 717], 50.00th=[ 734], 60.00th=[ 750],
| 70.00th=[ 766], 80.00th=[ 791], 90.00th=[ 816], 95.00th=[ 824],
| 99.00th=[ 848], 99.50th=[ 857], 99.90th=[ 873], 99.95th=[ 881],
| 99.99th=[ 1106]
bw ( MiB/s): min= 1228, max= 1478, per=25.01%, avg=1314.34, stdev=61.35, samples=119
iops : min= 1228, max= 1478, avg=1314.34, stdev=61.34, samples=119
lat (usec) : 500=0.06%, 750=60.65%, 1000=39.27%
lat (msec) : 2=0.02%
cpu : usr=4.49%, sys=3.65%, ctx=78821, majf=0, minf=526
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,78813,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
seqwrite: (groupid=0, jobs=1): err= 0: pid=2234898: Tue Dec 30 15:34:45 2025
write: IOPS=1313, BW=1314MiB/s (1377MB/s)(77.0GiB/60001msec); 0 zone resets
clat (usec): min=294, max=1482, avg=732.32, stdev=62.52
lat (usec): min=373, max=1675, avg=761.03, stdev=59.45
clat percentiles (usec):
| 1.00th=[ 578], 5.00th=[ 627], 10.00th=[ 652], 20.00th=[ 685],
| 30.00th=[ 701], 40.00th=[ 717], 50.00th=[ 734], 60.00th=[ 750],
| 70.00th=[ 766], 80.00th=[ 791], 90.00th=[ 816], 95.00th=[ 832],
| 99.00th=[ 848], 99.50th=[ 857], 99.90th=[ 873], 99.95th=[ 881],
| 99.99th=[ 1139]
bw ( MiB/s): min= 1228, max= 1476, per=25.02%, avg=1314.36, stdev=61.33, samples=119
iops : min= 1228, max= 1476, avg=1314.35, stdev=61.32, samples=119
lat (usec) : 500=0.06%, 750=60.02%, 1000=39.90%
lat (msec) : 2=0.02%
cpu : usr=4.28%, sys=3.55%, ctx=78818, majf=0, minf=521
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,78814,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
seqwrite: (groupid=0, jobs=1): err= 0: pid=2234899: Tue Dec 30 15:34:45 2025
write: IOPS=1313, BW=1314MiB/s (1377MB/s)(77.0GiB/60001msec); 0 zone resets
clat (usec): min=304, max=1505, avg=732.84, stdev=61.29
lat (usec): min=330, max=1692, avg=761.02, stdev=59.14
clat percentiles (usec):
| 1.00th=[ 578], 5.00th=[ 627], 10.00th=[ 652], 20.00th=[ 685],
| 30.00th=[ 701], 40.00th=[ 717], 50.00th=[ 734], 60.00th=[ 750],
| 70.00th=[ 766], 80.00th=[ 791], 90.00th=[ 816], 95.00th=[ 824],
| 99.00th=[ 848], 99.50th=[ 857], 99.90th=[ 873], 99.95th=[ 881],
| 99.99th=[ 1106]
bw ( MiB/s): min= 1228, max= 1478, per=25.02%, avg=1314.39, stdev=61.35, samples=119
iops : min= 1228, max= 1478, avg=1314.39, stdev=61.35, samples=119
lat (usec) : 500=0.05%, 750=59.68%, 1000=40.25%
lat (msec) : 2=0.02%
cpu : usr=4.34%, sys=3.45%, ctx=78819, majf=0, minf=520
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,78817,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
seqwrite: (groupid=0, jobs=1): err= 0: pid=2234900: Tue Dec 30 15:34:45 2025
write: IOPS=1313, BW=1314MiB/s (1377MB/s)(77.0GiB/60001msec); 0 zone resets
clat (usec): min=119, max=1487, avg=731.71, stdev=58.62
lat (usec): min=181, max=1524, avg=761.04, stdev=59.40
clat percentiles (usec):
| 1.00th=[ 578], 5.00th=[ 627], 10.00th=[ 652], 20.00th=[ 685],
| 30.00th=[ 701], 40.00th=[ 717], 50.00th=[ 734], 60.00th=[ 750],
| 70.00th=[ 766], 80.00th=[ 783], 90.00th=[ 807], 95.00th=[ 824],
| 99.00th=[ 840], 99.50th=[ 848], 99.90th=[ 865], 99.95th=[ 881],
| 99.99th=[ 1106]
bw ( MiB/s): min= 1226, max= 1478, per=25.02%, avg=1314.40, stdev=61.34, samples=119
iops : min= 1226, max= 1478, avg=1314.40, stdev=61.34, samples=119
lat (usec) : 250=0.01%, 500=0.05%, 750=59.89%, 1000=40.04%
lat (msec) : 2=0.02%
cpu : usr=4.40%, sys=3.48%, ctx=78819, majf=0, minf=520
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,78817,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
WRITE: bw=5254MiB/s (5509MB/s), 1314MiB/s-1314MiB/s (1377MB/s-1377MB/s), io=308GiB (331GB), run=60001-60001msec

Disk stats (read/write):
sdb: ios=9/315039, sectors=72/645196504, merge=0/8504, ticks=1/225971, in_queue=225972, util=76.51%
 
Zusammengefasst:

- PVE sendet zu PBS mit 1.5GBit/s
- rsync (von PVE zu PBS?) erreicht aber 3GBit/s
- Iperf schafft 10GBit/s
- fio schafft 5GB/s write

Der write speed ist ziemlich enttäuschend für Enterprise und NVME. Bremst hier der Dell Controller oder Testen wir Käse?
Was gibt sowas raus?

Code:
fio --name=seq_write \
    --filename=/mnt/datastore/Backup/testfile \
    --rw=write \
    --bs=1M \
    --ioengine=libaio \
    --iodepth=32 \
    --direct=1 \
    --numjobs=1 \
    --time_based=1 \
    --runtime=120


IMHO sind die cache Regeln irrelevant für deinen Use case.
Ein writeback hilft AFAIK nur für die letzten paar Sekunden eines Backups um den finalen ack paar Sekunden schneller zu bekommen.
Hier würde ich auf Nummer sicher gehen und die Schreibregel deaktivieren.
 
Last edited:
Für mich sieht es derzeit so aus, als wäre es kein Hardware Problem, sondern ein Proxmox Backup Server Problem bzw. Design Limitierung oder übersehe ich noch etwas?
Oder es gibt in PVE oder PBS noch eine Stellschraube die man drehen muss, wenn man schnelles Netzwerk und schnelle Platten hat. Irgendein Default wert der limitiert?
 
Mich würde als erstes interessieren, warum dein NVME enterprise RAID so mies performt.
Mit 5GB/s ist es aber anscheinend nicht das bottleneck. Stellt sich halt die Frage ob 4 fio jobs repräsentativ für den workload sind.
Da bin ich leider überfragt.

Kannst du meinen FIO oben laufen lassen?
Kannst du bitte auch noch den Proxmox benchmark auf PVE und PBS laufen lassen und posten?
 
Last edited:
Klar bremst der RAID Controller. Ich würde nie NVMe hinter einen RAID Controller packen. Die RAID Controller haben in der Regel 8 PCI Lanes und jede NVMe auch schon 4, somit ist der RAID Controller immer ein Bottleneck bei mehr als 2 NVMe.
Dann kommt es noch darauf an ob man Raid5 oder Raid6 nutzt und da auch auf die Stripesize. Der Raidchip bremst da auch noch mit.
 
Hier das Ergebnis von deinem fio auf dem PBS:

Code:
# fio --name=seq_write \
    --filename=/mnt/datastore/Backup/testfile \
    --rw=write \
    --bs=1M \
    --ioengine=libaio \
    --iodepth=32 \
    --direct=1 \
    --numjobs=1 \
    --time_based=1 \
    --runtime=120
seq_write: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=32
fio-3.39
Starting 1 process
Jobs: 1 (f=1): [W(1)][100.0%][w=10.4GiB/s][w=10.6k IOPS][eta 00m:00s]
seq_write: (groupid=0, jobs=1): err= 0: pid=2797468: Wed Dec 31 09:46:08 2025
  write: IOPS=9693, BW=9694MiB/s (10.2GB/s)(1136GiB/120003msec); 0 zone resets
    slat (usec): min=34, max=10195, avg=70.95, stdev=16.25
    clat (usec): min=2051, max=13051, avg=3229.81, stdev=1057.27
     lat (usec): min=2122, max=13111, avg=3300.77, stdev=1056.69
    clat percentiles (usec):
     |  1.00th=[ 2343],  5.00th=[ 2442], 10.00th=[ 2671], 20.00th=[ 2900],
     | 30.00th=[ 2933], 40.00th=[ 2933], 50.00th=[ 2933], 60.00th=[ 2966],
     | 70.00th=[ 2966], 80.00th=[ 2999], 90.00th=[ 4228], 95.00th=[ 5604],
     | 99.00th=[ 7898], 99.50th=[ 9110], 99.90th=[10945], 99.95th=[11469],
     | 99.99th=[12256]
   bw (  MiB/s): min= 2980, max=11980, per=100.00%, avg=9693.91, stdev=1511.39, samples=240
   iops        : min= 2980, max=11980, avg=9693.91, stdev=1511.39, samples=240
  lat (msec)   : 4=89.16%, 10=10.59%, 20=0.25%
  cpu          : usr=42.50%, sys=21.75%, ctx=3828693, majf=0, minf=52
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,1163269,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=9694MiB/s (10.2GB/s), 9694MiB/s-9694MiB/s (10.2GB/s-10.2GB/s), io=1136GiB (1220GB), run=120003-120003msec

Disk stats (read/write):
  sdb: ios=3/1161988, sectors=24/2379747352, merge=0/1, ticks=11/3728473, in_queue=3728483, util=53.93%


Hier noch der Benchmarkt von einem PVE Knoten

Code:
# proxmox-backup-client benchmark
SHA256 speed: 1599.37 MB/s
Compression speed: 481.20 MB/s
Decompress speed: 775.54 MB/s
AES256/GCM speed: 9116.60 MB/s
Verify speed: 523.13 MB/s
┌───────────────────────────────────┬─────────────────────┐
│ Name                              │ Value               │
╞═══════════════════════════════════╪═════════════════════╡
│ TLS (maximal backup upload speed) │ not tested          │
├───────────────────────────────────┼─────────────────────┤
│ SHA256 checksum computation speed │ 1599.37 MB/s (79%)  │
├───────────────────────────────────┼─────────────────────┤
│ ZStd level 1 compression speed    │ 481.20 MB/s (64%)   │
├───────────────────────────────────┼─────────────────────┤
│ ZStd level 1 decompression speed  │ 775.54 MB/s (65%)   │
├───────────────────────────────────┼─────────────────────┤
│ Chunk verification speed          │ 523.13 MB/s (69%)   │
├───────────────────────────────────┼─────────────────────┤
│ AES256 GCM encryption speed       │ 9116.60 MB/s (250%) │
└───────────────────────────────────┴─────────────────────┘



Auf einem PVE Knoten funktioniert dein fio nicht, da er zwingend noch ein --size= haben möchte. Habe hier jetzt mal size=20 genommen

Code:
# fio --name=seq_write \
    --filename=/mnt/pve/DATA/testfile \
    --rw=write \
    --bs=1M \
    --ioengine=libaio \
    --iodepth=32 \
    --direct=1 \
    --numjobs=1 \
    --time_based=1 \
    --runtime=120 \
    --size=20G
seq_write: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=32
fio-3.39
Starting 1 process
seq_write: Laying out IO file (1 file / 20480MiB)
Jobs: 1 (f=1): [W(1)][100.0%][w=6967MiB/s][w=6967 IOPS][eta 00m:00s]
seq_write: (groupid=0, jobs=1): err= 0: pid=488356: Wed Dec 31 09:53:20 2025
  write: IOPS=6634, BW=6635MiB/s (6957MB/s)(778GiB/120063msec); 0 zone resets
    slat (usec): min=35, max=60527, avg=48.59, stdev=127.66
    clat (usec): min=1529, max=116151, avg=4774.03, stdev=3644.46
     lat (usec): min=1584, max=116190, avg=4822.62, stdev=3646.70
    clat percentiles (usec):
     |  1.00th=[ 3032],  5.00th=[ 4424], 10.00th=[ 4424], 20.00th=[ 4424],
     | 30.00th=[ 4490], 40.00th=[ 4490], 50.00th=[ 4490], 60.00th=[ 4490],
     | 70.00th=[ 4555], 80.00th=[ 4621], 90.00th=[ 4817], 95.00th=[ 4948],
     | 99.00th=[ 5211], 99.50th=[22152], 99.90th=[62129], 99.95th=[71828],
     | 99.99th=[74974]
   bw (  MiB/s): min=  802, max=15116, per=100.00%, avg=6638.04, stdev=1264.86, samples=240
   iops        : min=  802, max=15116, avg=6638.04, stdev=1264.86, samples=240
  lat (msec)   : 2=0.22%, 4=0.87%, 10=98.35%, 20=0.06%, 50=0.16%
  lat (msec)   : 100=0.35%, 250=0.01%
  cpu          : usr=12.37%, sys=18.37%, ctx=1928960, majf=0, minf=11
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,796596,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=6635MiB/s (6957MB/s), 6635MiB/s-6635MiB/s (6957MB/s-6957MB/s), io=778GiB (835GB), run=120063-120063msec

Disk stats (read/write):
  sdb: ios=0/796325, sectors=0/1630727568, merge=0/361, ticks=0/3802038, in_queue=3802038, util=75.51%