EnhanceIO
Hinweis: Bitte beachten Sie, dass dieser Artikel / diese Kategorie sich entweder auf ältere Software/Hardware Komponenten bezieht oder aus sonstigen Gründen nicht mehr gewartet wird. Diese Seite wird nicht mehr aktualisiert und ist rein zu Referenzzwecken noch hier im Archiv abrufbar. |
---|
Der EnhanceIO Treiber basiert auf der EnhanceIO SSD Caching Software die von der Firma STEC Inc entwickelt wird. EnhanceIO wurde aus Facebook's Open Source Flashcache Projekt abgeleitet. EnhanceIO verwendet SSDs als Cache Devices für traditionelle HDDs. EnhaceIO kann mit allen Arten von Blockdevices verwendet werden (RAIDs, SAN-Volumes, Software-RAIDs,...).
Architektur
Das Mapping des Caches basiert auf sogenannten Cache-Sets. Ein solches Set besteht aus 512 Blöcken mit einer Blocksize von 4KB, es werden keine Teilblöcke verwendet. Daraus folgt dass z.B. eine 400GB SSD in etwas weniger als 200.000 Cache-Sets (1 Set = 2MB (512*4KB)) unterteilt wird, da auch noch etwas Platz für die Metadaten verwendet wird.
EnhanceIO bietet folgende Cache Modi:
- Read-only
- Write-through
- Write-back
Im Read-only Mode werden alle write Operationen direkt zur HDD weitergeleitet. Bei read Operationen werden die Daten zuerst auf die SSD geschrieben und bei erneutem Zugriff auf den gleichen Block wird von der SSD gelesen.
Im Write-through Mode werden read Operationen ähnlich behandelt wie bei Read-only, allerdings werden die write Operationen auf HDD und SSD durchgeführt somit können nachfolgende Reads von der SSD behandelt werden.
Im Write-back Mode werden read- und write Operationen zuerst auf der SSD durchgeführt, die geschriebenen Daten werden als "dirty" bezeichnet bis sie durch den Caching Algorithmus asynchron auf die HDD geschrieben wurden. Reads werden ähnlich behandelt wie im Read-only oder Write-back Mode.
Da EnhanceIO nicht, wie Flashcache, den Device-Mapper verwendet, können Caches vollständig transparent erzeugt werden. Das bedeutet, dass es möglich ist einen Cache für ein Volume zu erstellen, das bereits gemountet ist. Es ist allerdings nicht möglich einen Write-back Cache für das Root-Filesystem zu erstellen, da die udev Regeln die für das Erstellen des Caches beim Startup zuständig sind erst greifen wenn Root bereits read-only gemountet ist.
Anders als andere Caching Software bietet EnhanceIO keine Funktion die Sequentielle Zugriffe erkennt und nicht durch den Cache leitet. Das ist Absicht und wurde gegenüber Flashcache geändert.
Voraussetzungen
- Kernel Version 3.7 oder höher (getestet wurde mit 3.11)
- Python 2.6.6 oder höher (Python 2.x.x)
- SSD mit hoher Haltbarkeit (Endurance), z.B. Intel DC S3610 Series SSDs oder Intel DC S3710 Series SSDs. Sie können die Haltbarkeit von vielen SSDs zusätzlich durch eine größere Spare Area erhöhen - siehe Absatz Spare Area des Artikels Solid State Drive.
Die folgenden Tests wurden mit einer Standard-Installation von Ubuntu Server 13.10 x64 durchgeführt. Von Wiki-Lesern haben wir auch die Rückmeldung erhalten, dass dieses Setup auch weiterhin mit z.B. Ubuntu 15.04 so funktioniert.
Installation EnhanceIO via git
Die aktuellen EnhanceIO Files werden aus dem Git-Repo geklont.
git clone https://github.com/STEC-inc/EnhanceIO
cd EnhanceIO
Konsolentools
Anschließend werden die Konsolentools installiert:
sudo cp CLI/eio_cli /sbin/
chmod 700 CLI/eio_cli
Damit die Manpage aufgerufen werden kann muss das entsprechende File kopiert werden.
sudo cp ./CLI/eio_cli.8 /usr/share/man/man8/
Treiber
Der Treiber muss selbst kompiliert werden. STEC empfiehlt folgende Vorgangsweise, die bei unseren Tests allerdings zu Fehlern führte.
cd Driver/enhanceio/
sudo apt-get install build-essential
make
sudo make install
Hier nun die Schritte die bei unserem Test das gewünschte Resultat erzielten.
sudo apt-get install build-essential dkms
cd Driver
sudo cp -r enhanceio /usr/src
sudo mv /usr/src/enhanceio /usr/src/enhanceio-0.1
cd /usr/src/enhanceio-0.1
sudo vim dkms.conf
Hier muss nun folgende Zeile angepasst werden.
PACKAGE_VERSION="0.1"
Dann müssen folgende dkms-Befehle ausgeführt werden:
sudo dkms add -m enhanceio -v 0.1
sudo dkms build -m enhanceio -v 0.1
sudo dkms install -m enhanceio -v 0.1
Jetzt muss das System neu gestartet werden, um die Installation abzuschließen.
Installation EnhanceIO via Repository
- Debian: enhanceio ist im Oktober 2015 noch experimentell eingestuft: https://packages.debian.org/experimental/kernel/enhanceio-dkms
- Ubuntu: PPA https://launchpad.net/~enhanceio/+archive/ubuntu/daily
Sowohl unter Debian als auch Ubuntu werden für die Packages sind zum Kompilieren nur dkms und kernel-headers erforderlich.
Caching einrichten
Mit dem zuvor installiertem Konsolentool kann sehr einfach ein Cache erzeugt werden, dazu ist nur folgender Befehl erforderlich:
sudo eio_cli create -d /dev/sdb -s /dev/sdc4 -m wb -c enhanceio_test
│ │ │ └Name des Caches (wird intern von EnhanceIO benötigt)
│ │ └Art des Caches(wb=writeback (nur bei SSDs mit power-loss data protection wählen!), wt=writethrough, ro=readonly)
│ └Caching Device (SSD)
└Source Device (HDD)
Wichtiger Hinweis: Wählen Sie writeback nur dann, wenn Sie SSDs mit power-loss data protection im Einsatz haben (z.B. Intel DC S3610 Series SSDs oder Intel DC S3710 Series SSDs). Ansonsten besteht bei einem Stromausfall das Risiko eines Datenverlusts!
Das Caching ist transparent, das bedeutet ab diesem Zeitpunkt finden sämtliche Zugriffe auf /dev/sdb über den Cache statt. Es wird kein neues Device erzeugt. Der Cache ist persistent, d.h. über einen Reboot hinweg verfügbar.
Achtung: Bei Caches auf Root-Devices ist Vorsicht geboten, vor allem wenn ein Cache persistent sein soll:[1][2]
Creating a writeback cache on root device is not supported. This is because the root device is mounted as read only prior to the processing of udev rules.
Cache Monitoring
Um Basisinformationen über aktuelle Caches zu erhalten kann folgender Befehl verwendet werden.
sudo eio_cli info
Beispielausgabe:
Cache Name : enhanceio_test
Source Device : /dev/sdb
SSD Device : /dev/sdc4
Policy : lru
Mode : Write Back
Block Size : 4096
Associativity : 256
State : normal
Um detailliertere Informationen zu erhalten kann der Ordner /proc/enhanceio/<cache_name>/ verwendet werden. Hier finden sich z.B. unter
cat /proc/enhanceio/enhanceio_test/stats
verschiedene Statistiken (z.B. Anzahl der gecacheten Blöcke, Reads/Writes auf HDD/SSD,...).
Beispielausgabe:
reads 930 #Gesamte Leseoperationen auf den Cache
writes 1463784 #Gesamte Schreiboperationen auf den Cache
read_hits 930 #Anzahl der Cache-"Hits" beim Lesen
read_hit_pct 100 #Prozentsatz der Lese-"Hits" im Verhältnis zu allen Leseoperationen
write_hits 1463784 #Anzahl der Cache-"Hits" beim Schreiben
write_hit_pct 100 #Prozentsatz der Schreib-"Hits" im Verhältnis zu allen Schreiboperationen
dirty_write_hits 1
dirty_write_hit_pct 0
cached_blocks 184036 #Anzahl der gecacheten Blöcke
rd_replace 0
wr_replace 0
noroom 0
cleanings 0
md_write_dirty 182972 #Metadata dirty-Writes
md_write_clean 0 #Metadata clean-Writes
md_ssd_writes 182971 #Metadata Schreiboperationen auf die SSD
do_clean 0
nr_blocks 5222144 #Anzahl Blöcke im Cache
nr_dirty 182972 #Anzahl der "dirty" Blöcke (Blöcke die nur im Cache sind, noch nicht auf der HDD)
nr_sets 20399 #Anzahl der Cache-Sets
clean_index 0
uncached_reads 0
uncached_writes 0
uncached_map_size 0
uncached_map_uncacheable 0
disk_reads 0 #Leseoperationen auf der HDD
disk_writes 16 #Schreiboperationen auf der HDD
ssd_reads 946 #Leseoperationen auf der SSD
ssd_writes 1646755 #Schreiboperationen auf der SSD
ssd_readfills 0
ssd_readfill_unplugs 0
readdisk 0
writedisk 0
readcache 117
readfill 0
writecache 182973
readcount 117
writecount 182973
kb_reads 465
kb_writes 731892
rdtime_ms 24 #Zeit in ms die gelesen wurde
wrtime_ms 53800 #Zeit in ms die geschrieben wurde
Cache Tuning
EnhanceIO bietet über sysctl noch weitere Möglichkeiten das Caching individuell anzupassen und zu optimieren. Der Großteil dieser Optionen bezieht sich auf das Cleaning-Verhalten bei Verwendung des Writeback Caches. Hier eine kurze Beschreibung der verfügbaren Einstellungen (zu finden in /proc/sys/dev/enhanceio/cache_name/).
autoclean_threshold #Automatisches "cleaning" des Caches wenn die anstehenden IO-Operationen für die HDD unter diesem Wert liegen
control
dirty_high_threshold #Max % an "dirty" Data im gesamten Cache bevor das "cleaning" ausgeführt wird
dirty_low_threshold #Min % an "dirty" Data im gesamten Cache damit das "cleaning" ausgeführt wird
dirty_set_high_threshold #Max % an "dirty" Data in einem Cache-Set bevor das "cleaning" ausgeführt wird
dirty_set_low_threshold #Min % an "dirty" Data in einem Cache-Set damit das "cleaning" ausgeführt wird
do_clean
mem_limit_pct
time_based_clean_interval #Zeit die zwischen zwei "cleanings" vergehen soll (Time-Based-Cleaning)
zero_stats
Diese Werte sollten nur in Spezialfällen geändert werden, da sie die Performance und Konsistenz des Caches beeinflussen können. Wenn Sie einen Wert ändern möchten kann dies mithilfe von sysctl bewerkstelligt werden.
sudo sysctl -w dev.enhanceio.<cache_name>.<value_to_change>=<new value>
z.B.
sudo sysctl -w dev.enhanceio.enhanceio_test.autoclean_threshold=128
Cache beenden
Falls der Cache als Writecache eingesetzt wurde, müssen vor dem Beenden des Cachings alle dirty blocks von der SSD auf die HDD geschrieben werden um Inkonsistenzen zu vermeiden.
Dazu stellt man den Cache zuerst auf den Read-only Mode um:
sudo eio_cli edit -c <cache_name> -m ro
Nun muss gewartet werden bis
cat /proc/enhanceio/enchanceio_test/stats | grep nr_dirty
auf 0 steht. In einem unserer Tests war die Datenrate des Abgleichs ca. 900-1000kb/s, jedoch haben wir dabei eine clean Operation ausgeführt (keine Umstellung auf den Read-Only Mode).
Dann kann das Caching wie folgt beendet werden:
sudo eio_cli delete -c <cache_name>
Damit ist das Caching beendet.
Hinweis: Zum Beenden des Cachings hat der Read-only Mode gegenüber einer clean Operation (sudo eio_cli clean -c <cache_name>
) folgenden Vorteil, dass kein Unmount des Devices gemacht werden muss. Dies ist vor einer clean Operation erforderlich, weil sonst nach dem Cleaning wieder dirty blocks in den Cache geschrieben werden.
Einzelnachweise
- ↑ How to create persistent cache (github.com/stec-inc)
- ↑ Error on create (github.com/stec-inc)