Оптимизация для работы с SSD-дисками: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Включение поддержки TRIM)
 
(не показана 31 промежуточная версия этого же участника)
Строка 1: Строка 1:
===Выравнивание разделов на SSD===
+
==Кратко о Главном==
 +
 
 +
===Выравнивание разделов===
  
 
Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с SSD диском ещё и увеличивается износ диска. То есть когда разделы не выравнены, то кластер файловой системы занимает несколько секторов и тем самым увеличивается количество операций чтения/записи.  
 
Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с SSD диском ещё и увеличивается износ диска. То есть когда разделы не выравнены, то кластер файловой системы занимает несколько секторов и тем самым увеличивается количество операций чтения/записи.  
 
При создании раздела его стартовый сектор должен делиться на 8 без остатка!
 
При создании раздела его стартовый сектор должен делиться на 8 без остатка!
  
  Устр-во Загр Начало Конец Блоки Id Система
+
fdisk -l
  /dev/sdh1 2048 514047 256000 83 Linux
+
 
  /dev/sdh2 514048 55810047 27648000 83 Linux
+
  Устр-во Загр     Начало       Конец       Блоки   Id Система
 +
  /dev/sda1  *        2048   20000767    9999360  83 Linux
 +
  /dev/sda2        20000768  117229567    48614400  83 Linux
 +
Начальные сектора 2048 и 20000768 кратны 8!
  
Начальные сектора 2048 и 514048 кратны 8!
 
  
 
P.S. При установки Ubuntu 12.04 и создании разделов стандартными графическими средствами, выравнивание разделов выполнять не пришлось, программа всё сделала сама!
 
P.S. При установки Ubuntu 12.04 и создании разделов стандартными графическими средствами, выравнивание разделов выполнять не пришлось, программа всё сделала сама!
  
===Включение поддержки TRIM===
+
 
 +
===Параметры подключения===
 +
в /etc/fstab нужно добавить параметры монтирования диска:
 +
 +
sudo nano /etc/fstab
 +
 
 +
UUID=04871f6d-9620-4a01-875b-76462d31873d  /    ext4    discard,relatime,nodiratime,errors=remount-ro 0      1
 +
 
 +
discard — включает работу TRIM (что такое читай ниже) <br />
 +
relatime — разрешает записывать только время изменения <br />
 +
nodiratime — отменяет запись времени доступа к директориям <br />
 +
 
 +
P.S. вместо relatime есть другой параметр noatime - зарпещает вести запись времени доступа, но его не рекомендуется использовать т.к. может быть нарушена стабильная работа некоторых программ<br />
 +
 
 +
 
 +
если логи и временные файлы не нужны, то их можно вынести во временную память, добавив строки:
 +
 
 +
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==
 +
Что такое [http://ru.wikipedia.org/wiki/TRIM_%28%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0_SSD%29 TRIM]
 +
Если в кратце, то штука нужная и обязательная!
  
 
Для включения поддержки TRIM в /etc/fstab нужно добавить параметр discard:
 
Для включения поддержки TRIM в /etc/fstab нужно добавить параметр discard:
Строка 18: Строка 134:
 
  sudo nano /etc/fstab
 
  sudo nano /etc/fstab
  
по умолчанию страка выглядит так:
+
по умолчанию строка выглядит так:
  
 
     UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 errors=remount-ro 0 1  
 
     UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 errors=remount-ro 0 1  
Строка 24: Строка 140:
 
меняем на:
 
меняем на:
  
     UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 discard,noatime,nodiratime,errors=remount-ro 0 1
+
     UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 discard,relatime,nodiratime,errors=remount-ro 0 1
 +
 
  
  
 +
'''!''' TRIM не работает с «виртуальными» дисками, хранящимися в виде образов, что не ограничивает использование команды в виртуальной среде. <br />
 +
'''!''' TRIM не всегда поддерживается в RAID-массивах'''
  
===Проверка работы TRIM===
+
==Проверка работы TRIM==
 
Проверить работу TRIM можно с помощью следующей последовательности команд исполняемых в консоли:
 
Проверить работу TRIM можно с помощью следующей последовательности команд исполняемых в консоли:
 
1. создаем временный файл заполненный случайными данными:
 
1. создаем временный файл заполненный случайными данными:
Строка 71: Строка 190:
 
если вывод содержит не нули, а данные из п. 3, то поддержка TRIM не осуществляется и нужно:
 
если вывод содержит не нули, а данные из п. 3, то поддержка TRIM не осуществляется и нужно:
 
Включить поддержку TRIM
 
Включить поддержку TRIM
 +
 +
 +
==Подкачка на твердотельном диске==
 +
 +
Большинству современных компьютеров с объёмом оперативной памяти больше 2 гигабайт подкачка обычно не требуется, но компьютерам которые используют спящий режим, swap необходим!
 +
 +
На SSD всё же можно использовать swap.
 +
 +
Для этого рекомендуется использования уменьшив значение "swapiness" (значение по умолчанию: 60)
 +
 +
 +
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

Текущая версия на 11:37, 7 декабря 2012

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

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

Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с 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" (значение по умолчанию: 60)


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