Hallo,
ich habe folgende Beobachtung gemacht, und ich wüsste gern, ob das so korrekt ist, ob es ein Bug ist und wenn ja ob es ein ZFS oder Proxmox Bug ist.
Ich habe folgenden Pool erstellt:
sdg und sdh sind Hard Disks (SATA), der Rest sind alles SSDs (mit SAS). Es sind HGST HUSSL4040 und HUSMM1640 gemischt. (leider gibt es für die SAS SSDs keinen Eintrag unter /dev/disk/by-id). Der tank scheint auch gut zu funktionieren:
die fsyncs/sec sind beachtlich, wie ich finde.
Die ZFS recordsize ist 128K:
ich habe zwei Datasets erstellt:
Soweit so gut. Wenn ich jetzt irgend welche beliebigen Dateien unter /tank/ssdonly ablege, dann landen diese komplett auf den SSDs, weil special_small_blocks=recordsize ist. Man kann es leicht verifizieen, indem man mit zpool list schaut:
Man sieht sehr hübsch, wie die Daten ausschliesslich auf die SSDs gelegt werden. Auf die HDDs erfolgt kein einziger Zugriff. Soweit wie erwartet. Ich habe nun unter Proxmox / Datacenter / Storage die beiden Datasets "ssdonly" und "hdd" als Storage hinzugefügt. Nun lege ich zwei LXCs an. Beim einen LXC benutze ich als Storage den "ssdonly", beim anderen benutze ich den "hdd". Und so sieht es dann aus:
d.h. der 100er Container liegt komplett auf den SSDs; jetzt wird noch der 2. LXC erstellt, dann sieht es so aus:
Soweit alles gut und alles wie erwartet! ich kann also, je nachdem, in welchem Storage ich einen LXC erstelle, diesen komplett auf die SSD "verbannen" und mir so einen schnelleren Speed gönnen, wenn sämtliche Daten nur von der SSD kommen. Das müsste mit einem zvol auch funktionieren, oder? ;-) besonders bei einer VM wäre es u.U. attraktiv, diese nur von der SSD laufen zu lassen. Also habe ich eine VM erstellt und als Storage für das Image habe ich "ssdonly" ausgewählt: (die beiden LXC wurden wieder entfernt)
somit müsste die komplette VM ausschliesslich auf den SSD befinden. Doch leider nein, der Speicher für die VM kommt von den Hard Disks:
Und auch wenn man manuell einen zvol erstellt, und dann diesen mountet und rein schreibt, ist es egal, wo der zvol liegt, es wird immer Speicher von den HDDs allokiert.
Warum ist das so, und ist das wirklich das gewollte Verhalten? müsste es nicht so sein, dass wegen special_small_blocks der komplette zvol auf die SSD geht, weil der zvol ja seine Blocksize sowieso viel kleiner als 128K hat?
Mein Ziel wäre eigentlich, VMs nur noch von den SSD laufen zu lassen. Und ich möchte nicht 2 Pools anlegen dafür.
ich habe folgende Beobachtung gemacht, und ich wüsste gern, ob das so korrekt ist, ob es ein Bug ist und wenn ja ob es ein ZFS oder Proxmox Bug ist.
Ich habe folgenden Pool erstellt:
Code:
# zpool status
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
special
mirror-2 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
errors: No known data errors
sdg und sdh sind Hard Disks (SATA), der Rest sind alles SSDs (mit SAS). Es sind HGST HUSSL4040 und HUSMM1640 gemischt. (leider gibt es für die SAS SSDs keinen Eintrag unter /dev/disk/by-id). Der tank scheint auch gut zu funktionieren:
Code:
# pveperf /tank/
CPU BOGOMIPS: 100800.00
REGEX/SECOND: 4188583
HD SIZE: 1798.50 GB (tank)
FSYNCS/SECOND: 12615.77
DNS EXT: 26.52 ms
DNS INT: 1.18 ms (int.hb9fsx.ch)
die fsyncs/sec sind beachtlich, wie ich finde.
Die ZFS recordsize ist 128K:
Code:
# zfs get recordsize tank
NAME PROPERTY VALUE SOURCE
tank recordsize 128K default
ich habe zwei Datasets erstellt:
Code:
# zfs create -o special_small_blocks=128K tank/ssdonly
# zfs create tank/hdd
# zfs get special_small_blocks tank/ssdonly
NAME PROPERTY VALUE SOURCE
tank/ssdonly special_small_blocks 128K local
# zfs get special_small_blocks tank/hdd
NAME PROPERTY VALUE SOURCE
tank/hdd special_small_blocks 0 default
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.18T 952K 2.18T - - 0% 0% 1.00x ONLINE -
mirror-0 1.81T 0 1.81T - - 0% 0.00% - ONLINE
sdg 1.82T - - - - - - - ONLINE
sdh 1.82T - - - - - - - ONLINE
special - - - - - - - - -
mirror-2 372G 952K 372G - - 0% 0.00% - ONLINE
sdc 373G - - - - - - - ONLINE
sdd 372G - - - - - - - ONLINE
logs - - - - - - - - -
mirror-1 372G 12K 372G - - 0% 0.00% - ONLINE
sda 372G - - - - - - - ONLINE
sdb 372G - - - - - - - ONLINE
Soweit so gut. Wenn ich jetzt irgend welche beliebigen Dateien unter /tank/ssdonly ablege, dann landen diese komplett auf den SSDs, weil special_small_blocks=recordsize ist. Man kann es leicht verifizieen, indem man mit zpool list schaut:
Code:
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=1
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=2
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=4
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=8
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=16
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=32
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=64
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=128
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=256
# dd if=/dev/urandom of=/tank/ssdonly/1k.txt bs=1k count=1M
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.18T 644M 2.18T - - 0% 0% 1.00x ONLINE -
mirror-0 1.81T 0 1.81T - - 0% 0.00% - ONLINE
sdg 1.82T - - - - - - - ONLINE
sdh 1.82T - - - - - - - ONLINE
special - - - - - - - - -
mirror-2 372G 644M 371G - - 0% 0.16% - ONLINE
sdc 373G - - - - - - - ONLINE
sdd 372G - - - - - - - ONLINE
logs - - - - - - - - -
mirror-1 372G 12K 372G - - 0% 0.00% - ONLINE
sda 372G - - - - - - - ONLINE
sdb 372G - - - - - - - ONLINE
Man sieht sehr hübsch, wie die Daten ausschliesslich auf die SSDs gelegt werden. Auf die HDDs erfolgt kein einziger Zugriff. Soweit wie erwartet. Ich habe nun unter Proxmox / Datacenter / Storage die beiden Datasets "ssdonly" und "hdd" als Storage hinzugefügt. Nun lege ich zwei LXCs an. Beim einen LXC benutze ich als Storage den "ssdonly", beim anderen benutze ich den "hdd". Und so sieht es dann aus:
Code:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.30G 1.76T 112K /tank
tank/hdd 96K 1.76T 96K /tank/hdd
tank/ssdonly 1.29G 1.76T 1.00G /tank/ssdonly
tank/ssdonly/subvol-100-disk-0 301M 7.71G 301M /tank/ssdonly/subvol-100-disk-0
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.18T 1.30G 2.17T - - 0% 0% 1.00x ONLINE -
mirror-0 1.81T 0 1.81T - - 0% 0.00% - ONLINE
sdg 1.82T - - - - - - - ONLINE
sdh 1.82T - - - - - - - ONLINE
special - - - - - - - - -
mirror-2 372G 1.30G 371G - - 0% 0.34% - ONLINE
sdc 373G - - - - - - - ONLINE
sdd 372G - - - - - - - ONLINE
logs - - - - - - - - -
mirror-1 372G 12K 372G - - 0% 0.00% - ONLINE
sda 372G - - - - - - - ONLINE
sdb 372G - - - - - - - ONLINE
d.h. der 100er Container liegt komplett auf den SSDs; jetzt wird noch der 2. LXC erstellt, dann sieht es so aus:
Code:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.55G 1.75T 112K /tank
tank/hdd 260M 1.75T 104K /tank/hdd
tank/hdd/subvol-101-disk-0 260M 7.75G 260M /tank/hdd/subvol-101-disk-0
tank/ssdonly 1.29G 1.75T 1.00G /tank/ssdonly
tank/ssdonly/subvol-100-disk-0 301M 7.71G 301M /tank/ssdonly/subvol-100-disk-0
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.18T 1.55G 2.17T - - 0% 0% 1.00x ONLINE -
mirror-0 1.81T 246M 1.81T - - 0% 0.01% - ONLINE
sdg 1.82T - - - - - - - ONLINE
sdh 1.82T - - - - - - - ONLINE
special - - - - - - - - -
mirror-2 372G 1.31G 371G - - 0% 0.35% - ONLINE
sdc 373G - - - - - - - ONLINE
sdd 372G - - - - - - - ONLINE
logs - - - - - - - - -
mirror-1 372G 12K 372G - - 0% 0.00% - ONLINE
sda 372G - - - - - - - ONLINE
sdb 372G - - - - - - - ONLINE
Soweit alles gut und alles wie erwartet! ich kann also, je nachdem, in welchem Storage ich einen LXC erstelle, diesen komplett auf die SSD "verbannen" und mir so einen schnelleren Speed gönnen, wenn sämtliche Daten nur von der SSD kommen. Das müsste mit einem zvol auch funktionieren, oder? ;-) besonders bei einer VM wäre es u.U. attraktiv, diese nur von der SSD laufen zu lassen. Also habe ich eine VM erstellt und als Storage für das Image habe ich "ssdonly" ausgewählt: (die beiden LXC wurden wieder entfernt)
Code:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 33.5G 1.72T 112K /tank
tank/hdd 96K 1.72T 96K /tank/hdd
tank/ssdonly 33.5G 1.72T 1.00G /tank/ssdonly
tank/ssdonly/vm-102-disk-0 32.5G 1.76T 56K -
somit müsste die komplette VM ausschliesslich auf den SSD befinden. Doch leider nein, der Speicher für die VM kommt von den Hard Disks:
Code:
# zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 2.18T 1.78G 2.17T - - 0% 0% 1.00x ONLINE -
mirror-0 1.81T 786M 1.81T - - 0% 0.04% - ONLINE
sdg 1.82T - - - - - - - ONLINE
sdh 1.82T - - - - - - - ONLINE
special - - - - - - - - -
mirror-2 372G 1.01G 371G - - 0% 0.27% - ONLINE
sdc 373G - - - - - - - ONLINE
sdd 372G - - - - - - - ONLINE
logs - - - - - - - - -
mirror-1 372G 178M 372G - - 0% 0.04% - ONLINE
sda 372G - - - - - - - ONLINE
sdb 372G - - - - - - - ONLINE
Und auch wenn man manuell einen zvol erstellt, und dann diesen mountet und rein schreibt, ist es egal, wo der zvol liegt, es wird immer Speicher von den HDDs allokiert.
Warum ist das so, und ist das wirklich das gewollte Verhalten? müsste es nicht so sein, dass wegen special_small_blocks der komplette zvol auf die SSD geht, weil der zvol ja seine Blocksize sowieso viel kleiner als 128K hat?
Mein Ziel wäre eigentlich, VMs nur noch von den SSD laufen zu lassen. Und ich möchte nicht 2 Pools anlegen dafür.