PVE mit ZFS - Performance im host und VM

grefabu

Well-Known Member
May 23, 2018
234
14
58
50
Moin,

ich experementiere auf einer Maschine mit ZFS um ein wenig Gefühl für das System zu bekommen.

Ich verwende dafür folgende Konstellation:

CPU AMD Ryzen 2440G
32 GB RAM

HDD:
1x NVme für Host OS und einen local Store

1x Seagate IronWolf Pro 6GB
1x Seagate IIronWolf Pro 4GB

Die Platten habe ich bewußt in der 4 und 6 GB Version, um die Geschwindigkeiten vergleichen zu können.

Teste ich die Platten einzeln mit dd (oflag=direct) erhalte ich immer Schreibraten > 230 MB/s die Werte entsprechen in etwa den Herstellerangaben.
Jetzt habe ich einen zfs Pool manuell gebaut, da die Platten unterschiedlich groß sind vorher jeweils eine Partition in der gleichen Größe angelegt.

Code:
zpool create -f -o ashift=12 zfs001 /dev/sda1 /dev/sdb1

Mit pvesm add zfspool PVESTORE001 -pool zfs001 habe ich den Pool zugefügt.

Gehe ich direkt in /zfs001 und erzeuge eine Datei:

Code:
root@PCEE-PC019:~# dd if=/dev/zero of=/zfs001/10GB count=10240 bs=1M oflag=direct
10240+0 Datensätze ein
10240+0 Datensätze aus
10737418240 bytes (11 GB, 10 GiB) copied, 18,6543 s, 576 MB/s

Erhalte ich einen Wert in der Größenordnung in dem ich ihn erwartet habe.

In einer VM ist der Wert aber mit ~226 MB/s deutlich geringer.
Die VM ist q&d mit scsi angelegt und ich habe auch sonst keine Einstellung gemacht.

Ein kopieren von Daten zwischen der localen NVme und dem Raid funktioniert auch recht performant, ohne das ich hier jetzt Messdaten habe.
 
Wenn du von /dev/zero weg DDest dann wird da viel komprimiert.

Weiters darfst du bei ZFS nicht eine Datei mit einer VM vergleichen. ZFS kennt zwei Typen von Datasets, einmal Dateisysteme und "volume" welches ein Blockdevice bereitstellt. Letzteres wird für VM Festplatten verwendet. Die Performance ist dabei durchaus unterschiedlich.

Zum Benchmarken nimmst du statt dd besser fio. Es gibt ein Benchmarkpaper zu ZFS von uns das für dich interessant sein kann.
 
  • Like
Reactions: fireon and Dunuin
Moin,

mit fio weichen meine Werte noch stärker voneinander ab.
Erhalte ich dierekt auf dem Host im Verzeichnis /zfs001 folgende Werte:
Code:
root@PCEE-PC019:/zfs001# fio --rw=write --name=test --size=10G --direct=1 --refill_buffers
test: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.12
Starting 1 process
test: Laying out IO file (1 file / 10240MiB)
Jobs: 1 (f=1): [W(1)][100.0%][w=499MiB/s][w=128k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=2174: Tue May 25 17:26:03 2021
  write: IOPS=135k, BW=527MiB/s (553MB/s)(10.0GiB/19422msec); 0 zone resets
    clat (usec): min=2, max=2116, avg= 6.39, stdev=13.53
     lat (usec): min=2, max=2116, avg= 6.44, stdev=13.54
    clat percentiles (usec):
     |  1.00th=[    4],  5.00th=[    4], 10.00th=[    4], 20.00th=[    4],
     | 30.00th=[    4], 40.00th=[    4], 50.00th=[    4], 60.00th=[    4],
     | 70.00th=[    5], 80.00th=[    5], 90.00th=[    6], 95.00th=[    8],
     | 99.00th=[   70], 99.50th=[  110], 99.90th=[  129], 99.95th=[  180],
     | 99.99th=[  251]
   bw (  KiB/s): min=122272, max=776368, per=100.00%, avg=549470.50, stdev=130358.19, samples=38
   iops        : min=30568, max=194092, avg=137367.66, stdev=32589.52, samples=38
  lat (usec)   : 4=61.84%, 10=33.90%, 20=0.24%, 50=2.72%, 100=0.42%
  lat (usec)   : 250=0.88%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.01%
  cpu          : usr=16.57%, sys=71.26%, ctx=23711, majf=0, minf=11
  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,2621440,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=527MiB/s (553MB/s), 527MiB/s-527MiB/s (553MB/s-553MB/s), io=10.0GiB (10.7GB), run=19422-19422msec

In der VM seiht es arg wenig aus:
Code:
root@debian:~# fio --rw=write --name=20G --size=1G --direct=1 
20G: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.12
Starting 1 process
^Cbs: 1 (f=1): [W(1)][100.0%][w=42.8MiB/s][w=10.0k IOPS][eta 00m:00s]
fio: terminating on signal 2

20G: (groupid=0, jobs=1): err= 0: pid=439: Tue May 25 17:36:36 2021
  write: IOPS=11.2k, BW=43.6MiB/s (45.7MB/s)(1024MiB/23486msec); 0 zone resets
    clat (usec): min=62, max=3121, avg=87.68, stdev=14.38
     lat (usec): min=63, max=3123, avg=87.98, stdev=14.39
    clat percentiles (usec):
     |  1.00th=[   73],  5.00th=[   77], 10.00th=[   80], 20.00th=[   84],
     | 30.00th=[   84], 40.00th=[   85], 50.00th=[   86], 60.00th=[   88],
     | 70.00th=[   91], 80.00th=[   94], 90.00th=[   98], 95.00th=[  101],
     | 99.00th=[  111], 99.50th=[  115], 99.90th=[  131], 99.95th=[  153],
     | 99.99th=[  668]
   bw (  KiB/s): min=42264, max=47408, per=100.00%, avg=44652.67, stdev=922.67, samples=46
   iops        : min=10566, max=11852, avg=11163.15, stdev=230.67, samples=46
  lat (usec)   : 100=94.27%, 250=5.69%, 500=0.02%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.01%
  cpu          : usr=0.14%, sys=23.10%, ctx=262173, majf=0, minf=12
  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,262144,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=43.6MiB/s (45.7MB/s), 43.6MiB/s-43.6MiB/s (45.7MB/s-45.7MB/s), io=1024MiB (1074MB), run=23486-23486msec

Disk stats (read/write):
  sda: ios=1/261199, merge=0/22, ticks=3/20028, in_queue=23500, util=100.00%

Den Parameter direct habe ich gewählt, um den Arbeitsspeicher zu umgehen. frei nach https://www.thomas-krenn.com/de/wiki/Fio_Grundlagen

Ich komme mir allerdings schon ein wenig vor, wie 'wer viel misst, misst Mist'
 
Du misst auch wieder was ganz anderes...

1.) einmal schreibst du 1G und einmal 10G.
2.) Und dann schreibst du vermutlich auf dem Host in ein Dataset und nicht in ein Zvol oder? Datasets nutzen 128K Blockgröße, die die Zvols von der VM 8K Blockgröße.
 
Last edited:
ZFS ist nicht ganz ohne, damit habe ich auch schon Ewigkeiten mit vertan, das zu verstehen ;)

Um vergleichen zu können, würde ich erst mal den Test zeitbasiert laufen lassen und dann mit Größen arbeiten, die nicht gepuffert werden können. Denn ZFS macht sehr viel übers RAM - und das ist natürlich superschnell.

Ich verwende für meine Tests den folgenden Befehl, der read/write simuliert und hoffentlich möglichst nah an einer typischen Workload sind:
Bash:
fio --name=typical-vm --size=8G --rw=readwrite --rwmixread=69 --direct=1 --bs=4K --numjobs=4 --ioengine=libaio --iodepth=12 --group_reporting --runtime=20m --time_based

Aber nicht erschrecken... das ist wirklich harte Arbeit fürs FS - die Werte die dabei rauskommen sind ganz weit weg von riesen Blöcken, die am Stück gelesen werden...
 
Moin,

@Dunuin :
zu 1) da gab es nicht wirklich einen Unterschied, letzendlich habe ich so viel verschiedene Tests gemacht, das ich mich darauf beschränkt habe, jeweils ein Ergebnis zu posten. Ich hätte auch noch den --name hübsch machen sollen ;-)
zu 2) Wahrscheinlich hast du recht, aber da ich bei zfs noch am Anfang stehe, ist mir das noch nicht wirklich bewußt gewesen.

@antimon :
Um den RAM auszuschließen, dachte ich ja auch das --direct=1 und --refill-buffers ausreicht. Ich habe aber Deinen Befehl mal im Host und in der VM ausgeführt.

Hier liegen die Ergebnisse jetzt sehr nah beieinander:
host:
Code:
Run status group 0 (all jobs):
   READ: bw=243MiB/s (255MB/s), 243MiB/s-243MiB/s (255MB/s-255MB/s), io=285GiB (306GB), run=1200025-1200025msec
  WRITE: bw=109MiB/s (114MB/s), 109MiB/s-109MiB/s (114MB/s-114MB/s), io=128GiB (137GB), run=1200025-1200025msec

vm
Code:
Run status group 0 (all jobs):
   READ: bw=233MiB/s (244MB/s), 233MiB/s-233MiB/s (244MB/s-244MB/s), io=273GiB (293GB), run=1200001-1200001msec
  WRITE: bw=105MiB/s (110MB/s), 105MiB/s-105MiB/s (110MB/s-110MB/s), io=123GiB (132GB), run=1200001-1200001msec

Das ist der Test, wenn das Plattenabbild der VM sich auf dem ZFS Store befindet. Ich werde das ganze auch noch mal auf die lokale NVme Platte schieben.
 
  • Like
Reactions: Impact
Um den RAM auszuschließen, dachte ich ja auch das --direct=1 und --refill-buffers ausreicht. Ich habe aber Deinen Befehl mal im Host und in der VM ausgeführt.
Prinzipiell ja, aber du kannst ZFS auch so konfigurieren, dass es sync writes vorgaukelt. Das sollte man zwar tunlichst vermeiden, wenn einem seine Daten heilig sind und man das nicht entsprechend absichert, aber es wird immer mal wieder empfohlen um mehr Geschwindigkeit rauszuholen... deswegen bin ich da vorsichtig bei Tests und gehe lieber auf Nummer sicher.
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!