Відкидання фону на swap-розділах на Linux + SSD


11

Проблема

Я хочу ввімкнути фонові операції TRIM на розділі swap у SSD диску в Linux. Згідно з кількома статтями, наприклад, з цієї , ядро ​​виявляє цю конфігурацію і автоматично виконує операції з відкидання, але на моїх тестах здається, що вона не працює, хоча опція монтажу «відкинути» використовується для примушення такої поведінки.

Сценарій

  • Debian Wheezy під управлінням Linux 3.2.0
  • SSD диск: 1 х 120 Гб OCZ Vertex 3 MI
  • 2 Гб своп “звичайний” розділ, без інших шарів (LVM, RAID тощо)

Фон

Це кроки, які я виконую, щоб перевірити, чи фоновий TRIM працює над розділом swap:

  1. Підтримка TRIM : перевірте, чи підтримує диск SSD команди TRIM, і ядро ​​позначає пристрій як неротаційний:

    # 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. Замініть замінник : змонтуйте розділ, очистіть усі кеші VM та налаштуйте Linux для агресивної заміни, встановивши vm.swappiness на 100. Потім запустіть скрипт, який виділяє всю наявну пам'ять і змушує ядро ​​розпочати заміну:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    

    Сценарій працює на сервері з 32 ГБ фізичної пам’яті + 2 Гб своп-розділом і створює об’єкт ~ 33,8 ГБ в пам’яті, цього достатньо, щоб заповнити всю пам'ять і почати міняти. Це приклад сценарію, який досягає такої поведінки:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  3. Перевірте вміст свопу : "swapon -s" показує, що використовується 100% пам'яті своп. Використовуючи “hdparm --read-сектор”, я перевіряю вміст сировини секторів розділів swap і всі байти встановлюються на “4141”, відповідні шістнадцяткові позначення для символу “A”, і все працює як очікувалося. Це приклад сценарію для читання сектора за сектором вмісту swap-розділу:

    #!/bin/bash
    
    for sector in `seq 194560 4100095` ; do
        hdparm --read-sector $sector /dev/sda
    done
    

ПРИМІТКА. Ви можете отримати початковий / кінцевий сектор swap-розділу, використовуючи parted, cfdisk тощо.

Коли я зупиняю скрипт, він звільняє всю пам'ять, включаючи розподіли swap, "swapon -s" не повертає ніякого використання своп у системі. На цьому етапі очікується, що Linux почне відкидати вміст розділу swap у фоновому режимі, але це не працює , вміст секторів все ще "4141", навіть через кілька годин.

Я зробив кілька тестів і, здається, що Linux виконує повну відмову лише тоді, коли розділ увімкнено за допомогою swapon()системного виклику, але ніколи у фоновому режимі, хоча параметри монтажу «відкинути» увімкнено в / etc / fstab.

Подальше дослідження: blkdev_issue_discard () - функція ядра, відповідальна за надсилання команд TRIM на базові SSD-пристрої, на цю функцію є дві унікальні посилання mm/swapfile.c:

  • discard_swap() він викликається під час swapo (), якщо включена опція монтажу «відкинути», вона відкидає весь вміст, це працює як очікувалося.
  • discard_swap_cluster() він повинен відкинути вміст кластерного свопу, але здається, що він ніколи не виконує команду TRIM.

Питання: яка очікувана поведінка Linux на пристроях swap + SSD? Він повинен відкидати всі вільні сектори / сторінки або видавати початкове повне скасування, коли розділ включений під час процесу завантаження? Спасибі.


4
В чому справа? Оперативна пам’ять - це дешево, про що ви достатньо доказуєте, маючи на своєму сервері 32 великих. Вимкніть Swap, використовуйте свій SSD для чогось корисного та припиніть бітфрикади.
Том О'Коннор

3
Swap не можна відключити на цих серверах, і на них є унікальний SSD-диск, немає можливості розмістити розділ swap на традиційному жорсткому диску. Я знаю, що розміщення swap на SSD-диску - це не найкращий варіант, але мені було цікаво, чи зможу я досягти такої ж «відкидання» поведінки ext4 на swap-розділах, щоб максимально покращити продуктивність диска.
santisaez

2
Це дійсно звучить як випадок передчасної оптимізації.
MikeyB

"Коментарі можна редагувати лише протягом 5 хвилин" - слугує мені правильним перебуванням у СФ під час роботи .... як я вже говорив; @MikeyB Насправді я читав про це. Стаття у Вікіпедії згадувала те, про що я не знав. "Через характер роботи флеш-пам'яті дані не можуть бути перезаписані безпосередньо, як це можливо, на жорсткому диску". Тож було б сенс, що раніше використовувані блоки в свопі були порожніми .... але чи виглядатимуть вони як "0000", коли santisaez перевіряє вміст свопу?
Сигнал15

Це все відбувається на шарі нижче операційної системи. Що стосується ОС, то дані про блок є, поки вони не будуть переписані. Це обов'язок диска керувати циклом читання-запису.
MikeyB

Відповіді:


1

Здається, що discard_swap_cluster викликається лише з scan_swap_map, який у свою чергу викликається від get_swap_page або get_swap_page_of_type . Тож якщо я маю рацію, відмова відбувається лише тоді, коли буде призначена нова сторінка свопу, а не тоді, коли сторінка буде звільнена.


Це звучить як помилка.
kasperd

2
Це може бути не помилка. Таким чином linux може відкинути багато сторінок одночасно, а не робити це по черзі.
lav

1

Можливо, ваша система --discard=onceза замовчуванням. Ви спробували встановити певний варіант відкидання?

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

і примушує так:

# swapon --discard=pages /dev/sda2

Ви також можете спробувати зробити fstrimпослугу або налаштувати її, якщо вона вже доступна.


-1

Коли я зупиняю скрипт, він звільняє всю пам'ять, включаючи розподіли swap, "swapon -s" не повертає ніякого використання своп у системі. На цьому етапі очікується, що Linux почне відкидати вміст розділу swap у фоновому режимі, але це не працює , вміст секторів все ще "4141", навіть через кілька годин.

Вміст swap ефективно "відкидається", коли swapon -sповертається "жоден своп не використовується". Система не збирається перезаписувати вміст блоків (заповнене w / "4141"), оскільки це SSD, а надмірне записування скоротить термін служби SSD. (Принаймні, це я забираю у документації)


5
Якщо discardвикористовується опція кріплення, команди TRIM слід надіслати на базовий твердотільний диск, щоб уникнути проблеми посилення запису на SSD-дисках. Принаймні, це спосіб, яким користуються інші файлові системи, наприклад ext4.
santisaez

Щоб було зрозуміло, це дійсно призведе до зчитування лише нулів за допомогою цієї команди hdparm, але лише після того, як у сміттєзбірника SSD з'явився шанс запустити ..
Halfgaar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.