Solid state drive (Русский)
Твердотельные накопители (SSD) не достаточно просто подключить чтобы они заработали должным образом. Необходимо учитывать некоторые специфичные вещи для достижения оптимальной производительности, такие как выравнивание разделов, выбор файловой системы, поддержка TRIM и т.д. Статья пытается охватить общую информацию и ключевые понятия, чтобы позволить пользователям получить максимальную отдачу от твердотельных дисков под Linux. Рекомендуется прочесть статью полностью перед тем, как следовать рекомендациям.
Обзор
Преимущества перед HDD
- Высокая скорость чтения. В 2-3 раза быстрее современных HDD (7200 об/мин на интерфейсе SATA2).
- Устойчивая скорость чтения. Скорость чтения не уменьшается на протяжении всего объёма диска, тогда как производительность HDD падает при перемещении головок от края пластин к центру.
- Минимальное время доступа. Приблизительно в 100 раз быстрее HDD. Например, 0,1 мс для SSD против 12-20 мс для HDD.
- Высокая степень надежности.
- Отсутствие движущихся частей.
- Минимальный нагрев.
- Минимальное потребление энергии. 1-2 Вт для SSD против 10-30 Вт для HDD (в зависимости от об/мин).
- Легкие. Идеальное решение для ноутбуков.
Недостатки
- Цена за единицу объёма (сотни рублей за ГБ на SSD, тогда как стоимость ГБ на HDD измеряется копейками).
- Ёмкость представленных моделей SSD намного ниже оной для HDD.
- Большие ячейки памяти требуют различных оптимизаций файловых систем. Низкий уровень доступа скрыт за контроллером, в то время как современные ОС могли бы использовать низкий уровень для собственных оптимизаций.
- Разделы и файловые системы требуют специальных оптимизаций. Размер страницы и размер стираемой страницы автоматически не определяется.
- Ячейки изнашиваются. MLC-ячейки, произведённые по 50нм техпроцессу, могут выдерживать до 10 тысяч циклов записи; 35нм обычно выдерживают всего 5000 циклов, а 25нм — 3000 (чем меньше техпроцесс, тем больше плотность и ниже цена). Если участки записи распределены соответствующим образом, не слишком малы и верно выровнены, это увеличивает срок жизни ячеек пропорционально общему объёму. Ежедневные объёмы записи должны быть сбалансированными в течение всего срока службы. Однако, тесты [1][2][3] проведённые на современных SSD показали, что износ накопителя является незначительным, а срок службы SSD сравним с оным для HDD, даже при больших объёмах записи.
- Сложные прошивки и контроллеры. В них часто встречаются баги. Современные потребляют мощность, сравнимую с HDD. Они реализуют подобие журнально-структурированной файловой системы со сборкой мусора, переводят команды SATA, изначально предназначенные для HDD; некоторые реализуют сжатие на лету. Также контроллер распределяет циклы записи по всей области диска для предотвращения быстрого износа ячеек, объединяет несколько команд записи мелких данных в одну, опять же, для увеличения продолжительности жизни диска. Наконец, они перемещают ячейки с данными по диску, чтобы те со временем не потеряли содержимое.
- Может падать производительность в зависимости от заполненности диска. Не все производители реализовывают сборку мусора достаточно хорошо, поэтому фрагментированное свободное пространство не всегда объединяется в целые ячейки.
На что обращать внимание перед покупкой
Есть несколько ключевых особенностей, на которые стоит обратить внимание до покупки SSD.
- Родная поддержка TRIM. Это жизненно необходимая функция для продления срока службы SSD и предотвращения уменьшения производительности операций записи от времени.
- Ключевым моментом является покупка SSD верного объема. Для эффективной работы разделы во всех файловых системах должны быть заполнены не более, чем на 75%.
Советы по увеличению производительности SSD
Выравнивание разделов
Смотрите Partitioning#Partition alignment.
TRIM
Большинство SSD накопителей поддерживают команду ATA_TRIM, с помощью которой осуществляется одинаковая производительность и распределение износа. За подробностями, описывающими производительность до и после использования TRIM обратитесь к этому учебнику.
Начиная с ядра linux версии 3.7, следующие файловые системы поддерживают TRIM: Ext4, Btrfs, JFS, VFAT, XFS.
VFAT поддерживает TRIM только с помощью флага монтирования 'discard', а не с помощью fstrim.
Раздел #Выбор файловой системы в этой статье содержит более подробную информацию.
Проверьте, поддерживается ли TRIM
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block)
Чтобы понять, в чём отличие между "limit 1 block" и "limit 8 blocks", обратитесь к статье wikipedia:TRIM#ATA
Включите TRIM с помощью флагов монтирования
Используйте следующий флаг монтирования в вашем /etc/fstab
, чтобы получить преимущества команды TRIM, описанные выше:
/dev/sda1 / ext4 defaults,noatime,discard 0 1 /dev/sda2 /home ext4 defaults,noatime,discard 0 2
- TRIM не включается по умолчанию при использовании шифрования блочных устройств на SSD; для дополнительной информации смотрите Dm-crypt/TRIM support for SSD.
- Нет необходимости использовать флаг
discard
, если вы периодически запускаетеfstrim
. - Использование флага
discard
для корневого раздела с файловой системой ext3 приведёт к тому, что он будет смонтирован в режиме только-чтение.
discard
. Иначе вы можете потерять данные!Применение TRIM по раписанию cron
Безусловно рекомендуется включать TRIM на поддерживаемых SSD накопителях. Однако, иногда на некоторых SSD это может приводить к замедлению работы при удалении файлов. Если это ваш случай, вы можете использовать fstrim как альтернативу.
# fstrim -v /
Раздел, который вы хотите "подтримить" должен быть примонтирован и должен быть указан точкой монтирования.
Если вам больше подходит данный способ, хорошей идеей будет запуск этой команды время от времени с помощью планировщика cron. Чтобы запускать эту команду ежедневно, установите cron пакет (cronie), реализация которого по умолчанию установлена на запуск ежечасных, ежедневных, еженедельных и ежемесячных заданий. Обратите внимание, что cronie systemd сервис не включен по умолчанию в новых установках Arch. Чтобы добавить эту команду в список ежедневных заданий cron, просто создайте скрипт script, содержащий эту команду и положите его в /etc/cron.daily
, /etc/cron.weekly
, и т.д. Если выбран этот способ, то рекомендуется подобрать соответствующие значения nice и ionice. После того как проделаете всё это, уберите опцию discard
из /etc/fstab
.
discard
. Данный же способ нужно выбирать только если первый вам не подошёл для нормальной реализации TRIM.Применение TRIM по systemd таймеру
Пакет util-linux предоставляет systemd юнит файлы fstrim.service
и fstrim.timer
. Если включить таймер, то сервис будет активироваться еженедельно, подравнивая все примонтированные файловые системы на устройствах, поддерживающих операцию discard.
Включение TRIM с помощью tune2fs (Discouraged)
Вы можете статически установить флаг trim с помощью tune2fs:
# tune2fs -o discard /dev/sdXY
Включение TRIM для LVM
Измените значение опции issue_discards
с 0 на 1 в файле /etc/lvm/lvm.conf
.
/etc/lvm/lvm.conf
). As such it does not seem to be required for "regular" TRIM requests (file deletions inside a filesystem) to be functional.Включение TRIM для dm-crypt
For non-root filesystems, configure /etc/crypttab
to include discard
in the list of options for encrypted block devices located on a SSD (see Dm-crypt/System configuration#crypttab).
For the root filesystem, follow the instructions from Dm-crypt/TRIM support for SSD to add the right kernel parameter to the bootloader configuration.
Планировщик ввода/вывода
Рассмотрим переход со стандартного CFQ планировщика (Completely Fair Queuing) к планировщикам NOOP или Deadline. Последние два обеспечивают повышение производительности SSD. Планировщик NOOP, например, реализует простую очередь входящих запросов чтения/записи без их переупорядочивания или группировки тех, что физически расположены ближе на накопителе. На SSD, в отличие от HDD, время доступа одинаково для всех секторов, поэтому изменение порядка запросов не имеет смысла.
Arch по умолчанию использует планировщик CFQ. Убедиться в этом можно, выведя содержимое файла /sys/block/sdX/queue/scheduler
:
$ cat /sys/block/sdX/queue/scheduler noop deadline [cfq]
Планировщик, используемый в данный момент, в списке доступных планировщиков выделен квадратными скобками.
Вы можете поменять планировщик прямо на лету, без необходимости перезагрузки:
# echo noop > /sys/block/sdX/queue/scheduler
или:
$ sudo tee /sys/block/sdX/queue/scheduler <<< noop
Это непостоянный способ (то есть ваше изменение отменится после перезагрузки). Чтобы убедиться в том, что изменения вступили в силу, снова посмотрите содержимое файла и убедитесь, что теперь "noop" в квадратных скобках.
Параметр ядра (для единственного накопителя)
Если в системе единственным устройством накопления является SSD, то рекомендуется настроить планировщик ввода/вывода для всей системы с помощью параметра ядра elevator=noop
.
Использование udev как для одного накопителя, так и для нескольких разных
Хотя вышеописанные методы будут работать без проблем, ниже представлено также довольно надёжное решение. Следует отметить, что с переходом на systemd, файл rc.local больше не существует. Следовательно, было бы предпочтительнее использовать систему, которая отвечает за устройства, в первую очередь для реализации планировщика. В нашем случае это udev, и чтобы осуществить задуманное, всё что нам нужно — простое udev-правило.
Создайте файл в директории /etc/udev/rules.d с именем, например, '60-schedulers.rules'. Запишите в него следующие строки:
# установка планировщика deadline для SSD ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline" # установка планировщика cfq для HDD ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="cfq"
Конечно же вы можете заменить deadline/cfq любыми другими планировщиками. Изменения вступают в силу после перезагрузки. Чтобы проверить сработало ли правило, выполните команду
$ cat /sys/block/sdX/queue/scheduler #где X — буква физического накопителя
Разделы подкачки на SSD
Можно размещать раздел подкачки на SSD. Но с другой стороны, современные компьютеры, имеющие более 2 ГБ оперативной памяти, используют раздел подкачки очень редко. Заметным исключением являются системы, которые используют спящий режим. Следующая оптимизация для SSD уменьшает "swappiness" системы, чтобы избежать записей подкачки:
# echo 1 > /proc/sys/vm/swappiness
Или можно просто изменить файл /etc/sysctl.d/40-swappiness.conf
как рекомендуется в вики-статье Maximizing Performance[ссылка недействительна: раздел не найден]:
vm.swappiness=1 vm.vfs_cache_pressure=50
Hdparm shows "frozen" state
Some motherboard BIOS' issue a "security freeze" command to attached storage devices on initialization. Likewise some SSD (and HDD) BIOS' are set to "security freeze" in the factory already. Both result in the device's password security settings to be set to frozen, as shown in below output:
:~# hdparm -I /dev/sda
Security: Master password revision code = 65534 supported not enabled not locked frozen not expired: security count supported: enhanced erase 4min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
Operations like formatting the device or installing operating systems are not affected by the "security freeze".
The above output shows the device is not locked by a HDD-password on boot and the frozen state safeguards the device against malwares which may try to lock it by setting a password to it at runtime.
If you intend to set a password to a "frozen" device yourself, a motherboard BIOS with support for it is required. A lot of notebooks have support, because it is required for hardware encryption, but support may not be trivial for a desktop/server board. For the Intel DH67CL/BL motherboard, for example, the motherboard has to be set to "maintenance mode" by a physical jumper to access the settings (see [4][устаревшая ссылка 2020-08-04], [5]).
hdparm
unless you know exactly what you are doing.If you intend to erase the SSD, see Securely wipe disk#hdparm and below[ссылка недействительна: раздел не найден].
Очистка ячеек памяти SSD
В некоторых случаях, пользователь может полностью сбросить ячейки SSD в состояние, подобное моменту покупки нового накопителя, таким образом добиться заводской производительности. Скорость записи уменьшается со временем даже с поддержкой TRIM. TRIM работает только с удалением файлов, но не с перемещением и инкрементальными сохранениями.
Сброс ячеек легко выполнить за 3 шага, описанных в вики-статье SSD memory cell clearing.
Resolving NCQ Errors
Some SSDs and SATA chipsets do not work properly with Linux Native Command Queueing (NCQ). The tell-tale dmesg errors look like this:
[ 9.115544] ata9: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x10 frozen [ 9.115550] ata9.00: failed command: READ FPDMA QUEUED [ 9.115556] ata9.00: cmd 60/04:00:d4:82:85/00:00:1f:00:00/40 tag 0 ncq 2048 in [ 9.115557] res 40/00:18:d3:82:85/00:00:1f:00:00/40 Emask 0x4 (timeout)
These may be resolved by one of the following methods:
- Update the firmware on the SSD. See SSD#Firmware updates[ссылка недействительна: раздел не найден].
- Update the BIOS/UEFI on the motherboard. See Flashing BIOS from Linux.
- Disable NCQ on boot. Add
libata.force=noncq
to the kernel command line in the Bootloader configuration.
If these do not resolve the problem or cause other issues, file a bug report.
Советы для уменьшения операций чтения/записи
Основной идеей долговечного использования SSD является перенос интенсивных операция ввода/вывода в оперативную память или HDD, в основном из-за большого размера блока очистки (512 КиБ в некоторых случаях).
Используйте команду iotop -oPa
и отсортируйте по количеству записей, чтобы увидеть сколько пишется на диск.
Продуманная схема разделов
Если в системе установлены одновременно оба типа дисков (HDD и SSD), то рекомендуется монтировать раздел /var
на HDD, чтобы продлить жизнь SSD, избежав на нём множества операций чтения/записи.
Если же SSD является единственным диском в системе, и нет возможности использовать его совместно с HDD, разумно так же выделить отдельный раздел для /var
, чтобы в дальнейшем при возникновении ошибки было легче восстановить систему. Например, если программа использовала всё доступное пространство в /
, какой-либо лог превысил все разумные размеры, и т. п.
Опция монтирования noatime
Монтируйте разделы SSD с опцией noatime
. См. раздел Параметры монтирования.
Существует несколько ключевых параметров монтирования, используемых в /etc/fstab
для разделов на SSD.
- noatime - Во время чтения файлов не будет обновляться поле atime файловой системы, указывающее время последнего доступа к файлу. Важность данного параметра в том, что он убирает необходимость системы производить "ненужные" операции записи когда файл всего-навсего необходимо прочитать. Т. к. эти операции записи могут быть достаточно интенсивными при чтении большого количества файлов, отключение может дать неплохой прирост производительности и срока жизни. Заметьте, что информация о времени последней записи файла будет по-прежнему обновляться каждый раз, когда файл будет изменён.
- Однако, эта опция может вызвать проблемы с некоторыми программами, такими как Mutt, т. к. время доступа к файлу станет меньше, чем время изменения, что вызовет проблемы в работе. Использование опции relatime вместо noatime позволит быть уверенным, что поле atime никогда не станет меньше, чем время изменения.
- discard - Параметр discard включает команду TRIM для ядер версии 2.6.33 и выше. Не работает с файловой системой ext3; если всё же он включен на ext3, корневой раздел будет смонтирован только для чтения.
/dev/sda1 / ext4 defaults,relatime,discard 0 1 /dev/sda2 /home ext4 defaults,relatime,discard 0 1
discard
, что он работает на ядре версии 2.6.33 или выше, а также, что его SDD поддерживает TRIM. Иначе можно потерять данные!
Расположите часто используемые файлы в оперативной памяти
Профили браузеров
Довольно просто можно перенести профили браузеров, таких как chromium, firefox, opera, и т.д. в оперативную память через tmpfs и использовать rsync для синхронизации с копиями на диске. Таким образом можно так же заметно сократить количество операций чтения/записи.
В AUR есть несколько пакетов для автоматизации этой операции, например profile-sync-daemon.
Другие файлы
По этой же вышеописанной причине можно расположить в оперативной памяти раздел /srv/http
(если запущен web-сервер). Аналогом profile-sync-daemon здесь будет anything-sync-daemon, который позволяет определить любую директорию для синхронизации с оперативной памятью.
Компиляция в tmpfs
Перенос интенсивной компиляции в /tmp
— отличная идея продления срока жизни диска. Если у вас имеется более 4ГБ оперативной памяти, строку tmp из /etc/fstab
нужно изменить, чтобы раздел использовал больше половины доступной памяти, через параметр size=
, т. к. /tmp
при компиляции растёт очень быстро.
Пример для машины с 8ГБ оперативки:
tmpfs /tmp tmpfs nodev,nosuid,size=7G 0 0
Отключение журналирования ФС
Использование журналируемых ФС типа ext3 или ext4 с отключенным журналом тоже сократит количество записей на SSD. Очевидным недостатком этого будет являться потеря данных при неудачном размонтировании (резкое отключение питания, блокировка ядра и т. д.). Однако, Ted Tso выступает в защиту журналирования на современных SSD, т. к. по его тестам оно незначительно влияет на количество записей в большинстве случаев:
Количество записанных данных (в мегабайтах) на ФС ext4 с параметром noatime.
операция | с журналом | без журнала | разница |
---|---|---|---|
git clone | 367.0 | 353.0 | 3.81 % |
make | 207.6 | 199.4 | 3.95 % |
make clean | 6.45 | 3.73 | 42.17 % |
"Результаты показали, что записанный объём при работе с большим количеством мета-данных почти в 2 раза выше, чем реальный размер файлов. Это ожидаемо, т. к. все изменения в блоках мета-данных сначала пишутся в журнал, и транзакция журнала сбрасывается перед тем, как мета-данные будут записаны в конечное положение на диск. Однако же, для обычных задач, где данные пишутся сразу за мета-данными, разница в лишних операциях записи минимальна."
Выбор файловой системы
Существуют различные варианты файловых систем на выбор, включая Ext2/3/4, Btrfs, и т. д.
Btrfs
Поддержка Btrfs включена в ядро с версии 2.6.29. Некоторые считают, что она является не достаточно стабильной для повседневного использования, в то время как есть и явные сторонники этого потенциального преемника ext4. Рекомендуется прочитать статью Btrfs для дополнительного ознакомления.
Ext4
Ext4 — ещё одна файловая система, поддерживающая SSD. Считается стабильной и пригодной для повседневного использования с версии ядра 2.6.28. В отличие от Btrfs, ext4 не умеет автоматически определять тип диска; пользователь сам должен явно включить поддержку команды TRIM, используя параметр монтирования discard
в fstab (или командой tune2fs -o discard /dev/sdaX
).
См. официальную документацию ядра[устаревшая ссылка 2020-08-04] для подробного ознакомления c ext4.
XFS
Many users do not realize that in addition to ext4 and btrfs, XFS has TRIM support as well. This can be enabled in the usual ways. That is, the choice may be made of either using the discard option mentioned above, or by using the fstrim command. More information can be found on the XFS wiki.
JFS
As of Linux kernel version 3.7, proper TRIM support has been added. So far, there is not a great wealth of information of the topic but it has certainly been picked up by Linux news sites. It is apparent that it can be enabled via the discard
mount option, or by using the method of batch TRIMs with fstrim.
Другие файловые системы
Существуют также другие файловые системы, специально предназначенные для SSD, например F2FS.
Обновление прошивок
OCZ
Для дисков компании OCZ имеется утилита командной строки для Linux (i686 и x86_64) на официальном форуме или в AUR ocztoolboxAUR