LINUX.ORG.RU

Не включается TRIM на Samsung EVO

 ,


1

4

Имеется компьютер с диском Samsung EVO 850 1TB.

Весь диск целиком размечен под Ext4 и монтируется в /home

Ядро 4.4-lt и 4.9-ml из elrepo.

hdparm говорит, что диск поддерживает TRIM:

$ hdparm -I /dev/sdb | grep -i trim
       *    Data Set Management TRIM supported (limit 8 blocks)
Однако fstrim завершается с ошибкой:
$ strace fstrim -v /home
...
ioctl(3, FITRIM, 0x7ffe4c0d2160)        = -1 EOPNOTSUPP (Operation not supported)
mount ... -o discard тоже не работает, в dmesg выводится:
EXT4-fs (sdb): mounting with "discard" option, but the device does not support discard
В /sys/block/sdb:

  • /sys/block/sdb/device/driver = sd
  • /sys/block/sdb/device/scsi_disk/7:0:0:0/provisioning_mode = full
  • В /sys/block/sdb/queue: файлы discard_granularity, discard_max_bytes, discard_max_hw_bytes, discard_zeroes_data содержат «0»

Насколько можно понять, происходит сброс флага QUEUE_FLAG_DISCARD в http://lxr.free-electrons.com/source/drivers/scsi/sd.c#L635

Но как понять, из-за чего именно он происходит?

а что за sata контроллер ?

vel ★★★★★
()
Ответ на: комментарий от NiTr0

Добрый день.

Столкнулся с такой же проблемой.

# fstrim -v /
fstrim: /: the discard operation is not supported

При проведении операции например на /boot - та жа песня.

Настройки следующие:

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md1 : active raid5 sda2[0] sdc2[2] sdb2[1]
      933533696 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      bitmap: 1/4 pages [4KB], 65536KB chunk

md0 : active raid5 sdc1[5] sda1[3] sdb1[4]
      3901440 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/raid_md1-root_dir /               ext4    discard,errors=remount-ro 0       1
# /boot was on /dev/md0 during installation
UUID=a399b505-ab26-4a6b-863c-ca2032007be3 /boot           ext4    discard 0       2
/dev/mapper/mountdisk-mountdisk /mountdisk      ext4    defaults        0       2
/dev/mapper/raid_md1-tmp /tmp            ext4    discard 0       2
/dev/mapper/raid_md1-var /var            ext4    discard 0       2
/dev/mapper/raid_md1-archive /var/cache/apt/archives ext4    discard 0       2
/dev/mapper/raid_md1-log /var/log        ext4    discard 0       2
/dev/mapper/raid_md1-swap none            swap    sw              0       0
#  hdparm -I /dev/sda | grep "TRIM"
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
#  hdparm -I /dev/sdb | grep "TRIM"
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
#  hdparm -I /dev/sdc | grep "TRIM"
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
# lsblk -D
NAME                    DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                            0        4K       2G         0
├─sda1                         0        4K       2G         0
│ └─md0                        0        1M     256M         0
└─sda2                         0        4K       2G         0
  └─md1                        0        1M     256M         0
    ├─raid_md1-swap            0        1M     256M         0
    ├─raid_md1-tmp             0        1M     256M         0
    ├─raid_md1-var             0        1M     256M         0
    ├─raid_md1-archive         0        1M     256M         0
    ├─raid_md1-log             0        1M     256M         0
    └─raid_md1-root_dir        0        1M     256M         0
sdb                            0        4K       2G         0
├─sdb1                         0        4K       2G         0
│ └─md0                        0        1M     256M         0
└─sdb2                         0        4K       2G         0
  └─md1                        0        1M     256M         0
    ├─raid_md1-swap            0        1M     256M         0
    ├─raid_md1-tmp             0        1M     256M         0
    ├─raid_md1-var             0        1M     256M         0
    ├─raid_md1-archive         0        1M     256M         0
    ├─raid_md1-log             0        1M     256M         0
    └─raid_md1-root_dir        0        1M     256M         0
sdc                            0        4K       2G         0
├─sdc1                         0        4K       2G         0
│ └─md0                        0        1M     256M         0
└─sdc2                         0        4K       2G         0
  └─md1                        0        1M     256M         0
    ├─raid_md1-swap            0        1M     256M         0
    ├─raid_md1-tmp             0        1M     256M         0
    ├─raid_md1-var             0        1M     256M         0
    ├─raid_md1-archive         0        1M     256M         0
    ├─raid_md1-log             0        1M     256M         0
    └─raid_md1-root_dir        0        1M     256M         0
sdd                            0        0B       0B         0
└─sdd1                         0        0B       0B         0
  └─mountdisk-mountdisk        0        0B       0B         0
sde                            0        0B       0B         0
└─sde1                         0        0B       0B         0

Как заставить TRIM работать?

Krishnoved
()
Ответ на: комментарий от Krishnoved
lsblk -D
    ├─raid_md1-swap            0        1M     256M    0

гм. Минимальный размер trim 1M ?

Оно может использоваться только при mkfs.

vel ★★★★★
()
Ответ на: комментарий от Krishnoved

Чтоб наверняка, создай маленькую ext4 на простом разделе, смонтируй (discard не требуется) и попробуй fstrim. Если заработает, то ищи проблему в конфигурации LVM или MD, в противном случае проверь, не забанено ли устройство в ядре (как у автора темы).

anonymous
()
Ответ на: комментарий от Krishnoved

trim на рейде с размером chunk 512k ?

Месье знает толк в извращениях!

У ext4 в твоем случае размер кластера 4k, а трим может минимум 1024k! Как его использовать ? 1 раз при mke2fs!

vel ★★★★★
()
Ответ на: комментарий от vel

А как эти значения менять?

Я делал рэйд при установке системы. Т.е. они выставились по умолчанию.

И какие значения лучше будет поставить? Спасибо.

Krishnoved
()
Ответ на: комментарий от Krishnoved

В данном случае делать что-либо уже бесполезно.

ext4 на x86 имеет максимальный размер блока 4Кб, делать raid5 c chunk 2Kb - еще более странное решение.

IMHO raid5 для обычных задач хорошо бы иметь с chunk 16-32Кб, тогда ФС с 32-64кб блоком могла бы без проблем использовать трим. XFS точно умеет размер блока 64к, но вот как быть с хранением мелких файлов?

А нужен ли raid5 из ssd ?

vel ★★★★★
()
Ответ на: комментарий от vel

Для отказоустойчивости нужен. Все таки это не зеркалирование как в RAID1 и износ идет по разному. Так что, решение продиктовано именно отказоустойчивостью.

Krishnoved
()
Ответ на: комментарий от vel

В общем. Выведя накопитель из массива команда fstrim отрабатывает.

Собрав массив заново и введя значение

mdadm --grow /dev/md0 --chunk=16

mkfs.ext4 -b 4096 -E stride=16,stripe-width=32 /dev/md0

результата мне не дало.

По прежнему массив пишет, что discard не поддерживается.

Где я допускаю ошибку?

Krishnoved
()
Ответ на: комментарий от fornlr

Глупая поняшка, ты вообще понимаешь, чем «Blacklist queued TRIM» отличается от просто «blacklist TRIM»?

О том, что предполагаемая тобой блокировка TRIM на уровне ядра запретила бы и fstrim, поскольку работают они ровно теми же механизмами, я даже и не говорю — здесь надо уметь мыслить, а лошади так не умеют.

intelfx ★★★★★
()
Ответ на: комментарий от Krishnoved

Либо в выборе ФС, либо в выборе размера chunk

По прежнему массив пишет, что discard не поддерживается.

Это тебе говорит «lsblk -D» или «fstrim» ?

vel ★★★★★
()
Ответ на: комментарий от intelfx

ты вообще понимаешь, чем «Blacklist queued TRIM» отличается от просто «blacklist TRIM»?

Понимаю. Писал, не читая.

fornlr ★★★★★
()
Ответ на: комментарий от vel

Вот что пишет

NAME              DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                      0      4K        2G         1
└─sda1                   0      4K        2G         1
  └─md0                  0       1M       2G         0
    └─md0p1              0       1M       2G         0
sdb                      0      4K        2G         1
└─sdb1                   0      4K        2G         1
  └─md0                  0       1M       2G         0
    └─md0p1              0       1M       2G         0
sdc                      0      4K        2G         1
└─sdc1                   0      4K        2G         1
  └─md0                  0        1M       2G         0
    └─md0p1              0        1M       2G         0
Krishnoved
()
Ответ на: комментарий от Krishnoved

ну так у тебя минимальный размер trim на рейде 1024К а файловая система оперирует блоками по 4К. Естественно, что fstrim говорит «не поддерживается»!

Представь, что тебе выдали линейку с метровой разметкой и просят отмерить сантиметры. Что ты скажешь этим людям ?

vel ★★★★★
()
Ответ на: комментарий от Krishnoved

ext4 умеет до 64К, но не на x86 :)

"-E stride=16,stripe-width=32" в данном случае не имеет смысла т.к. на raid5 у тебя chunk=512k

Если ты сделаешь raid5 c chunk=32k и поверх создашь xfs с размером блока 64к, то тогда возможно удасться использовать trim.

vel ★★★★★
()
Ответ на: комментарий от vel

xfs ругается, когда я пытаюсь указать при создании блок меньше 512.

Говорит illegal block size32

Krishnoved
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.