Определение простыми словами
В отличие от жёсткого диска, SSD не может перезаписать ячейку напрямую — её сначала нужно стереть. Когда вы удаляете файл, ОС просто помечает кластеры свободными, но накопитель об этом не знает: для контроллера ячейки выглядят занятыми, и при новой записи он вынужден сначала прочитать блок, стереть его и записать заново. Это явление называется write amplification и убивает скорость записи и ресурс SSD.
Команда TRIM решает проблему: при удалении файла ОС шлёт SSD список логических адресов, которые больше не нужны. Контроллер помечает эти страницы как свободные и стирает их в фоне (garbage collection). Когда придёт реальная запись, блок уже подготовлен — задержка минимальна, износ ниже. Аналогом TRIM в стандарте NVMe служит команда DEALLOCATE (Dataset Management).
Сравнение (таблица)
| Параметр | С включённым TRIM | Без TRIM |
|---|---|---|
| Скорость записи через год | Близка к новой | Падает на 30–60 % |
| Write amplification | 1.1–1.5× | 3–10× |
| Износ ячеек | Минимальный | Ускоренный |
| Задержка при записи | Стабильная | Растут «горбы» |
| Поддержка в RAID | RAID 0/1 в современных контроллерах | В аппаратных RAID-контроллерах часто отключён |
Кейсы использования
- Любой Linux-сервер с SSD: либо периодический
fstrimпо таймеру, либо опцияdiscardв/etc/fstab. - Виртуальные машины с дисками qcow2 или raw на SSD-хосте — гость должен пробрасывать TRIM до железа.
- SSD-кеш в кэширующих слоях вроде bcache или LVM cache — без TRIM кеш быстро деградирует.
- Шифрованные тома LUKS поверх SSD — с параметром
discardвcryptsetup open. - Негативный сценарий: включать
discardв /etc/fstab при использовании LVM снимков или Btrfs с снапшотами на старых ядрах. На ядрах до 4.0 это могло привести к потере данных в снимках. На современных ядрах безопасно, но из соображений совместимости и нагрузки лучше использоватьfstrim.timer— недельный пакетный TRIM.
Технические детали
# Проверка поддержки TRIM в SSD
sudo hdparm -I /dev/sda | grep -i trim
# Однократный TRIM всех смонтированных ФС
sudo fstrim -av
# Включение еженедельного TRIM через systemd
sudo systemctl enable --now fstrim.timer
sudo systemctl status fstrim.timer
# Опция discard в /etc/fstab (real-time TRIM)
UUID=xxx / ext4 defaults,discard,noatime 0 1
# TRIM для LUKS-тома
sudo cryptsetup --allow-discards refresh data
# Для NVMe — команда deallocate
sudo nvme dsm /dev/nvme0n1 --ad -s 0 -b 1000
На большинстве дистрибутивов Linux fstrim.timer включён по умолчанию и запускается раз в неделю. Этого достаточно для домашних и рабочих машин. Для нагруженных СУБД с интенсивной записью имеет смысл запускать fstrim чаще — например, ежедневно ночью.
🔥 Где это применяется
Частые вопросы
Нужен ли TRIM для NVMe?
Да, но команда называется иначе — DEALLOCATE из набора Dataset Management. На уровне ОС утилита fstrim работает с NVMe прозрачно, никаких отдельных настроек не требуется.
Что лучше — discard в fstab или fstrim по таймеру?
fstrim по таймеру — компромисс между нагрузкой и эффективностью: одна большая операция раз в неделю вместо тысяч мелких при каждом удалении. Для нагруженных серверов это уменьшает джиттер задержек.
Работает ли TRIM в аппаратных RAID-массивах?
Зависит от контроллера. Современные LSI MegaRAID, Adaptec и серверные платформы Dell/HPE поддерживают TRIM в RAID 0 и 1; в RAID 5/6 поддержка ограничена. Уточняйте по модели контроллера.