Optimale ARC- und L2ARC-Einstellungen für zweckspezifische Speicheranwendungen

Optimale ARC- und L2ARC-Einstellungen für zweckspezifische Speicheranwendungen

Ich konfiguriere einen Server, auf dem 3 ZFS-Pools laufen, von denen 2 eher zweckgebunden sind, und ich habe das Gefühl, dass die Standardempfehlungen für sie einfach nicht optimiert sind. Die Vernetzung wird durch zwei 10-GBit-Adapter erleichtert.

Pool 1 ist ein großer Dateispeicher. Er enthält Rohvideodaten, die selten geschrieben und gelesen werden, sowie gelegentliche Backups. Es ist absolut sinnlos, irgendetwas aus diesem Pool zwischenzuspeichern, da es sich um Daten mit hoher Bandbreite handelt, die in einem Durchgang von Anfang bis Ende durchgelesen werden. Das Zwischenspeichern von irgendetwas aus diesem Pool wäre reine Speicherverschwendung. Latenz ist kein so großes Problem und die Bandbreite ist aufgrund der stark komprimierbaren Daten ausreichend. Der Pool besteht aus 8 Festplatten im Z2-Modus mit einer nutzbaren Kapazität von 24 TB.

Pool 2 ist ein Speicher für komprimierte Videobilder. Teile dieses Inhalts werden beim Compositing von Videoprojekten häufig gelesen. Der Anteil häufig verwendeter Daten ist normalerweise höher als die Gesamtmenge an RAM, die der Server hat. Es besteht eine geringe Latenzanforderung, aber keine extrem geringe, die Bandbreite ist wichtiger. Der Pool besteht aus 3 Festplatten in z1, einer nutzbaren Kapazität von 8 TB und einer 1 TB NVME SSD für L2ARC.

Pool 3 ist allgemeiner Speicher, der als Speicher für mehrere Computersysteme verwendet wird, die von ihm und nicht von lokalem Speicher aus Software starten und ausführen. Da er mehrere Maschinen und primären Systemspeicher bedienen muss, sind die Anforderungen an Latenz und Bandbreite hier am höchsten. Aus diesem Pool wird hauptsächlich gelesen, Schreibvorgänge sind auf die Aktivitäten der Clientsysteme beschränkt. Der Pool besteht aus 3 SATA-SSDs im Z1-Modus mit 1 TB nutzbarer Kapazität.

Meine Absicht bei der Optimierung besteht darin, die ARC-Größe für die ersten beiden Pools zu minimieren, um die ARC-Größe für den dritten zu maximieren.

Pool 1 hat keinerlei Vorteile aus der Zwischenspeicherung. Wie hoch ist also die sichere Mindestmenge an ARC, die ich dafür festlegen kann?

Pool 2 kann von ARC profitieren, aber es lohnt sich nicht wirklich, da L2ARC für diesen Zweck schnell genug ist und das Laufwerk eine Kapazität von 1 TB hat. Im Idealfall wäre ich froh, wenn ich für dieses Volume auf ARC verzichten und das volle Terabyte an L2ARC nutzen könnte, aber es scheint, dass zumindest etwas ARC für L2ARC-Headerdaten erforderlich ist.

Wenn ich also eine L2ARC-Kapazität von 1 TB und eine Pool-Datensatzgröße von 64 KB berücksichtige, erhalte ich mit 1 TB / 64 KB * 70 B ~0,995 GB. Bedeutet das, dass ich den ARC für diesen Pool problemlos auf 1 GB begrenzen kann? Oder braucht es vielleicht mehr?

Es scheint, dass der ARC sowohl Lesecache als auch die Informationen zur Handhabung des L2ARC enthält. Es sieht also so aus, als bräuchte ich eine Option, um den Schwerpunkt auf die Verwaltung eines größeren L2ARC zu legen, anstatt mich mit dem Zwischenspeichern tatsächlicher Daten im RAM herumzuschlagen. Und falls nötig, muss vorgeschrieben werden, dass alle Cache-Auslagerungen aus dem ARC nach L2ARC verschoben werden, falls die Cache-Auslagerungsrichtlinien nicht den üblichen Richtlinien zur Cache-Hierarchie entsprechen.

Die allgemeinen Empfehlungen, die ich gelesen habe, gehen von etwa 1 GB RAM pro 1 TB Speicher aus. Ich plane 32 GB RAM pro 33 TB Speicher, womit ich fast genau liege, aber 4 oder 5 zu 1 für L2ARC vs. ARC, womit ich deutlich hinterherhinke. Das Ziel ist, Pool 1 ARC so weit wie möglich zu reduzieren und Pool 2 ARC nur so weit wie nötig zu reduzieren, um das gesamte 1 TB L2ARC nutzen zu können, um den für ARC verfügbaren RAM für Pool 3 zu maximieren.

Antwort1

Zunächst empfehle ich Ihnen dringend, Ihr Layout für die Pools Nr. 2 und Nr. 3 zu überdenken: Ein 3-Wege-Spiegel bietet weder eine geringe Latenz noch eine hohe Bandbreite. Statt einer teuren 1-TB-NVMe-Festplatte für L2ARC (die übrigens aufgrund der kleinen 32-GB-ARC unausgewogen ist) würde ich mehr 7200-RPM-Festplatten im RAID10-Modus oder sogar billigere, aber zuverlässige SSDs (z. B. Samsung 850 Pro/Evo oder Crucial MX500) verwenden.

Zumindest können Sie alle Festplatten in einem einzigen RAID10-Pool (mit SSD L2ARC) platzieren und den einzelnen Pool anhand mehrerer Datensätze segmentieren.

primarycacheDas heißt, Sie können mithilfe der Optionen und für jeden Datensatz einzeln angeben, wie ARC/L2ARC verwendet werden soll secondarycache:

  • zfs set primarycache=none <dataset1> ; zfs set secondarycache=none <dataset1>wird deaktivierenbeliebigARC/L2ARC-Caching für den Datensatz. Sie können zfs set logbias=throughput <dataset1>bei Schreibvorgängen auch den Durchsatz statt der Latenzzeit privilegieren.
  • zfs set primarycache=metadata <dataset2>aktiviert das Zwischenspeichern nur von Metadaten für den zweiten Datensatz. Bitte beachten Sie, dass L2ARC von ARC gespeist wird. Dies bedeutet, dass, wenn ARC nur Metadaten zwischenspeichert, dasselbe für L2ARC gilt.
  • Belassen Sie die Standardoption ARC/L2ARC für den dritten Datensatz.

Schließlich können Sie Ihre ZFS-Instanz so einstellen, dass sie mehr als (die Standardeinstellung) 50% Ihres RAM für ARC verwendet (suchen Sie zfs_arc_maximModul-Manpage)

verwandte Informationen