Відкидання фону на 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.