Verifique o suporte do TRIM com o BtrFS no SSD


21

Estamos estudando o uso do BtrFS em uma matriz de discos SSD e me pediram para verificar se o BtrFS realmente executa operações TRIM ao excluir um arquivo. Até agora não consegui verificar se o comando TRIM é enviado para os discos.

Sei que o BtrFS não é considerado pronto para produção, mas gostamos do que há de mais atual, portanto estou testando. O servidor é o Ubuntu 11.04, versão de 64 bits (mkfs.btrfs versão 0.19). Instalei o kernel do Linux 3.0.0, pois o changelog do BtrFS afirma que o TRIM em massa não está disponível no kernel fornecido com o Ubuntu 11.04 (2.6.38).

Aqui está minha metodologia de teste (adotada inicialmente em http://andyduffell.com/techblog/?p=852 , com modificações para trabalhar com o BtrFS):

  • APERTE manualmente os discos antes de iniciar: for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
  • Verifique se a unidade foi TRIM'd: ./sectors.pl |grep + | tee sectors-$(date +%s)
  • Particione a unidade: fdisk /dev/sda
  • Faça o sistema de arquivos: mkfs.btrfs /dev/sda1
  • Montagem: sudo mount -t btrfs -o ssd /dev/sda1 /mnt
  • Crie um arquivo: dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
  • Verifique se o arquivo está no disco: ./sectors.pl | tee sectors-$(date +%s)
  • Exclua o arquivo de teste: rm /mnt/testfile
  • Veja que o arquivo de teste é TRIM'd do disco: ./sectors.pl | tee sectors-$(date +%s)
  • Verifique os blocos TRIM'd: diffos dois sectors-*arquivos mais recentes

Nesse ponto, as verificações de pré-exclusão e pós-exclusão ainda mostram os mesmos blocos de disco em uso. Em vez disso, eu deveria ver uma redução no número de blocos em uso. Esperar uma hora (caso demore algum tempo para que o comando TRIM seja emitido) após a exclusão do arquivo de teste ainda mostra os mesmos blocos em uso.

Eu também tentei montar com as -o ssd,discardopções, mas isso não parece ajudar em nada.

Partição criada a partir de fdiskcima (mantenho a partição pequena para que a verificação possa ser mais rápida):

root@ubuntu:~# fdisk -l -u /dev/sda

Disk /dev/sda: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6bb7542b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              63      546209      273073+  83  Linux

Meu sectors.plscript (eu sei que isso é ineficiente, mas faz o trabalho):

#!/usr/bin/perl -w

use strict;

my $device = '/dev/sda';
my $start = 0;
my $limit = 655360;

foreach ($start..$limit) {
    printf "\n%6d ", $_ if !($_ % 50);
    my @sector = `/sbin/hdparm --read-sector $_ $device`;
    my $status = '.';
    foreach my $line (@sector) {
            chomp $line;
            next if $line eq '';
            next if $line =~ /$device/;
            next if $line =~ /^reading sector/;
            if ($line !~ /0000 0000 0000 0000 0000 0000 0000 0000/) {
                    $status = '+';
            }
    }
    print $status;
}
print "\n";

Minha metodologia de teste é falha? Estou faltando alguma coisa aqui?

Obrigado pela ajuda.


1
Eu apoio totalmente o teste de coisas de ponta, mas só para você saber, a partir de agora, o btrfs não tem um fsck que, na verdade, você sabe, corrige coisas: btrfs.wiki.kernel.org/index.php/Main_Page - então apenas atente para isso.
Matt Simmons

@ Matt - Bom ponto sobre o fsck ausente. Meu entendimento é que a primeira versão de um fsck deve ser lançada nas próximas semanas, portanto, devemos ser cobertos no momento em que passarmos para a produção. Além disso, teremos várias cópias de nossos dados; portanto, se perdermos uma cópia, teremos pelo menos mais duas cópias para restaurar. Mas concordo plenamente que esse não é o sistema de arquivos para pessoas com dados insubstituíveis no momento.
Shane Meyers

1
Provavelmente não mudará nada, mas você pode tentar executar um syncapós rmming do arquivo.
Zebediah49

Quero dizer que tentei executar um syncapós remover o arquivo e os resultados ainda eram os mesmos. Vou checar isso quando voltar ao escritório após o fim de semana.
Shane Meyers

se você não se importa com o que há de mais moderno , já pensou em zfsonlinux.org ? ZFS nativo (ou seja, no kernel, não no fusível) para linux. Eles estão perto de um "release" oficial, e têm RCs disponíveis (incluindo um PPA para o Ubuntu - fácil o suficiente para reconstruir para o debian também)
cas

Respostas:


4

Então, depois de muitos dias trabalhando nisso, pude demonstrar que o BtrFS usa o TRIM. Não foi possível que o TRIM funcionasse com êxito no servidor no qual implantaremos esses SSDs. No entanto, ao testar usando a mesma unidade conectada a um laptop, os testes são bem-sucedidos.

Hardware usado para todos esses testes:

  • Crucial m4 SSD 512GB
  • HP DL160se G6
  • LSI LSISAS9200-8e HBA
  • gabinete SAS genérico
  • Computador portátil Dell XPS m1210

Após muitas tentativas fracassadas de verificar o BtrFS no servidor, decidi fazer o mesmo teste usando um laptop antigo (remova a camada da placa RAID). As tentativas iniciais deste teste usando Ext4 e BtrFS no laptop falham (dados não são TRIM).

Em seguida, atualizei o firmware da unidade SSD da versão 0001 (fornecida de fábrica) para a versão 0009. Os testes foram repetidos com Ext4 e BtrFS e os dois sistemas de arquivos TRIM efetuaram os dados com êxito.

Para garantir que o comando TRIM tivesse tempo de executar, fiz uma rm /mnt/testfile && sync && sleep 120antes de executar a validação.

Uma coisa a observar se você está tentando esse mesmo teste: os SSDs possuem blocos de apagamento nos quais eles operam (não sei o tamanho dos blocos de apagamento Crucial m4). Quando o sistema de arquivos envia o comando TRIM para a unidade, a unidade apaga apenas um bloco completo; se o comando TRIM for especificado para uma parte de um bloco, esse bloco não será TRIM devido aos dados válidos restantes no bloco de exclusão.

Então, para demonstrar do que estou falando (saída do sectors.plscript acima). Isso ocorre com o arquivo de teste no SSD. Períodos são setores que contêm apenas zeros. As vantagens têm um ou mais bytes diferentes de zero.

Arquivo de teste na unidade:

24600 .......................................+++++++++++
24650 ++++++++++++++++++++++++++++++++++++++++++++++++++
24700 ++++++++++++++++++++++++++++++++++++++++++++++++++
    -- cut --
34750 ++++++++++++++++++++++++++++++++++++++++++++++++++
34800 ++++++++++++++++++++++++++++++++++++++++++++++++++
34850 +++++++++++++++++++++++++++++.....................

Arquivo de teste excluído da unidade (após a sync && sleep 120):

24600 .......................................+..........
24650 ..................................................
24700 ..................................................
    -- cut --
34750 ..................................................
34800 ..................................................
34850 ......................+++++++.....................

Parece que o primeiro e o último setor do arquivo estão dentro de um bloco de exclusão diferente do restante do arquivo. Portanto, alguns setores foram deixados intocados.

Como exemplo: algumas instruções de teste do Ext4 TRIM solicitam ao usuário que verifique apenas se o primeiro setor foi TRIM do arquivo. O testador deve exibir uma parte maior do arquivo de teste para realmente ver se o TRIM foi bem-sucedido ou não.

Agora, para descobrir por que os comandos TRIM emitidos manualmente enviados ao SSD através do cartão RAID funcionam, mas os comandos TRIM automáticos para não ...


Eu pensei que todos os HW RAID tinham comandos de ajuste, é bom ver que as coisas estão mudando lentamente. Por outro lado, com boas unidades modernas, a TRIM importa cada vez menos.
Ronald Pottol

4

Com base no que li, pode haver uma falha na sua metodologia.

Você está assumindo que o TRIM resultará no seu SSD zerando os blocos que foram excluídos. Entretanto, este normalmente não é o caso.

Isso é apenas se o SSD implementar o TRIM para zerar os blocos descartados. Você pode verificar se o dispositivo pelo menos sabe o suficiente para relatar discard_zeroes_data:

cat / sys / block / sda / queue / discard_zeroes_data

Além disso, mesmo se o SSD zerar, pode levar algum tempo - bem após a conclusão do descarte - até o SSD zerar os blocos (isso é verdade para alguns SSDs de menor qualidade).

http://www.redhat.com/archives/linux-lvm/2011-April/msg00048.html

BTW, eu estava procurando uma maneira confiável de verificar o TRIM e ainda não encontrei uma. Eu adoraria saber se alguém encontra uma maneira.


3

Aqui está a metodologia de teste para 10.10 e EXT4. Talvez ajude.

/ubuntu/18903/how-to-enable-trim

Ah, e acho que você precisa do parâmetro descarte na montagem fstab. Não tenho certeza se o parâmetro SSD é necessário, pois acho que ele deve detectar automaticamente o SSD.


2
Tentei seguir as instruções de verificação do Ext4 SSD, mas elas não funcionam devido a diferenças no funcionamento do BtrFS em comparação com outros sistemas de arquivos. Daí o fluxo de trabalho que eu criei. Usei a ssdopção mount para garantir que o BtrFS soubesse usar seu código específico de SSD, mesmo que ele devesse detectar automaticamente. Eu também tentei usar discard(como mencionado acima) e não ajudou.
Shane Meyers

Ah bem. Worth a shot :)
Dave Veffer 01/09/11

1

Para btrfs, você precisa da discardopção para ativar o suporte ao TRIM.

Um teste muito simples, mas funcional, para o TRIM funcional está aqui: http://techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2


1
Como mencionei acima, tentei meus testes com a discardopção e a ssdopção. Os documentos do BtrFS mencionam muito a ssdopção, então concentrei meus testes lá, mas nenhuma opção resultou no resultado esperado. A maioria das páginas da web que mostram como testar o TRIM são para Ext4 e similares. O BtrFS não pode ser testado usando essas metodologias devido à diferença no design do sistema de arquivos.
Shane Meyers

hdparm --fibmapé FS agnóstico. Um bloco em um determinado endereço LBA é zerado ou não, seja a opção extN, btrfs, xfs, jfs ... ssdé irrelevante para aparar, consulte, por exemplo, esta discussão na lista de discussão btrfs : mail-archive.com/linux-btrfs @ vger.kernel.org / msg10932.html .
Paweł Brodacki 02/09/11

Eu tentei usar, hdparm --fibmapmas ele não funciona no BtrFS. Se você olhar para o README do wiper.sh (distribuído ao lado do hdparm), eles explicitamente afirmam que "as chamadas FIEMAP / FIBMAP ioctl () são completamente inseguras quando usadas em um sistema de arquivos btrfs". Então o hdparm foi lançado, o que é muito ruim, pois isso tornaria os testes muito mais fáceis. Eu não sabia que a ssdopção não tinha nada a ver com o TRIM, pois os documentos não são muito claros sobre a utilidade da opção.
Shane Meyers

Obrigado pelas informações extras sobre o ioctls, eu não sabia. Eu acho que o melhor lugar para pedir informações extras pode ser a lista de discussão btrfs. Você obterá informações em primeira mão a partir daí.
Paweł Brodacki

1

Algumas coisas em que pensar (para ajudar a responder à sua pergunta "estou perdendo alguma coisa?"):

  • o que exatamente é / dev / sda? um único SSD? ou uma matriz RAID (hardware?) de SSDs?

  • se este último, que tipo de controlador RAID?

  • e seu controlador RAID suporta TRIM?

e finalmente,

  • seu método de teste fornece os resultados esperados se você formatar / dev / sda1 com algo diferente de btrfs?

1

Praticamente todos os SSDs com uma interface SATA executam algum tipo de sistema de arquivos com estrutura de log que está completamente oculto para você. O comando SATA 'trim' informa ao dispositivo que o bloco não está mais em uso e que o sistema de arquivos da estrutura de log subjacente pode fazer flash / se / o bloco de apagamento correspondente (que pode ser substancialmente maior) / somente / contém blocos marcados com trim.

Não li os documentos padrão, que estão aqui: http://t13.org/Documents/MinutesDefault.aspx?keyword=trim , mas não tenho certeza se existe alguma garantia de nível padrão que você possa veja os resultados de um comando trim. Se você pode ver alguma coisa mudar, como o primeiro byte sendo zerado no início de um bloco de apagamento, não acho que exista garantia de que isso seja aplicável em diferentes dispositivos ou talvez na versão do firmware.

Se você pensar sobre o modo como a abstração pode ser implementada, deve ser possível tornar o resultado do comando trim completamente invisível para aquele que apenas lê / grava blocos. Além disso, pode ser difícil dizer quais blocos estão no mesmo bloco de apagamento, pois apenas a camada de conversão em flash precisa saber disso e pode ter reordenado-os logicamente.

Talvez haja um comando SATA (comando OEM, talvez?) Para buscar metadados relacionados à camada de conversão flash dos SSDs?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.