Проблема
Я хочу ввімкнути фонові операції TRIM на розділі swap у SSD диску в Linux. Згідно з кількома статтями, наприклад, з цієї , ядро виявляє цю конфігурацію і автоматично виконує операції з відкидання, але на моїх тестах здається, що вона не працює, хоча опція монтажу «відкинути» використовується для примушення такої поведінки.
Сценарій
- Debian Wheezy під управлінням Linux 3.2.0
- SSD диск: 1 х 120 Гб OCZ Vertex 3 MI
- 2 Гб своп “звичайний” розділ, без інших шарів (LVM, RAID тощо)
Фон
Це кроки, які я виконую, щоб перевірити, чи фоновий TRIM працює над розділом swap:
Підтримка 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
Замініть замінник : змонтуйте розділ, очистіть усі кеші 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()
Перевірте вміст свопу : "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? Він повинен відкидати всі вільні сектори / сторінки або видавати початкове повне скасування, коли розділ включений під час процесу завантаження? Спасибі.