EnhanceIO

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

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

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

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

  1. How to create persistent cache (github.com/stec-inc)
  2. Error on create (github.com/stec-inc)

Das könnte Sie auch interessieren

Adaptec maxCache SSD Cache
Flashcache Commands
Flashcache Installation