Проблема
Я хочу включить задний план Операции TRIM над разделом подкачки на SSD-диске в Linux. Согласно нескольким статьям, например вот этот, ядро обнаруживает эту конфигурацию и автоматически выполняет операции сброса, но по моим тестам кажется, что она не работает, хотя для принудительного такого поведения используется параметр монтирования «сбросить».
Сценарий
Задний план
Вот шаги, которые я выполняю, чтобы проверить, работает ли фоновая TRIM на разделе подкачки:
Поддержка 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
Пополнение свопа: смонтировать раздел, очистить все кеши виртуальных машин и настроить 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-sector», я проверяю необработанное содержимое секторов раздела подкачки, и все байты устанавливаются на «4141», соответствующее шестнадцатеричное представление символа «A», все работает, как ожидалось. Это пример сценария для посекторного чтения содержимого раздела подкачки:
#!/bin/bash
for sector in `seq 194560 4100095` ; do
hdparm --read-sector $sector /dev/sda
done
ПРИМЕЧАНИЕ: вы можете получить начальный / конечный сектор раздела подкачки, используя parted, cfdisk и т. Д.
Когда я останавливаю сценарий, он освобождает всю память, включая выделение подкачки, «swapon -s» не возвращает использование подкачки в системе. С этой точки зрения, ожидается, что Linux начнет отбрасывать содержимое раздела подкачки в фоновом режиме, но это не работает, содержание секторов по-прежнему равно «4141» даже спустя несколько часов.
Я провел несколько тестов и кажется, что Linux выполняет полную отмену только тогда, когда раздел включен с помощью swapon()
системный вызов, но никогда в фоновом режиме, хотя в / etc / fstab включены параметры монтирования «discard».
Дальнейшие исследования: blkdev_issue_discard () - это функция ядра, отвечающая за отправку команд TRIM на базовые устройства SSD, на эту функцию есть две уникальные ссылки на mm/swapfile.c
:
discard_swap()
он вызывается во время процесса swapon (), если включена опция «discard» монтирования, он отбрасывает все содержимое, это работает, как ожидалось.discard_swap_cluster()
он должен отбросить содержимое подкачки кластера, но кажется, что он никогда не выполняет команду TRIM.Вопрос: каково ожидаемое поведение Linux на устройствах swap + SSD? Он должен отбрасывать все свободные секторы / страницы или производить только начальную полную отмену, когда раздел включен во время процесса загрузки? Спасибо.
Возможно, в вашей системе --discard=once
по умолчанию. Вы пробовали монтировать с определенной опцией сброса?
# nano /etc/fstab
________________________________________________________________
...
/dev/sda2 none swap ..., --discard=pages,... ...
...
и принуждение вот так:
# swapon --discard=pages /dev/sda2
Вы также можете попробовать сделать fstrim
service или настройте его, если он уже доступен.
Кажется, что discard_swap_cluster вызывается только из scan_swap_map который, в свою очередь, вызывается из get_swap_page или get_swap_page_of_type. Так что, если я прав, отмена происходит только тогда, когда будет выделена новая страница подкачки, а не когда страница будет освобождена.
Когда я останавливаю сценарий, он освобождает всю память, включая выделение подкачки, «swapon -s» не возвращает использование подкачки в системе. С этой точки зрения, ожидается, что Linux начнет отбрасывать содержимое раздела подкачки в фоновом режиме, но это не работает, содержание секторов по-прежнему равно «4141» даже спустя несколько часов.
Содержимое подкачки эффективно «отбрасывается», когда swapon -s
возвращает «своп не используется». Система не собирается перезаписывать содержимое блоков (заполненных «4141»), потому что это SSD, и чрезмерная запись сократит срок службы SSD. (По крайней мере, это то, что я вынес из документации)