Wie werden Schreibvorgänge mit einem internen SSD auf ein externes Laufwerk gepuffert?

684
Zyra

Diese Frage ist ein bisschen seltsam. Ich werde versuchen, so detailliert wie möglich zu sein.

Ich mache einen alten Computer für eine In-Home-Backup-Lösung neu. Die letzte Ruhestätte für die Daten ist ein externes G-Drive, das über USB 2.0 angeschlossen ist (ich habe Ihnen gesagt, dass es ein alter Computer ist.) Ich möchte herausfinden, wie Sie etwas Speicherplatz auf dem neuen glänzenden SSD-Laufwerk des Computers verwenden können, um Schreibvorgänge auf dem Computer zu puffern externes Laufwerk. Ich verwende OpenSUSE Leap 15 mit einer Serverinstallation.

Bis jetzt habe ich bcache gefunden, den ich in den Write-Back-Modus setzen konnte und etwas Ähnliches bekomme, was ich suche. Das Problem ist, dass die Partition, die ich für die Pufferung verwenden würde, Btrfs (transparente Komprimierung) verwendet, und es wurden Probleme bei der Verwendung der beiden zusammen gemeldet . Das arch-Wiki sagt, dass dies in 3.9 behoben wurde, aber ich finde das nirgendwo in der verlinkten Quelle.

Es gibt auch lvmcache . Der einzige Hinweis auf Writeback, den ich sehe, ist ein kurzer Blip in der Manpage, ohne weitere Erklärung. Ich verwende bereits lvm, um die SSD in verschiedene Partitionen mit Thin-Pools aufzuteilen. Ich würde also befürchten, dass ich mit lvmcache entweder ein neues dediziertes lvm-vg für beide Laufwerke erstellen muss, um die Thin-Pools davon abzuhalten nach außen ausbreiten. Zusätzlich gibt es Hinweise im BTRFS-Wiki, dass die Verwendung von BTRFS auf Blockebene zu Problemen führen kann.

DM-Cache ist eine weitere konfigurierbare Option, die ich gerade lerne. Da es auf Blockebene funktioniert, ist es immer noch möglich, dass es zu Konflikten mit btrfs kommt.

Die letzte Option ist das Einrichten einer SLOG-basierten ZIL mit zfs. Diese Quelle besagt, dass bei einer 1-Gbit / s-Verbindung der größte SLOG-Wert 0,625 GB betragen müsste, da dies alle 5 Sekunden geleert würde. Basierend auf umfangreichen Tests beträgt die höchste dauerhafte Schreibgeschwindigkeit, die ich auf dieses Laufwerk bekomme, 30 MB / s. Dies würde bedeuten, dass es 20 Sekunden dauern würde, einen 0,625-GB-Slog auf das ZFS-Laufwerk zu übertragen. (Update: Basierend auf dieser Quelle und dieser Quelle soll das SLOG-Gerät nicht den Durchsatz steigern, sondern nur die Latenz reduzieren.) (Update auf das Update: In den Kommentaren hat Dan klargestellt, was damit gemeint ist. Es ist immer noch wahrscheinlich, dass die ZIL könnte in diesem Szenario verwendet werden.)

Ich weiß, dass große Schreibvorgänge zwangsläufig durch die externe Verbindung zu Engpässen führen werden. Ich schätze, dass irgendetwas in der Größenordnung von mehreren zehn GB bei 30 MB / s landet. Mein Ziel ist es nicht, dieses Problem zu lösen. Ich werde wahrscheinlich rsync verwenden, um Daten an externe Geräte zu senden. Daher möchte ich die meisten Übertragungen von weniger als 10 GB beschleunigen.

Ich bin grundsätzlich neugierig, ob jemand anderes etwas Ähnliches getan hat und Empfehlungen hat oder auf eine bestimmte Option als besser als andere hinweisen kann. Im Moment denke ich, dass die ZFS / SLOG-Option die beste ist, wenn ein 10 GB-Slog-Laufwerk verwendet wird, aber ich habe keine Ahnung, wie dieses große Laufwerk mit dem 5-Sekunden-Flush spielen wird.

tl; dr: Was ist der beste Weg (obwohl ich nicht weiß, dass dies alles genau empfohlen wird ), um etwa 10 GB Daten auf einem internen Laufwerk zu puffern, das dann auf ein externes Laufwerk übertragen wird?

3
Sie haben die verrücktesten Probleme, die ausgefallensten Lösungen und gut recherchierten Ideen. Ich liebe es! Ricardo S. vor 5 Jahren 1
Dieses Problem ist mir bisher noch nicht begegnet, aber haben Sie sich dm-cache angesehen? (https://en.m.wikipedia.org/wiki/Dm-cache) davidgo vor 5 Jahren 1
@RicardoS. Hahaha, danke, ich tue was ich kann. Zyra vor 5 Jahren 0
@davidgo LVMCache [basiert auf] (http://strugglers.net/~andy/blog/2017/07/19/bcache-and-lvmcache/) dm-cache, wodurch möglicherweise dieselben durch block verursachten Probleme auftreten Level-Lösungen + Btrfs. Abgesehen davon scheint es eine Menge Konfigurationsmöglichkeiten innerhalb von dm-cache zu geben, einschließlich der Drosselung der Datenübertragung zwischen Cache und Ursprung. Dies bedeutet, dass, wenn ich das Problem der transparenten Komprimierung lösen kann, dm-cache ein besseres Block-Layer-Gerät sein kann als die beiden anderen. Danke für die Eingabe! :) Zyra vor 5 Jahren 0

1 Antwort auf die Frage

2
Dan

Ich glaube, dass eine der von Ihnen erwähnten Lösungen gut funktionieren würde (abzüglich der Interaktionen zwischen bcache/ LVM und BtrFS - ich weiß nicht mehr als Sie dort). Die Wahl hängt wahrscheinlich davon ab, was für Sie am einfachsten zu verstehen, einzurichten und zu warten ist.

Persönlich würde ich ZFS wählen, weil:

  1. Ich habe viel Erfahrung damit.
  2. Es bietet eine All-in-One-Lösung für diesen Anwendungsfall (Komprimierung plus Verwendung von SSDs zum Zwischenspeichern von Lese- und / oder Schreibvorgängen).
  3. Es bietet eine Reihe weiterer Funktionen (Snapshots und Clones, Dedup, RAID-Z, Replikation mit zfs send, Verschlüsselung, komprimierter RAM-Cache, ...), die möglicherweise in der Zukunft nützlich sind, auch wenn Sie sie jetzt nicht verwenden. Es gibt auch eine gesunde Open Source-Community, die ständig neue Funktionen hinzufügt.
Denken Sie, dass eine Erweiterung der SLOG-Größe Engpässe verhindern könnte? Die einzige Sorge, die ich mit ZFS habe, ist, dass die ZIL alle 5 Sekunden gespült wird. Ich bin nicht sicher, ob das bedeutet, dass Schreibvorgänge während des Spülvorgangs _halted_ werden oder was passiert. Ich muss mehr darüber lesen. ZFS war das, worauf ich mich auch beugte. Zyra vor 5 Jahren 0
Ich habe noch etwas recherchiert und es scheint, als wäre ein ZIL SLOG nicht der richtige Weg. [Dieser Artikel] (https://pthree.org/2012/12/06/zfs-administration-part-iii-the-zfs-intent-log/) legt nahe, dass die SLOG die Latenz verbessern wird, nicht aber den Durchsatz. Da auf das Gerät über das Netzwerk zugegriffen wird, ist die Latenz kein großes Problem. [This] (https://www.45drives.com/wiki/index.php?title=FreeNAS_-_What_is_ZIL_%26_L2ARC) scheint zuzustimmen. whomp whomp :( Zyra vor 5 Jahren 0
@Zyra: Richtig - das Verwenden eines Slog (oder eines beliebigen Schreib-Cache) beschleunigt das Schreiben, bis Sie es voll gefüllt haben. Dann verlangsamt sich alles auf die Geschwindigkeit des Hauptpools, während Dinge aus dem Cache verschoben werden. Dies ** verbessert ** den Durchsatz, wenn der erforderliche Durchsatz über dem des Hauptpools liegt. Wenn Ihre Arbeitslast jedoch durchgängig einen höheren Durchsatz als der Hauptpool erfordert, können Sie nur einen schnelleren Hauptpool verwenden. In Bezug auf Ihre andere Frage werden Schreibvorgänge nicht für die Bereinigung des Puffers blockiert, sondern nur für frühere Schreibvorgänge in das ZIL / slog. Dan vor 5 Jahren 1
Oh! Na dann. ZFS könnte in dieser Situation nur der Gewinner sein. Ich werde die Bearbeitung bearbeiten, die ich gerade gemacht habe. Wenn ich keine weiteren Antworten bekomme, wähle ich Ihre Antwort aus. Vielen Dank für die Klarstellung. Zyra vor 5 Jahren 0
Vielleicht wird dies vom falschen Ende aus angegangen. Ich verstehe, dass Sie beide darüber sprechen, wie Sie den Cache beschleunigen und stabilisieren können, indem Sie auswählen, welche fs für den beabsichtigten Zweck am besten geeignet ist, während Sie immer noch die krasse Einschränkung der USB 2.0-Verbindung haben. Die genannten 30 MB / s. Es kann sich lohnen, ein zweites USB-Laufwerk hinzuzufügen und beide ExtDrives als RAID 0 .. oder Stripe festzulegen. Wikipedia behauptet, dies steigert die Leistung. Ich glaube nicht, dass es zu viel ist, um zu glauben, dass zwei Laufwerke, auf die der Cache geladen werden kann, die Leistung verbessern werden. Ricardo S. vor 5 Jahren 1
@RicardoS. Auf jeden Fall - das Hinzufügen zusätzlicher Laufwerke und das Einlegen in einen gestreiften Zpool oder die Verwendung einer internen Festplatte anstelle eines über USB angeschlossenen Laufwerks würde die Leistung des Hauptpools verbessern. Die Bandbreite der Bandbreite wird annähernd linear mit der Anzahl der Laufwerke in ZFS skaliert (entweder für Striping oder für komplexere Konfigurationen wie RAID-Z, die mehr Redundanz zum Schutz vor Festplattenausfällen bieten) und wahrscheinlich auch für die meisten anderen Striping-Lösungen. Dan vor 5 Jahren 2
@Dan Striping erfolgt über vdevs oder? Nach meinem Verständnis werden alle Laufwerke zum Zeitpunkt der Erstellung in ein vdev gestellt (obwohl daran gearbeitet wird) (https://twitter.com/OpenZFS/status/921042446275944448?s=09) Kommentare, aber ich bin mir sicher, dass Sie es gesehen haben). Ich habe momentan keine Pläne, diesem Setup etwas anderes hinzuzufügen (es scheint klüger zu sein, eine defekte Idee zu erweitern und einfach einen Second-Hand-Xeon-Server von ebay oder so zu holen), aber in Zukunft wäre es klasse, es zu wissen wenn ich über vdevs strippen kann, nur gegen _within_ vdevs. Ist das sinnvoll? lol Zyra vor 5 Jahren 0
@Zyra Richtig, das Striping wird über die Konfiguration konfiguriert, die Sie `zpool create` angeben. Sie können heute noch weitere Festplatten über `zpool add` zu einem Pool hinzufügen ([Beispiel] (https://docs.oracle.com/cd/E53394_01/html/E54801/gayrd.html)), dies ist jedoch nicht möglich Festplatten zu einem RAID-Z hinzufügen, bis das von Ihnen erwähnte Projekt veröffentlicht ist. Dan vor 5 Jahren 1