Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Donnerstag
01
Mai 2014

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.

Over-Provisioning

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.

Logfiles

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.

Logfiles Apache

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).

Temporäres Verzeichnis

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