Оптимизация для работы с SSD-дисками: различия между версиями
Bond (обсуждение | вклад) (Новая: ===Включение поддержки TRIM=== Для включения поддержки TRIM в /etc/fstab нужно добавить параметр discard: sudo nano /etc/fs...) |
Bond (обсуждение | вклад) (→Включение поддержки TRIM) |
||
(не показаны 32 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | ===Включение поддержки TRIM== | + | ==Кратко о Главном== |
+ | |||
+ | ===Выравнивание разделов=== | ||
+ | |||
+ | Суть проблемы в том, что если начало разделов в секторах не кратно размеру кластера файловой системы, то резко падает производительность при чтении/записи с диска, а в случае с 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 (что такое читай ниже) <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: | ||
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 | ||
Строка 10: | Строка 140: | ||
меняем на: | меняем на: | ||
− | UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 discard, | + | UUID=b49c6a96-ee65-4c12-9aca-66f5ea927aab / ext4 discard,relatime,nodiratime,errors=remount-ro 0 1 |
− | + | '''!''' TRIM не работает с «виртуальными» дисками, хранящимися в виде образов, что не ограничивает использование команды в виртуальной среде. <br /> | |
+ | '''!''' TRIM не всегда поддерживается в RAID-массивах''' | ||
+ | |||
+ | ==Проверка работы TRIM== | ||
Проверить работу TRIM можно с помощью следующей последовательности команд исполняемых в консоли: | Проверить работу TRIM можно с помощью следующей последовательности команд исполняемых в консоли: | ||
1. создаем временный файл заполненный случайными данными: | 1. создаем временный файл заполненный случайными данными: | ||
Строка 57: | Строка 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