Оптимизация для работы с SSD-дисками

Материал из wiki.nntc.nnov.ru
Версия от 22:15, 17 мая 2012; Bond (обсуждение | вклад) (Подкачка на твердотельном диске)
Перейти к навигации Перейти к поиску

Кратко о Главном

Выравнивание разделов

Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с SSD диском ещё и увеличивается износ диска. То есть когда разделы не выравнены, то кластер файловой системы занимает несколько секторов и тем самым увеличивается количество операций чтения/записи. При создании раздела его стартовый сектор должен делиться на 8 без остатка!

fdisk -l
Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *        2048    20000767     9999360   83  Linux
/dev/sda2        20000768   117229567    48614400   83  Linux

Начальные сектора 2048 и 20000768 кратны 8!


P.S. При установки Ubuntu 12.04 и создании разделов стандартными графическими средствами, выравнивание разделов выполнять не пришлось, программа всё сделала сама!


Параметры подключения

в /etc/fstab нужно добавить параметры монтирования диска:

sudo nano /etc/fstab
UUID=04871f6d-9620-4a01-875b-76462d31873d   /    ext4    discard,relatime,nodiratime,errors=remount-ro 0       1

discard — включает работу TRIM (что такое читай ниже)
relatime — разрешает записывать только время изменения
nodiratime — отменяет запись времени доступа к директориям

P.S. вместо relatime есть другой параметр noatime - зарпещает вести запись времени доступа, но его не рекомендуется использовать т.к. может быть нарушена стабильная работа некоторых программ


если логи и временные файлы не нужны, то их можно вынести во временную память, добавив строки:

none /var/log tmpfs size=10M 0 0
none /tmp tmpfs size=100M 0 0
none /var/tmp tmpfs size=20M 0 0

Это позволит избежать лишних операций записи на диск

Планировщик ввода-вывода

В компьютере только SSD

По умолчанию в Ubuntu Linux в качестве файлового планировщика используется CFQ, он старается минимизировать перемещения головок, но у SSD нет движущихся частей и CFQ не нужен.

Если в вашем компьютере установлен только твёрдотельный диск, то достаточно, в файле /etc/default/grub добавить параметр elevator=noop:

sudo nano /etc/default/grub

ищем строку:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

добавляем параметр elevator=noop

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop". 

После выполнить:

sudo update-grub

В компьютере SSD и HDD

В случае если в компьютере одновременно используются твердотельный и шпиндельный винчестер, то очень важно, что бы планировщик noop использовать именно для твердотельного диска!

Для начала нам понадобится узнать id ssd-диска

ls -l /dev/disk/by-id/

Ищем требуемый нам ssd-диск. В моём случае это ata-OCZ-VERTEX3_OCZ-8P32XX0G6Q8B56OT

Далее создаём файл скрипта

sudo nano /bin/ssdnoop.sh

записываем в него следующее:

#!/bin/bash

SSD=(ata-OCZ-VERTEX3_OCZ-8P32XX0G6Q8B56OT)

declare -i i=0
while [ "${SSD[$i]}" != "" ]; do
  NODE=`ls -l /dev/disk/by-id/${SSD[$i]} | awk '{ print $NF }' | sed -e 's/[/\.]//g'`
  echo noop > /sys/block/$NODE/queue/scheduler
  i=i+1
done

где SSD=(указываем id вашего устройства)

делаем файл исполняемым

chmod a+x /bin/ssdnoop.sh

Теперь добавляем наш скрипт в автозагрузку

sudo nano /etc/rc.local

Должно выглядить так:

# By default this script does nothing.

/bin/ssdnoop.sh

exit 0

Сохраняем, перезагружаемся.

Проверяем отработал ли скрипт

cat /sys/block/sdX/queue/scheduler

где X это буква устройства SSD.

[noop] deadline cfq

Если видим noop в квадратных скобках, значит всё хорошо!

Отложенная запись

Обычно рекомендуют для нетбуков с ssd дисками, насколько актуально для рабочей станции, не знаю, но на всякий случай что бы было.

В случае отложенной записи ядро будет копить данные, ожидающие записи на диск, и записывать их либо при острой необходимости, либо по истечении таймаута. В данном случае таймаут 60 секунд

Для этого открываем /etc/sysctl.conf и добавляем параметры

sudo nano /etc/sysctl.conf
vm.laptop_mode = 5 
vm.dirty_writeback_centisecs = 6000

Включение поддержки TRIM

Что такое TRIM Если в кратце, то штука нужная и обязательная!

Для включения поддержки TRIM в /etc/fstab нужно добавить параметр discard:

sudo nano /etc/fstab

по умолчанию страка выглядит так:

   UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 errors=remount-ro 0 1 

меняем на:

   UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 discard,relatime,nodiratime,errors=remount-ro 0 1


! TRIM не работает с «виртуальными» дисками, хранящимися в виде образов, что не ограничивает использование команды в виртуальной среде.
! TRIM не всегда поддерживается в RAID-массивах

Проверка работы TRIM

Проверить работу TRIM можно с помощью следующей последовательности команд исполняемых в консоли: 1. создаем временный файл заполненный случайными данными:

cd /

sudo dd if=/dev/urandom of=tmpfile count=10 bs=512k oflag=direct

2. находим номер сектора диска содержащего данные этого файла (нам нужно любое число из колонки begin_LBA):

sudo hdparm --fibmap tmpfile

3. проверяем содержимое этого сектора:

sudo hdparm --read-sector 17179648 /dev/sda

(вместо 17179648 подставьте номер сектора показанный командой из п.2 и вместо /dev/sda устройство которым обозначен SSD диск) будет показан набор случайных данных похожий на:

   …
   adb1 0d7a e027 042e 84ad 3231 2f6c 85f1
   58ee feb6 cac0 d403 5df0 46db 2cfe 531c
   3cbd 5a21 e0b6 9b57 799a 7ac8 dd15 3883 

4. удаляем файл:

sudo rm tmpfile
sudo sync

5. проверяем содержимое файла еще раз:

sudo hdparm --read-sector 17179648 /dev/sda

при включенной поддержке TRIM вывод будет содержать нули:

   …
   0000 0000 0000 0000 0000 0000 0000 0000
   0000 0000 0000 0000 0000 0000 0000 0000
   0000 0000 0000 0000 0000 0000 0000 0000 

если вывод содержит не нули, а данные из п. 3, то поддержка TRIM не осуществляется и нужно: Включить поддержку TRIM


Подкачка на твердотельном диске

Большинству современных компьютеров с объёмом оперативной памяти больше 2 гигабайт подкачка обычно не требуется, но компьютерам которые используют спящий режим, swap необходим!

На SSD всё же можно использовать swap.

Для этого рекомендуется использования уменшив значение "swapiness"

swappiness управляет интенсивностью перемещения данных из ОЗУ в swap-память. Этот параметр может принимать значения от 0 до 100. Если параметр установлен в 0, то ядро будет пытаться не использовать swap-память насколько это возможно, если swappiness=100, то наоборот ядро будет с максимально возможной интенсивностью использовать swap-память.

в /etc/sysctl.conf добавляем следующие строки:

vm.swappiness=1
vm.vfs_cache_pressure=50

swappiness т.е. при загурзке памяти 99% начнется сбрасывание в swap

vfs_cache_pressure - уровень выделяемой памяти под кэш.

про swappiness и fs_cache_pressure: http://analitick.livejournal.com/2593.html


ещё больше про SSD и "тюнинг" https://wiki.archlinux.org/index.php/Solid_State_Drives#Tips_for_Maximizing_SSD_Performance