Tuning ZFS-Scrubbing, 141 KB / s für 15 Tage

14

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
3molo
quelle
Welches Mehrfachvorkommen von iostat -XnE | grep Errors sagt? Inkrementieren Sie die Fehleranzahl?
Null in allen Spalten
3.
Was smartctl -A /dev/disksagt über jedes Laufwerk aus (muss möglicherweise installiert werden smartctl, nicht sicher, ob es mit der Basisinstallation geliefert wird) ?
Chris S
1
Nichts von Interesse, außer "Nicht-mittlerer Fehlerzähler: 8071" auf einer Platte. Alle Festplatten befinden sich in einem JBOD (Dell MD1200) auf derselben (einzelnen)
SAS-

Antworten:

11

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):

  • zfs_scan_idle - Wenn Benutzer-E / A innerhalb dieser vielen Takt-Ticks auftritt, verzögern Sie Scrub-E / A um zfs_scrub_delay-Takt-Ticks
  • zfs_scrub_delay - Wieviele Clock-Ticks verzögern den Scrub-Vorgang, wenn er von zfs_scan_idle ausgelöst wird
  • zfs_top_maxinflight - maximale Anzahl von Scrub-E / A pro vdev der obersten Ebene
  • zfs_scrub_limit - maximale Anzahl von Scrub-E / A pro Blatt vdev
  • zfs_scan_min_time_ms - Mindestens ms, die pro txg für Bereinigungsvorgänge ausgegeben werden müssen
  • zfs_no_scrub_io - keine Notizen
  • zfs_no_scrub_prefetch - keine Notizen, der Name scheint zu implizieren, dass beim Scrub-Vorgang kein Prefetch ausgeführt wird

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!

Nex7
quelle
Ich nehme an, ich sollte beachten, dass Sie diese Einstellungen in bash mit "echo <tunable> / W0t <number> | mdb -kw" ändern. Und Sie sehen aktuelle Werte mit "echo <tunable> / D | mdb -k". Meine Notizen besagen, dass all diese Änderungen im Flug vorgenommen werden können, und dass anscheinend keine Änderung an / etc / system erforderlich ist und ein Neustart erforderlich ist, um wirksam zu werden.
Nex7
Ich sollte auch die gesamte Frage lesen, bevor ich antworte - und ServerFault während einer Telefonkonferenz nicht mehr durchsuchen. :)
Nex7
Die von% b und asvc_t gemeldeten Vorgänge implizieren eine sehr, sehr zufällige Lese-Workload (rotierende Festplatten sollten eine bessere Leistung erzielen, wenn sie wirklich sequentiell sind). Zuerst würde ich zfs_no_scrub_prefetch einschalten, 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 (zfs_txg_timeout & (zfs_txg_synctime_ms * 1000) ausführen. Ändern Sie zfs_txg_timeout auf 10 und zfs_txg_synctime_ms auf 5000, und versuchen Sie es dann Erhöhen Sie zfs_scan_min_time_ms auf 3000 oder 4000. Dies teilt ZFS mit, dass es viel länger für Scrubs ausgeben kann, normale E / A aushungern kann!
Nex7
Ich denke, Sie liefern sehr wertvolle Beiträge, aber es wäre viel hilfreicher, wenn Sie die Kommentare zu einer guten Antwort hinzufügen könnten.
3.
2
Mehr Abstimmung kann geholfen haben, aber nicht unbedingt. Es ist wichtig zu beachten, dass ein ZFS-Scrub die Datenstruktur durchläuft, NICHT Sektor für Sektor auf den Datenträgern. Das heißt, je nachdem, wie die zfs-Datenstruktur auf Ihren Datenträgern aussieht, kann ein Bereinigungsvorgang unglaublich zufällig aussehen - Ihre Datenträger können möglicherweise> 100 MB / s sequentiell lesen, aber ein vollständig zufälliges Lesen ist eine völlig andere Geschichte . Auch hier würde die durchschnittliche Blockgröße eine Rolle spielen.
Nex7
3

Ich vermute Hardware ...

Warum sollten Sie dies 15 Tage laufen lassen? Das ist nicht normal Stoppen Sie die Reinigung zpool scrub -s tankund überprüfen Sie das System.

  • Welche Controller verwenden Sie?
  • Ist dies das erste Peeling, das Sie jemals in diesem Pool durchgeführt haben?
  • Gab es ein Problem, das Sie dazu veranlasste, das Scrub überhaupt auszuführen?
ewwhite
quelle
1
LSI SAS9200-8e (IT-Firmware). Nicht erst schrubben. Nein, keine wirklichen Probleme (aber ich habe die sequentielle Lese- / Schreibleistung für eine Weile in Frage gestellt).
3molo
Aktualisiert mit Wartezeiten und Wartezeiten, wobei der Verdacht aufkommt, dass für Serviceanfragen immer etwas Zeit zur Verfügung steht und dass das Scrubben so niedrig priorisiert wird, dass es zum Stillstand kommt. Jeder Einblick ist sehr hilfreich!
3.
Scrubs sind wichtig, um regelmäßig ausgeführt zu werden. Warten Sie, bis Sie ein Problem beim Ausführen eines Scrubs haben, und fragen Sie, ob dieses Problem zu Datenverlust führen soll. Scrubs sind dazu da, unbeaufsichtigte Datenverfälschungen (Bitrot) aufzufangen. Ein langsam laufendes Scrub ist kein Anzeichen für ein Systemproblem, sondern nur ein Pool, der ausgelastet genug ist, um das Scrub nicht zu beschleunigen.
Lschweiss
0

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.

jytou
quelle
-3

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.

user169761
quelle
1
Ich sehe keinen Hinweis darauf, dass Ressourcen knapp sind.
3molo
1
Das ist so ziemlich völlig falsch. CPU und RAM haben praktisch keine Auswirkungen auf die Bereinigungsvorgänge (vorausgesetzt, es sind überhaupt keine frei). Wenn Sie viel freien RAM und CPU haben, werden die Scrub-Vorgänge nicht beschleunigt. Das Scrub wird begrenzt, indem eingehende E / A-Vorgänge im Pool überwacht werden, und nicht, indem nach verfügbaren Systemausfallzeiten gesucht wird.
Nex7