Ein ziemlich einfaches System, auf dem Mirror + Stripe auf SAS-Festplatten mit 7,2.000 U / min ausgeführt wird, die nicht besonders geladen sind. Keine Deduplizierung, Komprimierung aller Datensätze. Scrub läuft seit 15 Tagen mit der Geschwindigkeit einer toten Schnecke. Gibt es Optimierungsbedarf, oder kann dies an einer fehlerhaften Hardware liegen?
- Dell R510 mit MD1200-Gehäuse.
- 2x Xeon E5620
- 48 GB
- NexentaStor 3.1.3, Community Edition
Einige Informationen:
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
Das spa_last_io wird jedes Mal geändert, wenn ich dies ausführe
# 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
Alle 5 Sekunden werden ca. 20-25 MB / s geschrieben. Zwischen diesen Schreibvorgängen gibt es grundsätzlich keine Lese- oder Schreibvorgänge.
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
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
Sagen mir die Iostat-Werte, dass ich mehr Zeit auf die Festplatte warte, als ich müsste? Insbesondere die Spalte% 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
Die Latenz ein bisschen zu hoch?
# 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
Es wurden einige Optimierungen vorgenommen, die kaum einen Unterschied machten. zfs_top_maxinflight auf 127 gesetzt, zfs_scrub_delay auf 0 und zfs_scan_idle auf 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
Beachten Sie vor der MdB-Optimierung die Spalte mit dem ziemlich hohen B%
$ 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, beachte die b% spalte, 80-85% zeit in busy wait
$ 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
sagt über jedes Laufwerk aus (muss möglicherweise installiert werdensmartctl
, nicht sicher, ob es mit der Basisinstallation geliefert wird) ?Antworten:
ZFS-Scrub-Vorgänge funktionieren nach ziemlich verrückten Prinzipien. Vor allem verbringt es nur Zeit damit, zu schrubben, wenn nichts anderes vor sich geht. Wenn Sie einen Pool mit nur ein bisschen Datenzugriff auf einer ziemlich konstanten Basis stöbern, wird Scrub sich effektiv verhungern und fast nichts tun.
Zu untersuchende Tunables mit meinen kurzen Notizen zur Funktionsweise (ich habe dies jedoch vor einiger Zeit zum letzten Mal untersucht):
Alle diese Einstellungen können im Handumdrehen geändert werden, indem Sie "echo [einstellbar] / W0t [Nummer]" zum Ändern und "echo [einstellbar] / D" zum Anzeigen der aktuellen Einstellung verwenden (was ich vor dem Ändern empfehle).
Wenn Sie also in der Theorie und in der allgemeinen Praxis beispielsweise zfs_scan_idle auf 10 (oder 1 - oder 0, wenn dies unterstützt wird, muss der Code überprüft werden) und zfs_scrub_delay auf 1 (oder 0, wenn Dies wird unterstützt.) Wenn Ihre Einstellung für txg_synctime_ms 5000 oder mehr beträgt, ändern Sie möglicherweise zfs_scan_min_time_ms ein wenig, und die eigentliche Durchführung von Scrub-Vorgängen sollte selbst bei einem gewissen Grad an Benutzer-E / A-Vorgängen aggressiver werden.
In Ihrem speziellen Fall implizieren% b und asvc_t eine sehr, sehr zufällige Lese-Workload (rotierende Festplatten sollten besser funktionieren, wenn sie wirklich sequentiell sind), und Sie haben bereits die "einfachen" Aufgaben ausgeführt, wie oben erläutert . Also, zuerst würde ich zfs_no_scrub_prefetch aktivieren, um Prefetch bei Scrub-Operationen zu deaktivieren, nur um zu sehen, ob das geholfen hat. Wenn Sie keine Freude haben, können Sie je nach Nexenta-Version 30/5, 5/1 oder 10/5 ausführen (das ist die Kurzform, die wir für die Einstellungen von zfs_txg_timeout & (zfs_txg_synctime_ms * 1000) verwenden). Ändern Sie zfs_txg_timeout in 10 und zfs_txg_synctime_ms in 5000 und versuchen Sie dann, zfs_scan_min_time_ms auf 3000 oder 4000 zu erhöhen. Dies teilt ZFS mit, dass es im Vergleich zu den Standardeinstellungen für ältere NexentaStor-Installationen, die 5/1 als Standard verwenden, viel länger für Scrubs ausgeben kann - aber Vorsichtig,
Hoffe das hilft. Viel Glück!
quelle
Ich vermute Hardware ...
Warum sollten Sie dies 15 Tage laufen lassen? Das ist nicht normal Stoppen Sie die Reinigung
zpool scrub -s tank
und überprüfen Sie das System.quelle
Meine Antwort kommt etwas spät, aber wenn jemand anderem so etwas passiert, dann ist hier meine Meinung dazu: Probieren Sie einfach "dmesg" aus. In meinem Fall habe ich keine Bereinigung durchgeführt, aber ich habe Dateien auf die Datenträger kopiert, und ich habe deutlich gehört, dass die Datenträger einige Sekunden aktiv waren, dann alle für eine längere Zeit angehalten haben und wieder gearbeitet haben und so weiter. Dies lag am Ausfall eines SATA-Controllers und dmesg gab mir alle Fehler. Zuerst dachte ich, es sei eine fehlerhafte Festplatte, aber dann wurde mir klar, dass es sich tatsächlich um den Controller handelte.
quelle
Scrub nutzt verfügbare Systemausfallzeiten, auch auf einem entladenen Server, es geht um Verfügbarkeit. RAM und Prozessor sind die Schlüssel zur Bereinigung der Nutzung, nicht der Disc. Je mehr davon verfügbar sind, desto besser ist die Reinigungsleistung. In diesem Fall ist die Scrub-Leistung jedoch umso besser, je besser Ihre Disks in Bezug auf ZPools ausgelegt sind.
Wenn Ihre Leistung also langsam war und dies der Fall zu sein scheint, würde ich dies als mögliche Gründe ansehen.
quelle