Если ваш SSD изначально показывал высокую производительность, но со временем стал заметно медленнее считывать и записывать данные или периодически скорость чтения и записи SSD резко падает, то данная статья может вам помочь.
Для SSD дисков необходимо выполнять операцию Trim и по умолчанию она включена не на всех дистрибутивах Linux
Принципы работы и хранения информации твердотельных дисков (SSD) очень сильно отличаются от жёстких дисков (HDD).
Если говорить очень упрощённо, то при удалении файла на самом деле не стираются байты, вместо этого в журнале файловой системы делается отметка, что определённые области диска, которые ранее занимались этим файлом, теперь являются свободными и могут быть перезаписаны при необходимости. Сказанное справедливо и для SSD и для HDD. Для каждого из дисковых носителей это имеет разные последствия.
Для HDD это означает, что нередко можно восстановить файл, который считается удалённым. Для традиционных жёстких дисков операция записи в те части диска, где находится файл отмеченный как удалённый, никак не отличается от записи в незанятый сектор.
SSD хранят данные в ячейках флеш-памяти, сгруппированных (в MLC) в «страницы» (обычно по 4 Кбайт каждая), которые, в свою очередь, сгруппированы в блоки (обычно 128 страниц или 512 Кбайт суммарно). Ячейки NAND-флеш-памяти могут быть непосредственно записаны лишь в том случае, когда они чисты. В случае, когда они хранят данные, содержимое ячеек должно быть очищено, прежде чем в них будут записаны новые данные. В SSD операция записи может быть проделана только для страниц, однако из-за аппаратных ограничений команда удаления всегда выполняется на весь блок. В результате, запись на SSD-носитель выполняется очень быстро до тех пор, пока существуют чистые страницы, но значительно замедляется, если необходимо очищать предварительно записанные страницы. Так как очистка ячеек в странице необходима перед тем, как в них можно будет записывать снова, но только целый блок может быть очищен, процесс перезаписи инициирует цикл чтение-очистка-модификация-запись: содержимое целого блока должно быть сохранено в кеше перед тем, как оно может быть удалено с накопителя, перезаписываемые данные модифицируются в кеше и только после этого целый блок (с обновлённой страницей) записывается на накопитель. Это явление известно как усиление записи (Write amplification (WA)).
В общем, нужно заранее сообщать диску SSD о том, какие ячейки больше не используются, чтобы диск очистил их и подготовил для последующей записи. Если диск не будет к этому готов, то перед тем, как что-то записать, диск будет очищать не используемые ячейки и это приведёт к задержке записи.
Именно для этого и используется Trim — эта команда сообщает диску, какие ячейки являются на самом деле не используемыми, чтобы диск мог заранее их очистить и подготовиться для следующей записи на него.
Trim (англ. to trim — подрезать) — команда интерфейса ATA, позволяющая операционной системе уведомить твердотельный накопитель о том, какие блоки данных (страницы) не несут полезной нагрузки и их можно не хранить физически.
Смотрите также:
- https://en.wikipedia.org/wiki/Trim_(computing)
- https://ru.wikipedia.org/wiki/Trim_(команда_для_накопителей)
Как включить TRIM в Linux
По умолчанию TRIM уже активирован в большинстве дистрибутивов Linux.
Но, во-первых, в некоторых дистрибутивах вам нужно включить эту службу самостоятельно (например, в Arch Linux который устанавливается и настраивается пользователем с нуля).
Во-вторых, возможно, вы захотите изменить настройки периодичности выполнения команды TRIM. По умолчанию, операция TRIM выполняется автоматически раз в неделю. Если у вас SSD почти полностью занят (имеет мало свободного места) и вы активно записываете и удаляете файлы на него, то может оказаться, что для данного диска желательно выполнять команду TRIM более часто.
Как включить автоматический TRIM в Linux
Для начала проверьте статус fstrim.timer, для этого выполните следующую команду:
systemctl status fstrim.timer
Если вы видите что статус
Active: active (waiting)
Это означает, что служба fstrim уже добавлена в автоматический запуск.
Полный вывод:
● fstrim.timer - Discard unused filesystem blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; preset: disabled) Active: active (waiting) since Fri 2024-08-09 10:39:52 +07; 1h 41min ago Invocation: c27c5ed11be644d79d071cba5033719b Trigger: Mon 2024-08-12 00:56:05 +07; 2 days left Triggers: ● fstrim.service Docs: man:fstrim Aug 09 10:39:52 HackWare systemd[1]: Started Discard unused filesystem blocks once a week.
В этом выводе вы можете увидеть, что тригер, активирующий TRIM, сработает 2024-08-12 и до его срабатывания осталось 2 дня.
Если же вы видите статус fstrim.timer как неактивный:
Active: inactive (dead)
То вы можете включить автоматическое выполнение TRIM в Linux с помощью следующих команд:
sudo systemctl enable fstrim.timer sudo systemctl start fstrim.timer
Если вы хотите отредактировать периодичность выполнения TRIM в Linux, то используйте следующую команду:
sudo systemctl edit fstrim.timer
Как вручную выполнить TRIM
Вы можете в любое время вручную запустить операцию TRIM для определённого диска или для всех смонтированных файловых систем (поддерживаются только смонтированные файловые системы).
sudo fstrim -v MOUNTPOINT
Здесь вместо MOUNTPOINT нужно указать точку монтирования, например чтобы выполнить TRIM для диска, который является корневым разделом файловой системы:
sudo fstrim -v /
Пример вывода:
/: 628 GiB (674344615936 bytes) trimmed
То есть благодаря операции TRIM было подготовлено для последующей быстрой записи 628 GiB (а это 70% всего диска — не удивительно, что скорость записи упала).
А следующая команда выполнит TRIM для диска, смонтированного в /mnt/disk_d/:
sudo fstrim -v /mnt/disk_d/
Пример вывода:
/mnt/disk_d/: 425.1 GiB (456420438016 bytes) trimmed
Время, которое требуется для TRIM, зависит от количества обрабатываемых данных. Операция может растянуться на несколько минут, если нужно выполнить TRIM для сотен гигабайт. Повторный запуск TRIM завершиться намного быстрее, если не появилось новых данных для обработки.
Вместо указания точки монтирования, вы можете выбрать одну из следующих опций.
Опция -a (—all) означает выполнить TRIM для всех смонтированных файловых систем.
Пример:
sudo fstrim -v -a
Опция -A (—fstab) означает выполнить TRIM для всех смонтированных файловых систем, которые упомянуты в /etc/fstab.
Пример:
sudo fstrim -v -A
Диски, которые не поддерживают TRIM, автоматически пропускаются.
TRIM активирован, но SSD по-прежнему работает очень медленно
Если операция TRIM не решила вашу проблему, то попробуйте следующие варианты:
1. Обновите прошивку диска.
2. Проверьте здоровье диска (с помощью утилит производителя или утилит Linux).
3. Убедитесь, что диск не перегревается.
Связанные статьи:
- Как проверить, включён ли TRIM в Linux (88.3%)
- Как узнать количество включений и время работы диска в Linux (59.5%)
- Как узнать, когда была создана файловая система ext4/ext3/ext2 и когда она была последний раз смонтирована (59.5%)
- Диск Windows монтируется только для чтения (РЕШЕНО) (50.3%)
- Как исправить «Windows is hibernated, refused to mount» (РЕШЕНО) (50.3%)
- Как проверить использование файла подкачки в Linux (RANDOM - 9.1%)