Оптимизация для работы с SSD-дисками
Содержание
Кратко о Главном
Выравнивание разделов
Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с 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