Un système assez basique exécutant miroir + bande sur des disques sas 7.2k rpm, pas particulièrement chargé. Pas de déduplication, compression sur tous les jeux de données. Scrub court depuis 15 jours à la vitesse d'un escargot mort. Y a-t-il une optimisation qui doit être faite, ou peut-elle être due à un matériel défectueux?
- Dell R510 avec boîtier MD1200.
- 2x Xeon E5620
- 48 Go
- NexentaStor 3.1.3, édition communautaire
Des informations:
scan: scrub in progress since Mon Apr 1 19:00:05 2013
171G scanned out of 747G at 141K/s, 1187h40m to go
0 repaired, 22.84% done
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c7t5000C500414FB2CFd0 ONLINE 0 0 0
c7t5000C500414FCA57d0 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c7t5000C500415C3B1Bd0 ONLINE 0 0 0
c7t5000C500415C5E4Fd0 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
c7t5000C500415DC797d0 ONLINE 0 0 0
c7t5000C500415DC933d0 ONLINE 0 0 0
logs
c7t5000A7203006D81Ed0 ONLINE 0 0 0
cache
c7t5000A72030068545d0 ONLINE 0 0 0
# iostat -en
---- errors ---
s/w h/w trn tot device
0 8887 0 8887 c2t0d0
0 0 0 0 c0t395301D6B0C8069Ad0
0 0 0 0 c7t5000C500415DC933d0
0 0 0 0 c7t5000A72030068545d0
0 0 0 0 c7t5000C500415DC797d0
0 0 0 0 c7t5000C500414FCA57d0
0 0 0 0 c7t5000C500415C3B1Bd0
0 0 0 0 c7t5000C500415C5E4Fd0
0 0 0 0 c7t5000C500414FB2CFd0
0 0 0 0 c7t5000A7203006D81Ed0
Le spa_last_io est changé chaque fois que je lance ce
# echo "::walk spa | ::print spa_t spa_name spa_last_io spa_scrub_inflight" | mdb -k
spa_name = [ "syspool" ]
spa_last_io = 0x25661402
spa_scrub_inflight = 0
spa_name = [ "tank" ]
spa_last_io = 0x25661f84
spa_scrub_inflight = 0x21
Toutes les 5 secondes, environ 20-25 Mo / s sont écrits. Entre ces écritures, il n'y a fondamentalement aucune lecture ou écriture.
capacity operations bandwidth latency
pool alloc free read write read write read write
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
syspool 427G 501G 0 0 0 0 0.00 0.00
c0t395301D6B0C8069Ad0s0 427G 501G 0 0 0 0 0.00 0.00
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
tank 903G 1.84T 810 5.21K 1.50M 20.8M 9.42 4.71
mirror 301G 627G 22 1.00K 53.0K 3.96M 8.96 3.93
c7t5000C500414FB2CFd0 - - 20 244 50.1K 3.97M 6.70 1.14
c7t5000C500414FCA57d0 - - 19 242 48.2K 3.97M 7.60 1.12
mirror 301G 627G 25 1016 46.8K 4.10M 16.11 5.28
c7t5000C500415C3B1Bd0 - - 21 257 41.6K 4.11M 4.63 1.24
c7t5000C500415C5E4Fd0 - - 21 255 43.0K 4.11M 16.54 1.15
mirror 301G 627G 62 754 119K 3.03M 19.72 3.78
c7t5000C500415DC797d0 - - 57 219 114K 3.03M 9.99 1.15
c7t5000C500415DC933d0 - - 56 220 119K 3.03M 13.20 1.22
c7t5000A7203006D81Ed0 260K 46.5G 0 0 0 0 0.00 0.00
cache - - - - - -
c7t5000A72030068545d0 93.1G 8M 0 0 0 0 0.00 0.00
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
Est-ce que les iostats me disent que je passe plus de temps à attendre le disque alors que je devrais le faire? Plus précisément la colonne% b
# iostat -xe
device r/s w/s kr/s kw/s wait actv svc_t %w %b s/w h/w trn tot
sd3 5.1 43.9 20.6 643.8 0.0 0.1 2.9 0 5 0 0 0 0
sd4 9.4 1.8 141.1 169.6 0.0 0.0 0.5 0 0 0 0 0 0
sd5 3.1 43.8 15.8 643.8 0.0 0.1 1.4 0 3 0 0 0 0
sd6 5.2 38.1 14.3 494.4 0.0 0.1 3.0 0 7 0 0 0 0
sd7 4.2 40.2 11.1 623.2 0.0 0.1 2.7 0 7 0 0 0 0
sd8 3.6 44.3 9.7 623.2 0.0 0.1 1.5 0 4 0 0 0 0
sd9 2.9 37.4 7.0 494.4 0.0 0.1 1.3 0 2 0 0 0 0
sd10 0.7 0.4 3.4 0.0 0.0 0.0 0.0 0 0 0 0 0 0
La latence un peu trop élevée?
# zpool iostat 10 10
capacity operations bandwidth latency
pool alloc free read write read write read write
tank 909G 1.83T 86 2.82K 208K 12.7M 22.68 13.63
---------- ----- ----- ----- ----- ----- ----- ----- -----
tank 909G 1.83T 29 857 42.4K 3.50M 17.86 4.47
---------- ----- ----- ----- ----- ----- ----- ----- -----
tank 909G 1.83T 30 947 46.1K 3.54M 15.55 5.67
Appliqué quelques ajustements qui ne faisaient guère de différence. zfs_top_maxinflight défini sur 127, zfs_scrub_delay sur 0 et zfs_scan_idle sur 0.
# echo zfs_top_maxinflight | mdb -k
zfs_top_maxinflight:
zfs_top_maxinflight: 127
# echo zfs_scrub_delay/D |mdb -k
zfs_scrub_delay:
zfs_scrub_delay:0
# echo zfs_scan_idle/D |mdb -k
zfs_scan_idle:
zfs_scan_idle: 0
scan: scrub in progress since Wed Apr 17 20:47:23 2013
1.85G scanned out of 918G at 1.14M/s, 229h36m to go
0 repaired, 0.20% done
pré-ajustement de mdb, notez la colonne b% plutôt élevée
$ iostat -nx -M 5
r/s w/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c2t0d0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c0t395301D6B0C8069Ad0
35.2 44.2 0.3 0.7 0.0 0.4 0.0 5.3 0 32 c7t5000C500415DC933d0
19.8 3.2 0.2 0.0 0.0 0.0 0.0 0.1 0 0 c7t5000A72030068545d0
31.2 46.2 0.2 0.7 0.0 0.3 0.0 4.4 0 27 c7t5000C500415DC797d0
30.6 46.8 0.2 0.8 0.0 0.4 0.0 4.6 0 28 c7t5000C500414FCA57d0
37.6 53.0 0.3 0.8 0.0 0.4 0.0 4.7 0 33 c7t5000C500415C3B1Bd0
37.6 53.6 0.3 0.8 0.0 0.5 0.0 5.6 0 39 c7t5000C500415C5E4Fd0
33.2 46.8 0.3 0.8 0.0 0.5 0.0 6.1 0 33 c7t5000C500414FB2CFd0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c7t5000A7203006D81Ed0
post mdb tweak, notez la colonne b%, 80-85% de temps en attente occupée
$ iostat -nx -M 5
r/s w/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c2t0d0
0.2 27.2 0.0 0.3 0.0 1.0 0.0 35.4 0 18 c0t395301D6B0C8069Ad0
129.6 20.2 0.9 0.4 0.0 2.9 0.0 19.5 0 85 c7t5000C500415DC933d0
48.4 4.0 0.4 0.0 0.0 0.0 0.0 0.1 0 1 c7t5000A72030068545d0
130.4 19.8 0.9 0.4 0.0 3.0 0.0 20.2 0 84 c7t5000C500415DC797d0
125.8 25.8 0.9 0.5 0.0 2.9 0.0 19.2 0 80 c7t5000C500414FCA57d0
131.2 24.2 0.9 0.5 0.0 3.1 0.0 20.3 0 83 c7t5000C500415C3B1Bd0
130.6 25.8 0.9 0.5 0.0 3.5 0.0 22.5 0 88 c7t5000C500415C5E4Fd0
126.8 28.0 0.9 0.5 0.0 2.8 0.0 18.0 0 79 c7t5000C500414FB2CFd0
0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0 0 c7t5000A7203006D81Ed0
smartctl -A /dev/disk
dit-on de chaque lecteur (il peut être nécessaire d'installersmartctl
, je ne sais pas s'il est fourni avec l'installation de base).Réponses:
Les opérations de nettoyage de ZFS fonctionnent sur des principes assez cérébraux. Plus particulièrement, il ne passe du temps à nettoyer que lorsqu'il n'y a rien d'autre. Si vous percez un pool avec juste un peu d'accès aux données sur une base assez constante, scrub va effectivement se priver de nourriture et ne fera presque rien.
Tunables à explorer, avec mes notes rapides sur ce qu'il fait (j'ai pour la dernière fois examiné cela il y a un certain temps):
Tous ces éléments peuvent être modifiés à la volée en utilisant "echo [tunable] / W0t [nombre]" pour changer, et "echo [tunable] / D" pour afficher le réglage actuel (ce que je recommande de faire avant de changer).
Donc, en théorie et dans la pratique générale, si vous deviez, par exemple, changer zfs_scan_idle en 10 (ou 1 - ou 0, s'il le prend en charge, il faudrait vérifier le code) et zfs_scrub_delay en 1 (ou 0, si il prend en charge cela), et si votre paramètre txg_synctime_ms est 5000 ou plus, peut-être changer un peu zfs_scan_min_time_ms, il devrait devenir beaucoup plus agressif de faire des opérations de scrub même avec un certain niveau d'E / S utilisateur.
Dans votre cas spécifique, les% b et asvc_t signalés impliquent une charge de travail de lecture très, très aléatoire (les disques en rotation devraient faire mieux que si c'est vraiment séquentiel), et vous avez déjà fait le truc "facile" comme expliqué ci-dessus . Donc, je voudrais d'abord activer zfs_no_scrub_prefetch, pour désactiver la prélecture sur les opérations de scrub, juste pour voir si cela a aidé. En cas de non-joie, selon la version de Nexenta sur laquelle vous vous trouvez - vous exécutez peut-être 30/5, 5/1 ou 10/5 (c'est un raccourci que nous utilisons pour les paramètres de zfs_txg_timeout & (zfs_txg_synctime_ms * 1000)). Remplacez zfs_txg_timeout par 10 et zfs_txg_synctime_ms par 5000, puis essayez de mettre zfs_scan_min_time_ms à 3000 ou 4000. Cela indique à ZFS qu'il peut consacrer beaucoup plus de temps aux gommages, par rapport aux paramètres par défaut des anciennes installations NexentaStor qui utilisent 5/1 comme valeurs par défaut, mais prudent,
J'espère que cela t'aides. Bonne chance!
la source
Je soupçonne du matériel ...
Pourquoi voudriez-vous laisser cela fonctionner pendant 15 jours? Ce n'est pas normal. Arrêtez le nettoyage -
zpool scrub -s tank
et vérifiez le système.la source
Ma réponse arrive un peu tard, mais si ce genre de chose arrive à quelqu'un d'autre, voici mon avis: essayez simplement "dmesg". Dans mon cas, je ne faisais pas de nettoyage, mais je copiais des fichiers sur les disques, et j'entendais clairement que les disques étaient actifs pendant quelques secondes, puis tous s'arrêtaient plus longtemps, puis fonctionnaient à nouveau, etc. Cela était dû à la défaillance d'un contrôleur SATA et dmesg m'a donné toutes les erreurs. Je pensais que c'était un disque défaillant au début, mais j'ai réalisé que c'était en fait le contrôleur.
la source
Scrub utilise les temps d'arrêt système disponibles, même sur un serveur déchargé, c'est une question de disponibilité. Ram et processeur sont les clés de l'utilisation de scrub, pas le disque. Plus ils sont disponibles, meilleures seront les performances de votre gommage. Cependant, dans ce cas, certainement, mieux vos disques sont disposés, en termes de ZPools, meilleures seront vos performances de scrub.
Donc, si vos performances ont été lentes et que cela semble être le cas, je considérerais ces raisons comme des raisons potentielles.
la source