SWAP Bereich vergrössern
Manchmal stosst man mit dem physischen RAM Space an Grenzen. Gerade wenn man z.B. riesige MySQL Queries verarbeiten möchte und eine RAM Disk dafür verwendet. Manchmal muss man schnell handeln können. Und wenn man nicht eine zusätzliche SWAP Partition erstellen möchte, kann man auch mit SWAP Files arbeiten. Hier erstellt man einfach ein File mit einer fixen/reservierten Grösse, die dann als SWAP File verwendet werden kann.
SWAP File erstellen
Ich erstelle hier 2 SWAP Files auf zwei verschiedenen Partitionen. Einmal 2GB und einmal 1GB gross:
mkdir /var/swap mkdir /usr/swap dd if=/dev/zero of=/var/swap/swapfile.dat bs=1m count=2048 dd if=/dev/zero of=/usr/swap/swapfile.dat bs=1m count=1024 chmod 0600 /var/swap/swapfile.dat chmod 0600 /usr/swap/swapfile.dat
Swap Aktivieren
Version für FreeBSD 10.x und neuer
Nun die Swap Files im fstab hinzufügen
vi /etc/fstab
md98 none swap sw,file=/var/swap/swapfile.dat,late 0 0
md99 none swap sw,file=/usr/swap/swapfile.dat,late 0 0
Einfach eine hohe md Device Nummer wählen (z.B. 98&99), damit die tieferen Nummern für den interaktiven Gebrauch verfügbar sind.
Der Swapspace wird nun beim Neustart verfügbar sein. Um den Swap Space sofort hinzuzufügen, verwende den Befehl swapon:
swapon -aL
Version für FreeBSD 9.x und älter
Nun die SWAP Files im rc.conf eintragen, damit diese beim nächsten Startup wieder Verfügbar sind.
vi /etc/rc.conf
folgendes eintragen:
swapfile="/var/swap/swapfile.dat" swapfile="/usr/swap/swapfile.dat"
Nun SWAP aktivieren:
/etc/rc.d/addswap start
Alternativ kann man es auch wie folgt aktiveren. Mit (-u) übergibt man die unit number. Diese wiederum ist dann auch das 0 bzw. 1 nach md.
mdconfig -a -t vnode -f /var/swap/swapfile.dat -u 0 && swapon /dev/md0 mdconfig -a -t vnode -f /usr/swap/swapfile.dat -u 1 && swapon /dev/md1
Swap Info
mit swapinfo kann man den aktuellen Status checken:
swapinfo -h
Device 1K-blocks Used Avail Capacity /dev/vtbd0p5 2096128 1.9M 2G 0% /dev/md2 2097152 1.5M 2G 0% /dev/md0 1048576 1.4M 1G 0% Total 5241856 4.7M 5G 0%
Swap File entfernen / deaktivieren
Um ein Swap File zu deaktivieren, erst mal die Infos über die SWAP File Location holen:
mdconfig -lv md0 vnode 1024M /usr/swap/swapfile.dat md2 vnode 2048M /var/swap/swapfile.dat
Jetzt möchte ich z.B. /dev/md0 deaktiveren – hier wieder nachher bei mdconfig: wenn md0, dann -u 0, falls md2, dann -u 2 etc:
swapctl -d /dev/md0 mdconfig -d -u 0
Dann natürlich noch das
- Swapfile aus rc.conf entfernen
- sowie das entsprechende File manuell löschen (rm -rf /usr/swap/swapfile.dat).
Weitere Informationen
Fehlermeldungen / Problemlösungen
/etc/rc: WARNING: $swapfile is obsolete. Ignored.
Wenn diese Fehlermeldung erscheint, nachdem man
/etc/rc.d/addswap start
ausgeführt hat, benutzt du wahrscheinlich eine FreeBSD Version 10.x oder höher. In dem Fall musst du das Swap File über fstab hinzufügen wie hier beschrieben.
mysqld got signal 11
Im Zusammenhang mit MySQL und zusätzlichen SWAP Bereichen sind plötzlich ganz viele seltsame Dinge passiert: Der Server war per SSHnicht mehr erreichbar, Mysql ist gestorben und später ist sogar der gesamte Server komplett abgestürzt. Er war nicht einmal mehr über die Konsole ansprechbar.
Das war der MySQL Fehler, nachdem ich eine riesige Table reparieren wollte:
140109 12:13:41 [ERROR] Got an error from thread_id=80565, /usr/ports/databases/mysql55-server/work/mysql-5.5.29/storage/myisam/ha_myisam.cc:912 140109 12:13:41 [ERROR] MySQL thread id 80565, OS thread handle 0x80240ac00, query id 8630549 localhost root Checking table CHECK TABLE `piwik_log_link_visit_action` 11:46:30 UTC - mysqld got signal 11 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. key_buffer_size=268435456 read_buffer_size=1048576 max_used_connections=43 max_threads=1024 thread_count=6 connection_count=6 It is possible that mysqld could use up to key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 3419256 K bytes of memory Hope that's ok; if not, decrease some variables in the equation.
Die Ursache des Problems war, dass ich aus Unachtsamkeit einen SWAP Bereich auf eine NFS Partition legte. Das hat das gesamte System komplett lahmgelegt. Als ich diesen SWAP Bereich entfernte und auf interne Server Platten legten, lief wieder alles stabil und ich konnte endlich die riesige SQL Query durchlaufen lassen.