SSD Optimierungen: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „<p> ==Einleitung== Im Vergleich zu mechanischen HDDs arbeiten SSDs rein elektronisch, die Datenspeicherung erfolgt auf Flash-Speicherchips. Hierdurch kann bei …“) |
K |
||
Zeile 70: | Zeile 70: | ||
:*auskommentieren der Zeile "log-bin=mysql-bin" | :*auskommentieren der Zeile "log-bin=mysql-bin" | ||
:*Neustart des MySQL Servers via "rcmysql restart" | :*Neustart des MySQL Servers via "rcmysql restart" | ||
+ | [[Kategorie:Partition]] |
Version vom 14. August 2013, 16:27 Uhr
Inhaltsverzeichnis
Einleitung
Im Vergleich zu mechanischen HDDs arbeiten SSDs rein elektronisch, die Datenspeicherung erfolgt auf Flash-Speicherchips. Hierdurch kann bei Einstatz von SSDs im Vergleich zu HDDs eine wesentlich höhere Performance erreicht werden. Flashspeicher unterliegt jedoch stärkeren Alterungsprozessen als mechanische Festplatten, er kann nur begrenzt neu beschrieben werden. Durch ausgeklügelte Algorithmen wie Wear-Leveling haben aktuelle SSDs bereits von Haus aus eine recht hohe Lebenserwartung. Dennoch ist eine Reduktion unnötiger Schreibzugriffe der Lebensdauer von SSDs zuträglich. Nachfolgend werden einige Maßnahmen beschrieben, die die Schreibzugriffe reduzieren und die Performance verbessern können:
Verringern der Schreibzugriffe, durch abschalten der Aktualisierung des Zeitpunkts des letzten Dateizugriffs.
Hierzu muss in der Datei /etc/fstab für alle auf einer SSD gelagerten Partitionen die mountoption "relatime" durch "noatime" ersetzt werden
- relatime: bei jedem Dateizugriff wird der Zeitpunkt des letzten Zugriffs auf den Datenträger geschrieben
- noatime: tut dies nicht
Trim aktivieren. Die meisten aktuellen SSDs unterstützen die TRIM Funktion. TRIM ist bei opensuse standardmäßig nicht aktiviert. Es kann durch Hinzufügen der Option "discard" in den Mountoptionen der auf der SSD eingerichteten Partitionen aktiviert werden.
Beispiel:
/dev/disk/by-id/my_shiny_new_ssd-part3 / ext4 discard,acl,user_xattr,noatime 1 1
Scheduling für ssds anpassen:
Diverse Quellen im Internet berichten, dass der deadline, bzw. noop Scheduler Perfomanceverbesserungen gegenüber dem CFQ (Completely Fair Queuing) Scheduler bei Einsatz von SSD Laufwerken bringen kann. Zwei Möglichkeiten den Scheduler permanent zu ändern sind, entweder über ein Kernelparameter im Bootloader oder via eines Regelsatzes für udev. Letzterer Variante ist der Vorzug zu geben, da sich der Bootparameter auf alle Laufwerke auswirkt und somit, sollte noch zusätzlich zur SSD herkömmliche mechanische Festplatten verbaut sein, diese dann auch das für sie ungünstigere Queing vom Kernel aufdiktiert bekommen. Die udev Variante sollte für jedes Laufwerk automatisch korrekt erkennen, ob es sich um eine (mechanische) HDD oder sine SSD handelt. Der Vollständigkeit halber führe ich hier beide Varianten auf, rate aber dazu Variante 2 zu verwenden
1. Setzen der Bootoption "elevator" für alle Laufwerke (NICHT empfohlen)
- Für GRUB:
- /boot/grub/menu.lst öffnen
- In der "kernel" Zeile die Option "elevator=noop" oder elevator="deadline" anfügen (Beispielueile: "kernel /vmlinuz26 root=/dev/sda3 ro elevator=noop"
- Für GRUB2:
- /etc/grub/default öffnen
- "GRUB_CMDLINE_LINUX" suchen und die den Wert "elevator=noop" oder "elevator=deadline" anfügen. (Beispielzeile: GRUB_CMDLINE_LINUX_DEFAULT="video=1920x1080 splash=silent quiet showopts elevator=noop")
- Für GRUB:
2. Erstellen eines udev scripts:
- in das Verzeichnis /etc/udev/rules.d/ wechseln
- eine neue Datei mit hoher, unbenutzter Prioritätsnummer anlegen:
- touch 60-disk-scheduling.rules
- chmod 644 60-disk-scheduling.rules
- Die Datei "60-disk-scheduling.rules" im editor öffnen und folgenden Inhalt eintragen:
# set deadline scheduler for non-rotating disks (may slightly improve SSD perfomrance) ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline" # set cfq scheduler for rotating disks (for rotating HDDs) ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="cfq"
- Änderungen speichern und Datei schliessen.
- Beim nächsten Reboot sollten die Änderungen automatisch übernommen werden.
P.S.: In meinem Fall (SanDisk SSD mit SanDisk Controller) konnte ich praktisch keine Unterschiede durch verändertes Scheduling festestellen, d.h. durch Änderung des Schedulers ergaben sich weder Performanceverbesserungen noch -einbußen. Bei anderen SSDs (in der Regel sind Marvel Controller verbaut) kann dies durchaus anders aussehen. Ob diese Maßnahme für eine bestimmte SSD sinvoll ist, läßt sich am einfachsten mit der Durchführung von Benchmarks unter Einsatz der verschiedenen Scheduler belegen.
Um zu überprüfen, welcher Scheduler gerade aktiv ist, kann folgendes Kommando verwendet werden, wobei "sdX" durch den Blockdevicenamen der abzufragenden Platte zu ersetzen ist z.B. "sda":
cat /sys/block/sdX/queue/scheduler
Die Ausgabe könnte wie folgt aussehen:
noop deadline [cfq]
Der Eintrag in eckigen Klammern ist das aktuell aktive Setting. Dieses kann auch ohne reboot on the fly verändert werden, durch folgendes Kommando (auch hier wieder sdX ersetzen):
echo deadline > /sys/block/sdX/queue/scheduler
Erneute Abfrage des Schedulestatus:
cat /sys/block/sdX/queue/scheduler
Die Ausgabe zeigt nun das deadline aktiv ist:
noop [deadline] cfq
Datenbankcheckpointingintervall von cyrus imap vergrössern:
Falls auf dem System ein Cyrus-IMAP-Server betrieben wird, dessen Datenbank auf der SSD liegt, können die Schreibzugriffe durch Vergrößerung des Checkpointingintervals reduziert werden. In der Datei /etc/cyrus.conf den Eintrag "checkpoint" suchen und den Wert der Option "period" verändern, Standard ist 30 Minuten:
checkpoint cmd="ctl_cyrusdb -c" period=30
MySQL Binary-Logging abschalten
Wird auf dem Rechner ein MySQL Server betrieben, der nicht Teil eines Clusters ist, empfiehlt es sich das Binärlogging abzuschalten. Hierdurch wird Speicherplatz gespart und durch Reduzierung der Schreibzugriffe die Lebensdauer der SSD erhöht. Zur Deaktivierung sind folgende Schritte durchzuführen:
- Öffnen der /etc/my.cnf
- auskommentieren der Zeile "log-bin=mysql-bin"
- Neustart des MySQL Servers via "rcmysql restart"