Suporte ao comando ATA TRIM no Linux
Leitura introdutória: The SSD Anthology: Understanding SSDs and New Drives from OCZ (AnandTech)
Discard online é feito usando a opção de montagem
Discard manual (batched discard) é feito rodando uma ferramenta que usa o ioctl FITRIM disponível no kernel e implementado em alguns sistemas de arquivos (ver abaixo). Esta ferramenta verifica quais setores do SSD não são usados pelo sistema de arquivos (você especifica o ponto de montagem) e envia comandos TRIM para zerá-los. Desde a versão 2.19 da suíte util-linux, existe o fstrim, que serve especificamente para este propósito.
Então se você usa SSD no Linux, tem três opções:
- Usar a opção de montagem discard. Se o firmware do seu SSD não for maluco, é a melhor maneira, pois fica tudo automático, você esquece do assunto. Procure usar um kernel recente, de preferência o 3.0 ou superior.
- Não usar a opção de montagem discard e rodar manualmente o fstrim de vez em quando para manter o SSD com setores vazios. Enquanto o fstrim estiver rodando, o desempenho do SSD ficará degradado.
- Não usar a opção de montagem discard e nunca rodar o fstrim. Dependendo do firmware, o SSD se mantém saudável por conta própria.
Leitura recomendada:
Performance evaluation of Linux Discard Support (Overview, benchmark results, current status)
Lukas Czerner
Red Hat
February 12, 2011
[1] A partir da versão 9.14 do hdparm o programa é capaz de reportar se o SSD suporta ou não TRIM. Rode
Informações sobre os commits relevantes
No kernel 2.6.33 foi adicionado na libata o suporte ao comando ATA TRIM, que veio para tentar resolver os problemas de lentidão com partiçoes saturadas em SSDs.
libata: add translation for SCSI WRITE SAME (aka TRIM support)
Porém só isso não basta. O código de cada sistema de arquivo precisa ser modificado para usar o novo recurso.
Dos sistemas de arquivos mais conhecidos, os seguintes suportam a opção de montagem
- Btrfs (2.6.32)
Btrfs: add -o discard option
- EXT4 (2.6.33)
ext4: make trim/discard optional (and off by default)
- FAT (2.6.33)
fat: make discard a mount option
- Swap (2.6.36)
swap: discard while swapping only if SWAP_FLAG_DISCARD
Na verdade o kernel passou a suportar TRIM no código de swap desde a versão 2.6.29:
swapfile: swapon use discard (trim)
swapfile: swap allocation use discard
Porém só no 2.6.36 que passou a ser configurável.
- XFS (3.0)
xfs: add online discard support
- JFS (3.7)
fs/jfs: TRIM support for JFS Filesystem
E os seguintes suportam discard manual (batched discard):
- EXT4 (2.6.37)
ext4: Add batched discard support for ext4
ext4: add batched_discard into ext4 feature list
ext4: Add EXT4_IOC_TRIM ioctl to handle batched discard
- EXT3 (2.6.38)
ext3: Add batched discard support for ext3
- XFS (2.6.38)
xfs: add FITRIM support
- JFS (3.7)
fs/jfs: TRIM support for JFS Filesystem
No kernel 3.0, a infraestrutura usada pelo kernel para despachar as requisições de discard ficou mais rápida:
blkdev: Submit discard bio in batches in blkdev_issue_discard()
Relacionado:
Fedora 17 em um SSD
ATA TRIM com LUKS/LVM
Discard online é feito usando a opção de montagem
discard
, que usa o comando ATA TRIM, suportado pela geração atual de SSDs [1]. Com ela, o kernel informa ao SSD, no momento que algum bloco foi liberado ("apagado") pelo sistema de arquivos, que os setores associados ao mesmo estão livres. Daí para diante, o firmware do SSD sabe que aqueles setores não são mais usados pelo sistema de arquivos. A forma como cada firmware lida com essa informação varia. Alguns modelos sabem usá-la de forma eficiente, reciclando continuamente os setores liberados sem degradar o desempenho enquanto outras operações de leitura/escrita são executadas, mantendo assim o SSD sempre com setores vazios, o que evita o infame problema dos SSDs que "ficam lentos com o tempo". Outros, contudo, possuem implementação péssima e o uso da opção discard
acaba prejudicando o desempenho em vez de melhorar. Alguns firmwares também possuem rotinas próprias de reciclagem dos setores livres, independente do sistema operacional.Discard manual (batched discard) é feito rodando uma ferramenta que usa o ioctl FITRIM disponível no kernel e implementado em alguns sistemas de arquivos (ver abaixo). Esta ferramenta verifica quais setores do SSD não são usados pelo sistema de arquivos (você especifica o ponto de montagem) e envia comandos TRIM para zerá-los. Desde a versão 2.19 da suíte util-linux, existe o fstrim, que serve especificamente para este propósito.
Então se você usa SSD no Linux, tem três opções:
- Usar a opção de montagem discard. Se o firmware do seu SSD não for maluco, é a melhor maneira, pois fica tudo automático, você esquece do assunto. Procure usar um kernel recente, de preferência o 3.0 ou superior.
- Não usar a opção de montagem discard e rodar manualmente o fstrim de vez em quando para manter o SSD com setores vazios. Enquanto o fstrim estiver rodando, o desempenho do SSD ficará degradado.
- Não usar a opção de montagem discard e nunca rodar o fstrim. Dependendo do firmware, o SSD se mantém saudável por conta própria.
Leitura recomendada:
Performance evaluation of Linux Discard Support (Overview, benchmark results, current status)
Lukas Czerner
Red Hat
February 12, 2011
[1] A partir da versão 9.14 do hdparm o programa é capaz de reportar se o SSD suporta ou não TRIM. Rode
hdparm -I /dev/<dispositivo>
que ele reportará "Data Set Management TRIM supported" caso suportado.Informações sobre os commits relevantes
No kernel 2.6.33 foi adicionado na libata o suporte ao comando ATA TRIM, que veio para tentar resolver os problemas de lentidão com partiçoes saturadas em SSDs.
libata: add translation for SCSI WRITE SAME (aka TRIM support)
Porém só isso não basta. O código de cada sistema de arquivo precisa ser modificado para usar o novo recurso.
Dos sistemas de arquivos mais conhecidos, os seguintes suportam a opção de montagem
discard
(discard online):- Btrfs (2.6.32)
Btrfs: add -o discard option
- EXT4 (2.6.33)
ext4: make trim/discard optional (and off by default)
- FAT (2.6.33)
fat: make discard a mount option
- Swap (2.6.36)
swap: discard while swapping only if SWAP_FLAG_DISCARD
Na verdade o kernel passou a suportar TRIM no código de swap desde a versão 2.6.29:
swapfile: swapon use discard (trim)
swapfile: swap allocation use discard
Porém só no 2.6.36 que passou a ser configurável.
- XFS (3.0)
xfs: add online discard support
- JFS (3.7)
fs/jfs: TRIM support for JFS Filesystem
E os seguintes suportam discard manual (batched discard):
- EXT4 (2.6.37)
ext4: Add batched discard support for ext4
ext4: add batched_discard into ext4 feature list
ext4: Add EXT4_IOC_TRIM ioctl to handle batched discard
- EXT3 (2.6.38)
ext3: Add batched discard support for ext3
- XFS (2.6.38)
xfs: add FITRIM support
- JFS (3.7)
fs/jfs: TRIM support for JFS Filesystem
No kernel 3.0, a infraestrutura usada pelo kernel para despachar as requisições de discard ficou mais rápida:
blkdev: Submit discard bio in batches in blkdev_issue_discard()
Relacionado:
Fedora 17 em um SSD
ATA TRIM com LUKS/LVM
Olá Marcos, sou Emanuel Negromonte do SempreUpdate, a sua postagem foi excluída. Na maioria das vezes recebemos postagens por e-mail e os e-mails possuem nick's ao invés do nome real. Até hoje essa pessoa não me respondeu o e-mail para dar os créditos como autor. Agradeço o seu apontamento, de fato a sua postagem é bastante valiosa, mas por favor não leve para o lado da índole como foi reportado, somos um time onde temos um compromisso e não plagiadores. Qualquer dúvida procure-me tanto pelo Google + ou no e-mail emanuelnegromonte@sempreupdate.com.br
ResponderExcluirCordialmente,
Emanuel
Não me importaria manter o texto lá, que, apesar de copiar boa parte daqui, tinha uma pequena parte nova de como rodar o fstrim via cron e como configurar a opção discard com dispositivos criptografados. Bastaria citar a fonte.
ExcluirNão sabia da forma de publicação dos artigos. Te peço desculpas pela acidez.