Odrzucanie w tle na partycjach wymiany na Linux + SSD

11

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:

  1. 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
    
  2. 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()
    
  3. 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.

Santisaez
źródło
4
Jaki jest sens? Pamięć RAM jest tania, ponieważ odpowiednio udowadniasz, mając 32 duże na swoim serwerze. Wyłącz Zamień, użyj dysku SSD do czegoś użytecznego i przestań bitfrickować.
Tom O'Connor,
3
Nie można wyłączyć wymiany na tych serwerach i mają one unikalny dysk SSD, nie ma opcji hostowania partycji wymiany na tradycyjnym dysku twardym. Wiem, że umieszczenie wymiany na dysku SSD nie jest najlepszą opcją, ale zastanawiałem się, czy mogę osiągnąć takie samo zachowanie „odrzuć” ext4 na partycjach wymiany, aby maksymalnie poprawić wydajność dysku.
santisaez
2
NAPRAWDĘ to brzmi jak przypadek przedwczesnej optymalizacji.
MikeyB,
„Komentarze mogą być edytowane tylko przez 5 minut” - służy mi to, że jestem na SF podczas pracy… tak jak mówiłem; @MikeyB Tak naprawdę czytałem o tym. Artykuł w Wikipedii wspomniał o czymś, o czym nie wiedziałem. „Ze względu na charakter działania pamięci flash danych nie można bezpośrednio nadpisywać, tak jak na dysku twardym”. Byłoby więc sensowne, aby poprzednio używane bloki w swapie były puste ... ale czy wyglądałyby one jak „0000”, kiedy Santisaez sprawdza zawartość wymiany?
Signal15
To wszystko dzieje się na warstwie poniżej systemu operacyjnego. Jeśli chodzi o system operacyjny, dane w bloku są tam, dopóki nie zostaną przepisane. Za obsługę cyklu odczytu-skasowania / zapisu odpowiada napęd.
MikeyB

Odpowiedzi:

1

Wygląda na to, że discard_swap_cluster jest wywoływany tylko z scan_swap_map, który z kolei jest wywoływany z get_swap_page lub get_swap_page_of_type . Więc jeśli mam rację, odrzucanie nastąpi tylko wtedy, gdy zostanie przydzielona nowa strona wymiany, a nie kiedy strona zostanie zwolniona.

lav
źródło
To brzmi jak błąd.
kasperd
2
To może nie być błąd. W ten sposób linux może odrzucić wiele stron naraz, zamiast robić to jeden po drugim.
lav
1

Możliwe, że twój system ma --discard=oncedomyślnie. Czy próbowałeś montażu z określoną opcją odrzucania?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

i zmuszanie w ten sposób:

# swapon --discard=pages /dev/sda2

Możesz także spróbować utworzyć fstrimusługę lub ją skonfigurować, jeśli jest już dostępna.

kgizdov
źródło
-1

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.

Zawartość zamiany jest skutecznie „odrzucana”, gdy swapon -szwraca „nie użyto zamiany”. System nie zastąpi zawartości bloków (wypełnionych w / „4141”), ponieważ jest to dysk SSD, a nadmierne zapisy skróciłyby żywotność SSD. (Tak przynajmniej zabieram z dokumentacji)

Sygnał 15
źródło
5
Jeśli discardużywana jest opcja montowania, polecenia TRIM należy wysyłać na podstawowy dysk SSD, aby uniknąć problemów ze wzmocnieniem zapisu na dyskach SSD. Przynajmniej w ten sposób inne systemy plików, takie jak ext4.
santisaez
Żeby było jasne, rzeczywiście spowodowałoby to odczytanie zer tylko za pomocą tego polecenia hdparm, ale dopiero po tym, jak zbieracz śmieci SSD miał szansę uruchomić ..
Halfgaar