web-dev-qa-db-fra.com

Vitesses séquentielles lentes sur 9x7-lecteur RAIDZ2 (ZFS ZOL 0.8.1)

Je gère une grande piscine ZFS construite pour la taille de la demande de 256k + Lectures séquentielles et écrit via iSCSI (pour les sauvegardes) sur Ubuntu 18.04. Compte tenu de la nécessité d'un débit élevé et d'une efficacité spatiale et moins besoin de performances aléatoires à petit bloc, je suis allé avec des miroirs rayés rayés à rayures.

Cependant, les performances de lecture séquentielles de 256k sont bien inférieures à ce que j'aurais attendu (100 à 200 Mbps, pics jusqu'à 600 Mbps). Lorsque les Zvols frappent ~ 99% IOWAIT à IOSTAT, les dispositifs de support fonctionnent généralement entre 10 et 40% d'IOWAIT, ce qui me suggère que le goulot d'étranglement est quelque chose qui me manque dans la configuration, étant donné qu'il ne devrait pas être le fond de panier ou des processeurs Ce système et les charges de travail séquentielles ne devraient pas fonctionner trop fort de l'arc.

J'ai joué un peu avec des paramètres de module (configuration actuelle ci-dessous), lisez des centaines d'articles, des problèmes sur OpenZFS Github, etc. Le préfetage et l'agrégation de réglage m'ont obtenu ce niveau de performance - par défaut, je cours à environ ~ 50 Mbps sur Lit séquentielle en tant que ZFS envoiait de minuscules demandes aux disques (~ 16k). Avec l'agrégation et la préfecture de travail OK (je pense), les lectures de disque sont beaucoup plus élevées, environ ~ 64K en moyenne à Iostat.

Les nics sont la cible de LIO ISCSI avec CXGITBIT OFFLOCK + Windows Chelsio ISCSI Initiat bien en dehors des ZFS Zvols, avec une optane directement mappée de retourner à presque plein taux de ligne sur les NIC (~ 3,5 Gbps).

Est-ce que je m'attendais trop? Je sais que ZFS donne la priorité à la sécurité des performances, mais je m'attendais à ce qu'un RAAIDZ2 7x9 fournit de meilleures lectures séquentielles qu'un seul MDADM RAIDM de 9 lits.

Systèmes spécifiques et journaux/fichiers de configuration:

Chassis: Supermicro 6047R-E1R72L
HBAs: 3x 2308 IT mode (24x 6Gbps SAS channels to backplanes)
CPU: 2x E5-2667v2 (8 cores @ 3.3Ghz base each)
RAM: 128GB, 104GB dedicated to ARC
HDDs: 65x HGST 10TB HC510 SAS (9x 7-wide raidz2 + 2 spares)
SSDs: 2x Intel Optane 900P (partitioned for mirrored special and log vdevs)
NIC: Chelsio 40GBps (same as on initiator, both using hw offloaded iSCSI)
OS: Ubuntu 18.04 LTS (using latest non-HWE kernel that allows ZFS SIMD)
ZFS: 0.8.1 via PPA
Initiator: Chelsio iSCSI initiator on Windows Server 2019

Configuration du pool:

ashift=12
recordsize=128K (blocks on zvols are 64K, below)
compression=lz4
xattr=sa
redundant_metadata=most
atime=off
primarycache=all

Configuration Zvol:

sparse
volblocksize=64K (matches OS allocation unit on top of iSCSI)

Mise en page de piscine:

7x 9-wide raidz2
mirrored 200GB optane special vdev (SPA metadata allocation classes)
mirrored 50GB optane log vdev

/etc/modprobe.d/zfs.conf:

# 52 - 104GB ARC, this system does nothing else
options zfs zfs_arc_min=55834574848
options zfs zfs_arc_max=111669149696

# allow for more dirty async data
options zfs zfs_dirty_data_max_percent=25
options zfs zfs_dirty_data_max=34359738368

# txg timeout given we have plenty of Optane ZIL
options zfs zfs_txg_timeout=5

# tune prefetch (have played with this 1000x different ways, no major improvement except max_streams to 2048, which helped, I think)
options zfs zfs_prefetch_disable=0
options zfs zfetch_max_distance=134217728
options zfs zfetch_max_streams=2048
options zfs zfetch_min_sec_reap=3
options zfs zfs_arc_min_prefetch_ms=250
options zfs zfs_arc_min_prescient_prefetch_ms=250
options zfs zfetch_array_rd_sz=16777216

# tune coalescing (same-ish, increasing the read gap limit helped throughput in conjunction with low async read max_active, as it caused much bigger reads to be sent to the backing devices)
options zfs zfs_vdev_aggregation_limit=16777216
options zfs zfs_vdev_read_gap_limit=1048576
options zfs zfs_vdev_write_gap_limit=262144

# ZIO scheduler in priority order 
options zfs zfs_vdev_sync_read_min_active=1
options zfs zfs_vdev_sync_read_max_active=10
options zfs zfs_vdev_sync_write_min_active=1
options zfs zfs_vdev_sync_write_max_active=10
options zfs zfs_vdev_async_read_min_active=1
options zfs zfs_vdev_async_read_max_active=2
options zfs zfs_vdev_async_write_min_active=1
options zfs zfs_vdev_async_write_max_active=4

# zvol threads
options zfs zvol_threads=32

Je me déchire les cheveux sur ceci. La pression des utilisateurs d'utiliser toutes les fenêtres avec des espaces de stockage, mais j'ai utilisé des espaces de stockage de parité (même avec des espaces de rangement directs avec des miroirs sur le dessus), et ce n'est pas assez non plus. Je suis tenté d'aller droit Mdadm Raid60 sous Iscsi, mais j'aimerais adorer si quelqu'un pourrait signaler quelque chose d'osheadé, je me manque, cela déverrouille des performances avec la protection Bittrot de ZFS :)

10
obrienmd

Bonne question.

  • Je pense que votre taille de bloc zvol rare devrait être de 128k.
  • Vos paramètres de planificateur ZIO doivent tous être plus élevés, tels que minimum 10 et max 64.
  • zfs_txg_timeout doit être beaucoup plus long. Je fais 15 ou 30 ans sur mes systèmes.
  • Je pense que les multiples RAIDZ3 (ou était qu'un typographie) sont surchargés et jouent un rôle important dans la performance. Pouvez-vous comparer avec raidz2?

EDIT: Installation NetData sur le système et sur le moniteur UTILISATION ET ZFS STATS.

Edit2: Ceci est pour un référentiel Veeam. Veeam Support Linux en tant que cible et fonctionne à merveille avec ZFS. Voulez-vous envisager de comparer cela avec vos données? Les Zvols ne sont pas un cas d'utilisation idéal pour ce que vous faites, à moins que le déchargement de la carte réseau ne soit une partie critique de la solution.

7
ewwhite