domingo, 16 de outubro de 2011

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, 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.

[Atualização - 30/10/2013] Ver: ATA TRIM com LUKS/LVM

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()

Links relacionados:
Fedora 17 em um SSD

2 comentários:

  1. 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

    Cordialmente,

    Emanuel

    ResponderExcluir
    Respostas
    1. 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.

      Não sabia da forma de publicação dos artigos. Te peço desculpas pela acidez.

      Excluir