web-dev-qa-db-fra.com

ZFS à lecture lente avec pool de disques en miroir rayé à 8 disques et 4 disques vdev

J'ai huit disques SATA Western Digital Red de 3 To sdb via sdi que j'utilise dans mon pool.

Mon disque de démarrage et de système d'exploitation est un SSD 850 EVO sur sda.

Les huit disques WD se trouvent sur une carte supplémentaire Supermicro AOC-SAS2LP-MV8, adaptateur SAS/SATA à 8 canaux avec 600 Mo/s par canal dans un PCIE 3.0 x16 fonctionnant à x8 sur un Supermicro ATX DDR4 LGA 1151 carte mère C7Z170-OCE-O.

La configuration de mon serveur et de ZFS est la suivante:

[root@nas ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

[root@nas ~]# uname -a
Linux nas.whittenberg.domain 3.10.0-327.28.2.el7.x86_64 #1 SMP Wed Aug 3 11:11:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@nas ~]# cat /var/log/dmesg | grep ZFS
[    0.793572] ZFS: Loaded module v0.6.5.7-1, ZFS pool version 5000, ZFS filesystem version 5
[root@nas ~]# cat /var/log/dmesg | grep SPL
[    0.777144] SPL: Loaded module v0.6.5.7-1

[root@nas ~]# cat /etc/modprobe.d/zfs.conf
# disable prefetch = 1
options zfs zfs_prefetch_disable=0
# set arc max to 48GB. I have 64GB in my server
options zfs zfs_arc_max=51539607552
# set size to 128k same as file system block size
options zfs zfs_vdev_cache_size=1310720
options zfs zfs_vdev_cache_max=1310720
options zfs zfs_read_chunk_size=1310720
options zfs zfs_vdev_cache_bshift=12
options zfs zfs_read_chunk_size=1310720
# Set thes to 10 so we get better IO at cost of banwidth
options zfs zfs_vdev_async_read_max_active=10
options zfs zfs_vdev_async_read_min_active=10
options zfs zfs_vdev_async_write_max_active=10
options zfs zfs_vdev_async_write_min_active=10
options zfs zfs_vdev_sync_read_max_active=10
options zfs zfs_vdev_sync_read_min_active=10
options zfs zfs_vdev_sync_write_max_active=10
options zfs zfs_vdev_sync_write_min_active=10

[root@nas ~]# zpool status
  pool: myraid
 state: ONLINE
  scan: scrub repaired 0 in 0h16m with 0 errors on Sun Aug  7 01:40:49 2016
config:

        NAME        STATE     READ WRITE CKSUM
        myraid      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdg     ONLINE       0     0     0
          mirror-3  ONLINE       0     0     0
            sdh     ONLINE       0     0     0
            sdi     ONLINE       0     0     0

errors: No known data errors

[root@nas ~]# zpool iostat -v
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
myraid       382G  10.5T    119     35  14.0M   606K
  mirror    95.5G  2.63T     29      8  3.49M   149K
    sdb         -      -     28      8  3.50M   153K
    sdc         -      -     28      8  3.50M   153K
  mirror    95.5G  2.63T     29      8  3.49M   151K
    sdd         -      -     28      8  3.50M   155K
    sde         -      -     28      8  3.50M   155K
  mirror    95.5G  2.63T     29      8  3.49M   152K
    sdf         -      -     28      8  3.50M   156K
    sdg         -      -     28      8  3.50M   156K
  mirror    95.5G  2.63T     29      9  3.49M   155K
    sdh         -      -     28      9  3.50M   159K
    sdi         -      -     28      9  3.50M   159K
----------  -----  -----  -----  -----  -----  -----

[root@nas ~]# zfs get all
NAME    PROPERTY              VALUE                  SOURCE
myraid  type                  filesystem             -
myraid  creation              Sat Aug  6 21:01 2016  -
myraid  used                  382G                   -
myraid  available             10.2T                  -
myraid  referenced            382G                   -
myraid  compressratio         1.05x                  -
myraid  mounted               yes                    -
myraid  quota                 none                   default
myraid  reservation           none                   default
myraid  recordsize            128K                   local
myraid  mountpoint            /myraid                default
myraid  sharenfs              off                    default
myraid  checksum              fletcher4              local
myraid  compression           lz4                    local
myraid  atime                 off                    local
myraid  devices               on                     default
myraid  exec                  on                     default
myraid  setuid                on                     default
myraid  readonly              off                    default
myraid  zoned                 off                    default
myraid  snapdir               hidden                 default
myraid  aclinherit            restricted             default
myraid  canmount              on                     default
myraid  xattr                 on                     default
myraid  copies                1                      default
myraid  version               5                      -
myraid  utf8only              off                    -
myraid  normalization         none                   -
myraid  casesensitivity       sensitive              -
myraid  vscan                 off                    default
myraid  nbmand                off                    default
myraid  sharesmb              off                    default
myraid  refquota              none                   default
myraid  refreservation        none                   default
myraid  primarycache          all                    local
myraid  secondarycache        all                    default
myraid  usedbysnapshots       0                      -
myraid  usedbydataset         382G                   -
myraid  usedbychildren        1.98M                  -
myraid  usedbyrefreservation  0                      -
myraid  logbias               latency                local
myraid  dedup                 off                    local
myraid  mlslabel              none                   default
myraid  sync                  disabled               local
myraid  refcompressratio      1.05x                  -
myraid  written               382G                   -
myraid  logicalused           403G                   -
myraid  logicalreferenced     403G                   -
myraid  filesystem_limit      none                   default
myraid  snapshot_limit        none                   default
myraid  filesystem_count      none                   default
myraid  snapshot_count        none                   default
myraid  snapdev               hidden                 default
myraid  acltype               off                    default
myraid  context               none                   default
myraid  fscontext             none                   default
myraid  defcontext            none                   default
myraid  rootcontext           none                   default
myraid  relatime              off                    default
myraid  redundant_metadata    all                    default
myraid  overlay               off                    default

[root@nas ~]# zpool get all
NAME    PROPERTY                    VALUE                       SOURCE
myraid  size                        10.9T                       -
myraid  capacity                    3%                          -
myraid  altroot                     -                           default
myraid  health                      ONLINE                      -
myraid  guid                        1068639342092444414         default
myraid  version                     -                           default
myraid  bootfs                      -                           default
myraid  delegation                  on                          default
myraid  autoreplace                 off                         default
myraid  cachefile                   -                           default
myraid  failmode                    wait                        default
myraid  listsnapshots               off                         default
myraid  autoexpand                  off                         default
myraid  dedupditto                  0                           default
myraid  dedupratio                  1.00x                       -
myraid  free                        10.5T                       -
myraid  allocated                   382G                        -
myraid  readonly                    off                         -
myraid  ashift                      0                           default
myraid  comment                     -                           default
myraid  expandsize                  -                           -
myraid  freeing                     0                           default
myraid  fragmentation               1%                          -
myraid  leaked                      0                           default
myraid  feature@async_destroy       enabled                     local
myraid  feature@empty_bpobj         enabled                     local
myraid  feature@lz4_compress        active                      local
myraid  feature@spacemap_histogram  active                      local
myraid  feature@enabled_txg         active                      local
myraid  feature@hole_birth          active                      local
myraid  feature@extensible_dataset  enabled                     local
myraid  feature@embedded_data       active                      local
myraid  feature@bookmarks           enabled                     local
myraid  feature@filesystem_limits   enabled                     local
myraid  feature@large_blocks        enabled                     local

[root@nas ~]# zdb | grep ashift
            ashift: 12
            ashift: 12
            ashift: 12
            ashift: 12

[root@nas ~]# lsblk  -t -e 11,1
NAME                ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE  RA WSAME
sda                         0    512      0     512     512    0 cfq       128 128    0B
+-sda1                      0    512      0     512     512    0 cfq       128 128    0B
+-sda2                      0    512      0     512     512    0 cfq       128 128    0B
+-sda3                      0    512      0     512     512    0 cfq       128 128    0B
  +-centos_nas-swap         0    512      0     512     512    0           128 128    0B
  +-centos_nas-root         0    512      0     512     512    0           128 128    0B
  +-centos_nas-home         0    512      0     512     512    0           128 128    0B
sdb                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdb1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdb9                      0   4096      0    4096     512    1 noop      128 128    0B
sdc                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdc1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdc9                      0   4096      0    4096     512    1 noop      128 128    0B
sdd                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdd1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdd9                      0   4096      0    4096     512    1 noop      128 128    0B
sde                         0   4096      0    4096     512    1 noop      128 128    0B
+-sde1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sde9                      0   4096      0    4096     512    1 noop      128 128    0B
sdf                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdf1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdf9                      0   4096      0    4096     512    1 noop      128 128    0B
sdg                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdg1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdg9                      0   4096      0    4096     512    1 noop      128 128    0B
sdh                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdh1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdh9                      0   4096      0    4096     512    1 noop      128 128    0B
sdi                         0   4096      0    4096     512    1 noop      128 128    0B
+-sdi1                      0   4096      0    4096     512    1 noop      128 128    0B
+-sdi9                      0   4096      0    4096     512    1 noop      128 128    0B

Mon problème est que lorsque je lis un fichier pour la première fois, via ma connexion à 10 Gbit/s (PC DAC vers serveur), ou que j'utilise rsync du pool au SSD du serveur, je reçois un peu plus de 100 Mo/s. Si je lis le même fichier une seconde fois, j'obtiens 1,2 Gbyte/s sur la connexion DAC à 10 Gbit/s et 380 Mbyte/s du pool au SSD.

Je redémarre le serveur et lance un test de lecture de pool vers SSD:

[root@nas ~]# rsync -h --progress /myraid/testmovie.avi /home/samba/testmovie.avi
testmovie.avi
       1.08G 100%   79.59MB/s    0:00:12 (xfer#1, to-check=0/1)

sent 1.08G bytes  received 31 bytes  80.21M bytes/sec
total size is 1.08G  speedup is 1.00

Ensuite, je fais la même chose après avoir lu une fois:

[root@nas ~]# rsync -h --progress /myraid/testmovie.avi /home/samba/testmovie.avi
testmovie.avi
       1.08G 100%  394.54MB/s    0:00:02 (xfer#1, to-check=0/1)

sent 1.08G bytes  received 31 bytes  433.13M bytes/sec
total size is 1.08G  speedup is 1.00

Des pointeurs? Ne devrais-je pas obtenir la vitesse de lecture de quatre lecteurs lors de la première lecture?

3
CB40

Théoriquement parlant

Dans un monde très théorique , à partir de la configuration de votre pool (quatre vdevs, chacun représentant un miroir à deux disques), vous pouvez vous attendre à une bande passante de lecture équivalente à huit fois la vitesse d'un disque. C'est parce que:

  • Dans un miroir vdev, ZFS est capable de lire différents blocs de données des deux disques simultanément
  • Dans un pool multi-vdev, ZFS met automatiquement vos données en bande, ce qui lui permet de lire à nouveau simultanément plusieurs vdev.

Western Digital affirme qu'un disque rouge de 3 To peut lire plus de 140 Mo/s. Cela n'arrivera pas, du moins pas tout le temps. Supposons donc que vous puissiez obtenir 100 Mo/s de l’un de ces disques. Quand ils sont combinés dans la configuration de votre pool, vous pouvez théoriquement obtenir jusqu'à 800 Mo/s de bande passante en lecture.

Bienvenue dans le monde réel

Maintenant, laissez-moi être clair: 800 Mo/s, ça ne va probablement pas arriver! Pas parce que ZFS vous ment, mais parce que ce calcul de bande passante repose sur l’hypothèse que le matériel ne vous gêne pas. Mais si, alors vous n’atteignez pas les vitesses théoriques avec une charge de travail réelle.

Bien entendu, je pense que vous vous attendez toujours à une amélioration raisonnable des performances grâce à la combinaison de plusieurs disques dans un plus grand pool.

Ce qui est arrivé ensuite?

Jetons un coup d'oeil à vos tests: vous obtenez 80 Mo/s la première fois que vous copiez un gros fichier avec rsync , puis la deuxième fois que vous faites la même chose, vous obtenez 400 Mo/s. L'explication de la différence est Cache de remplacement adaptatif (ARC) et je pense que vous le savez déjà. Je vais juste le dire par souci d'exhaustivité.

ZFS ARC fournit un mécanisme pour stocker les données fréquemment consultées dans la RAM.

La première fois que vous lisez un fichier à partir d'un jeu de données ZFS, ZFS doit réellement lire les données du disque. pendant ce temps, il remplit son cache de lecture. La deuxième fois que vous lisez le même fichier, vous obtenez les données directement de RAM - et vous avez dit que votre système disposait de suffisamment de capacité pour contenir le fichier complet de 1,08 Go. Cela signifie que la vitesse que vous voyez lors de la copie du fichier à nouveau avec rsync (400 Mo/s) n'est pas liée à vos disques physiques du pool ZFS. Nous pouvons considérer cela comme la vitesse d'écriture de votre lecteur SSDsda. Pour être précis, pas la vitesse d'écriture de votre SSD raw : c'est la vitesse que vous obtenez lorsque vous utilisez rsync pour lire des données à partir d'un support à très faible latence et bande passante élevée (mémoire RAM) et écrivez sur votre lecteur SSD (qui a également une latence très faible). De plus, je pense que nous devrions considérer que Linux utilise probablement toute la mémoire disponible RAM pour mettre en cache les écritures asynchrones (en formulant des hypothèses ici!) Sur la partition du lecteur SSD.

Donc, à ce stade, une question se pose : si votre vitesse d'écriture RAM-sur-SSD semble être de 400 Mo/s, pourquoi obtenez-vous uniquement 80 Mo/s lorsque ZFS lit en fait sur le disque? C’est moins qu’une seule vitesse de disque! Clairement, le SSD lui-même ne peut pas être blâmé, et nous attendions beaucoup plus de tous ces disques du pool ZFS!

Donc, pour être tout à fait honnête: je n'ai pas de réponse complète. Après avoir examiné tout ce que j'ai dit jusqu'à présent, ma réponse partielle à votre question est:

  • Pour moi, il semble que la bande passante soit faible en raison d'une activité d'E/S élevée, ce qui signifie que rsync ne permet pas une lecture séquentielle directe du gros fichier, mais génère beaucoup d'E/S, ce qui peut avoir un impact important sur les performances de streaming. si le lecteur a une latence impliquée avec beaucoup d'E/S. Rappelons que les disques Western Digital Red sont destinés à des applications NAS , ce qui signifie qu’ils sont destinés à une bande passante décente et à un bon rapport $/Go, et non à des IOPS élevées. Lorsque vous avez fait exactement la même chose avec RAM (média à faible latence), les performances globales de diffusion étaient satisfaisantes.
  • rsync n'est PAS un bon moyen de benchmarking votre pool ZFS - ou quoi que ce soit d'autre. Si vous recherchez Google pour performance rsync , vous constaterez qu'il est plus lent que la copie d'un fichier normal - pour de bonnes raisons, je pense: la vitesse n'est pas la raison de votre utilisation de rsync. Je rechercherais une autre méthode de comparaison. Même juste dd ou cp pourrait être un meilleur choix pour le test séquentiel de lecture/écriture. Vous pouvez regarder cet article pour vous inspirer.
  • En outre, j'essayerais de comprendre les performances de lecture d'un disque real , l'exécution de tests avant même que les disques ne soient ajoutés à un pool ZFS. Détruisez le pool (vous perdrez des données: effectuez une sauvegarde si nécessaire!), Effectuez des tests sur chaque disque, définissez à nouveau le pool et effectuez d'autres tests. Ensuite, vous pouvez appliquer les calculs en fonction de la vitesse réelle observée et émettre des hypothèses - encore une fois - sur la bande passante de lecture théorique , en fonction de la configuration de votre pool ZFS (4 disques vdevs * 2 miroir = bande passante disque unique * 8).
  • Si vous exécutez des tests sur chaque disque, avant de les utiliser dans un pool, vous découvrirez peut-être qu'un ou plusieurs disques ne sont pas en bon état. Si vous venez d'acheter les disques, renvoyez les mauvais et demandez des remplacements.
  • Si vous exécutez des tests sur chaque disque et découvrez qu'ils fonctionnent tous lentement, vous pourriez être confronté à un problème lié au matériel - configuration, support de pilote ou autre problème similaire.
  • Je voudrais essayer différentes configurations matérielles (si possible) et exécuter des tests contre chacune. Exécutez les tests à l'aide d'un pool vdev à miroir unique, puis essayez de combiner davantage de vdev dans le mix. Voyez si cela vous donne les résultats escomptés.

Pour conclure : vous devez savoir méthodiquement où se trouve votre goulot d'étranglement. Ne présumez pas que c'est ZFS lui-même; ce n'est probablement pas. Essayez différentes configurations et exécutez des tests en utilisant les outils appropriés pour le travail.

Je ne suis ni un expert ni un expert en tests, je ne vais donc pas vous donner de conseils à ce sujet. Internet regorge de matériaux formidables sur le sujet. Je voulais juste aborder quelques aspects spécifiques à ZFS et, espérons-le, vous donner une direction à suivre.

2
Daniele Barresi