Ubuntu für SSD optimieren
Solid State Festplatten (SSD) büßen am meißten ihrer Lebensdauer durch Schreibzugriffe ein. Es gibt viele Prozesse und Funktionen bei denen unser Ubuntu Daten auf die Platte schreibt, einige davon laufen in Hintergrund und fallen uns gar nicht so bewusst auf.
Generell ist es sinnvoll für Partitionen auf der SSD den Parameter noatime in der /etc/fstab zu setzen.
/dev/sda1 / ext4 noatime,errors=remount-ro 0 1
Der Parameter noatime verhindert das setzen des Zeitstempels für den letzten Lesezugriff auf Dateien.
Lese- und Schreibzugriffe
Um herauszufinden wann und was auf unsere Festplatte geschrieben wird, gibt es ein paar Befehle die ganz nützlich sind.
Um z.B. Lese- und Schreibzugriffe auf unsere Platte sehen zu können aktivieren wir das logging dafür mit dem Befehl:
echo 1 >/proc/sys/vm/block_dump
Jetzt kann man mit
tail -f /var/log/syslog
beobachten wann von der Platte gelesen oder auf sie geschrieben wird.
Wir erhalten dabei Ausgaben wie die folgende:
Apr 27 23:03:13 srv1 kernel: [22002.728653] mozStorage #7(4646): WRITE block 11963148 on sda1 (328 sectors)
Apr 27 23:03:13 srv1 kernel: [22002.749616] jbd2/sda1-8(449): WRITE block 94802732 on sda1 (8 sectors)
Wenn wir fertig sind, nicht vergessen das Logging wieder zu deaktivieren. Das geht mit:
echo 0 >/proc/sys/vm/block_dump
Bei mir hat der Prozess jbd2 sehr viele Schreibzugriffe verursacht. Der JBD (journaling block device) ist für ext4 und sitzt zwischen dem System und dem Block Device Treiber.
Verwendung der Swap Partition verringern
Man kann unter Ubuntu einstellen wie stark das System den Swap-Speicher verwenden soll. Den aktuellen Wert der Einstellung kann man ansehen mit:
cat /proc/sys/vm/swappiness
Je niedriger dieser Wert ist um so mehr System Load muss vorhanden sind, bevor das System anfängt den Swap Speicher zu nutzen. Der Standardwert dürfte so bei 60 liegen.
Den Wert kann man anpassen in dem man die Datei /etc/sysctl.conf ändert.
sudo nano /etc/sysctl.conf
An das Ende der Datei folgenden Inhalt einfügen:
# Sharply reduce swap inclination
vm.swappiness=1
# Improve cache management
vm.vfs_cache_pressure=50
Dann den Rechner neu starten und nochmal den Wert ausgeben lassen.
Eine SSD partitioniert man so dass ca. 10-20% unformatierter Speicherplatz auf der Platte übrig bleiben. Das scheint wohl dafür zu sein, um defekte Zellen zu kompensieren. Auch die Schreibgeschwindigkeit soll daudurch positiv beeinflusst werden.
Für die Einrichtung von Over-Provisioning gibt es sogar ein Tool von Samsung, das SSD Magician 3.2.
Da Linux, zum Segen aller Administratoren, recht ausführlich Logfiles schreibt, haben wir natürlich ständig kleine Schreibzugriffe auf unsere Systemfestplatte. Das ist für unsere SSDs natürlich nicht so gut.
Es gibt zwei Möglichkeiten wie wir diese Zugriffe von unserer SSD fernhalten können:
Entweder verwenden wir für die Logfiles einen Flash Speicher, wie z.B. einen alten USB Stick. Das hätte den Vorteil, dass die Logs auch nach einem Neustart noch vorhanden wären, würde aber zum gleichen Problem führen wie wir mit den SSDs schon haben, und zwar dass Schreibvorgänge den Flash-Speicher schnell altern lassen.
Oder man legt die Logs in eine Ramdisk. Das hat den Vorteil, dass wir keinerlei Schreibzugriffe auf persitenten Speichern mehr haben. Der Nachteil ist aber, dass die Logs nach einem Neustart weg sind.
Zuerst einmal können wir prüfen ob wir evtl. ein Logfile haben, in das übermäßig viele Daten geschrieben werden:
ls -hlS /var/log/*log | head
Die Dateien sollten maximal ein paar MB groß sein.
Dann legen wir eine Ramdisk für /var/log an. Dazu legen wir in der Datei /etc/fstab einen neuen Eintrag an:
# Log Dateien
tmpfs /var/log tmpfs defaults,noatime 0 0
Jetzt mal testweise alle Dateien aus /var/log löschen und das Laufwerk mounten.
sudo rm -Rf /var/log/*
sudo mount /var/log
Jetzt werden alle Logdateien in die RAM-Disk geschrieben. Man sollte allerdings beachten dass die Fehleranalyse so bei einem Problem oder Sicherheitsrisiko schwieriger ist.
Läuft auf dem Rechner ein Apache hat man das Problem dass der Apache nicht startet wenn er auf die Logfiles unter /var/log/apache nicht zugreifen kann. Da die Ramdisk aber beim Start leer ist haben wir so ein Problem. Wir brauchen also ein Init-Script, das diese Dateien anlegt, bevor der Apache startet.
sudo nano /etc/init.d/apache2-tmpfs
In die Datei kommt folgender Inhalt:
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: apache2-tmpfs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create /var/log/apache2/error.log on tmpfs at startup
# Description: Create /var/log/apache2/error.log needed by Apache.
### END INIT INFO
#
# main()
#
case "${1:-''}" in
'start')
# create the /var/log/apache2/error.log needed by apache
mkdir /var/log/apache2
chmod 777 /var/log/apache2
touch /var/log/apache2/error.log
chmod 777 /var/log/apache2/error.log
;;
'stop')
;;
'restart')
;;
'reload'|'force-reload')
;;
'status')
;;
*)
echo "Usage: $SELF start"
exit 1
;;
esac
Das Script noch ausführbar machen
sudo chmod 0755 /etc/init.d/apache2-tmpfs
und das Init-Script dem runlevel hinzufügen. Da der apache am Stellen 91 kommt fügen wir das Script an Stelle 90 ein. In der Beenden Reihenfolge kommt Apache an Stelle 9, also kommt unser Script an Stelle 10.
sudo update-rc.d apache2-tmpfs defaults 90 10
Zum Schluss den Rechner neu starten.
Thanks to Petr Svoboda for this Script (Link).
Man kann das temporäre Verzeichnis ebenfalls in eine Ramdisk legen. Dazu in der Datei /etc/fstab folgenden Eintrag machen:
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
Weitere Verzeichnisse wären:
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0
tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0
tmpfs /var/spool/mqueue tmpfs defaults,noatime,nosuid,mode=0700,gid=12,size=30m 0 0