Назад | Перейти на главную страницу

Отмена фона на разделах подкачки на Linux + SSD

Проблема

Я хочу включить задний план Операции TRIM над разделом подкачки на SSD-диске в Linux. Согласно нескольким статьям, например вот этот, ядро ​​обнаруживает эту конфигурацию и автоматически выполняет операции сброса, но по моим тестам кажется, что она не работает, хотя для принудительного такого поведения используется параметр монтирования «сбросить».

Сценарий

Задний план

Вот шаги, которые я выполняю, чтобы проверить, работает ли фоновая TRIM на разделе подкачки:

  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. Пополнение свопа: смонтировать раздел, очистить все кеши виртуальных машин и настроить 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-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:

Вопрос: каково ожидаемое поведение 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. (По крайней мере, это то, что я вынес из документации)