Problem
Chcę włączyć operacje TRIM w tle na partycji wymiany na dysku SSD w systemie Linux. Zgodnie z kilkoma artykułami, np. Tym , jądro wykrywa tę konfigurację i automatycznie wykonuje operacje odrzucania, ale w moich testach wydaje się, że nie działa, chociaż opcja montowania „odrzucaj” jest używana do wymuszenia tego zachowania.
Scenariusz
- Debian Wheezy z systemem Linux 3.2.0
- Dysk SSD: 1 x 120 GB OCZ Vertex 3 MI
- 2 GB partycji „zwykłej” wymiany, bez innych warstw (LVM, RAID itp.)
tło
Oto kroki, które wykonuję, aby sprawdzić, czy TRIM działający w tle działa na partycji wymiany:
Obsługa TRIM : sprawdź, czy dysk SSD obsługuje polecenia TRIM, a jądro oznacza urządzenie jako nieobrotowe:
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM # cat /sys/block/sda/queue/rotational 0
Uzupełnianie wymiany : zamontuj partycję, wyczyść wszystkie pamięci podręczne maszyn wirtualnych i skonfiguruj system Linux, aby zamieniał agresywnie ustawienie vm.swappiness na 100. Następnie uruchom skrypt, który przydziela całą dostępną pamięć i zmusza jądro do rozpoczęcia wymiany:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
Skrypt działa na serwerze z 32 GB pamięci fizycznej + 2 GB partycji wymiany i tworzy w pamięci obiekt o wielkości ~ 33,8 GB, co wystarczy, aby wypełnić całą pamięć i rozpocząć zamianę. To jest przykład skryptu, który osiąga takie zachowanie:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
Sprawdź zawartość wymiany : „swapon -s” pokazuje, że użyto 100% pamięci wymiany. Za pomocą „hdparm --read-sector” sprawdzam surową zawartość sektorów partycji wymiany i wszystkie bajty są ustawione na „4141”, odpowiadający zapis szesnastkowy dla znaku „A”, wszystko działa zgodnie z oczekiwaniami. To jest przykładowy skrypt służący do odczytu sektor po sektorze zawartości partycji wymiany:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
UWAGA: można uzyskać sektor początkowy / końcowy partycji wymiany za pomocą parted, cfdisk itp.
Kiedy zatrzymuję skrypt, zwalnia całą pamięć, w tym przydziały swap, „swapon -s” nie zwraca użycia wymiany w systemie. W tym momencie oczekuje się, że Linux zacznie odrzucać zawartość partycji wymiany w tle, ale to nie działa , zawartość sektorów jest nadal „4141”, nawet kilka godzin później.
Przeprowadziłem kilka testów i wydaje się, że Linux wykonuje pełne odrzucanie tylko wtedy, gdy partycja jest włączona przy użyciu swapon()
wywołania systemowego, ale nigdy w tle, chociaż opcje montowania „odrzucaj” są włączone w / etc / fstab.
Dalsze badania: blkdev_issue_discard () to funkcja jądra odpowiedzialna za wysyłanie poleceń TRIM do podstawowych urządzeń SSD, istnieją dwa unikalne odniesienia do tej funkcji na mm/swapfile.c
:
discard_swap()
jest wywoływany podczas procesu swapon (), jeśli włączona jest opcja „odrzuć”, to odrzuca całą zawartość, działa to zgodnie z oczekiwaniami.discard_swap_cluster()
powinien odrzucić zawartość zamiany klastra, ale wydaje się, że nigdy nie wykonuje polecenia TRIM.
Pytanie: jakie jest oczekiwane zachowanie Linuksa na urządzeniach swap + SSD? Powinien odrzucić wszystkie wolne sektory / strony lub wydać początkowe pełne odrzucenie tylko wtedy, gdy partycja jest włączona podczas procesu uruchamiania? Dzięki.