Proxmox Bug oder ZFS Bug oder Feature?

Mrt12

Active Member
May 19, 2019
115
9
38
44
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:

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.
 
Das müsste mit einem zvol auch funktionieren, oder? ;-)
Zvols nutzen die Volblocksize und ignorieren die Recordsize. Volblocksize war früher standardmäßig 8K, nun 16K.
 
Last edited:

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!