Descarte de plano de fundo em partições de troca no Linux + SSD

11

Problema

Desejo ativar as operações TRIM de plano de fundo em uma partição de troca dentro de um disco SSD no Linux. De acordo com vários artigos, e. este , o kernel detecta essa configuração e executa automaticamente as operações de descarte, mas nos meus testes parece que não está funcionando, embora a opção de montagem de “descarte” seja usado para forçar esse comportamento.

Cenário

  • Debian Wheezy executando o Linux 3.2.0
  • Disco SSD: 1 x 120 GB OCZ Vertex 3 MI
  • 2GB de partição "simples", sem outras camadas (LVM, RAID, etc.)

Plano de fundo

Estes são os passos que eu sigo para verificar se o background TRIM está trabalhando na partição swap:

  1. Suporte a TRIM : verifique se o disco SSD suporta comandos TRIM e o kernel sinaliza o dispositivo como não rotacional:

    # hdparm -I /dev/sda | grep TRIM
     * Data Set Management TRIM supported (limit 1 block)
     * Deterministic read data after TRIM
    
    # cat /sys/block/sda/queue/rotational
    0
    
  2. Preenchimento de swap : monte a partição, limpe todos os caches da VM e configure o Linux para trocar agressivamente a configuração de vm.swappiness para 100. Em seguida, execute um script que aloque toda a memória disponível e force a kernel para iniciar a troca:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    

    O script é executado em um servidor com 32 GB de memória física + partição de permuta de 2 GB e cria um objeto ~ 33.8 GB na memória, o suficiente para preencher toda a memória e iniciar a troca. Este é um exemplo de script que atinge esse comportamento:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  3. Verifique o conteúdo da troca : “swapon -s” mostra que 100% da memória swap é usada. Usando “hdparm --read-sector” eu verifico o conteúdo bruto dos setores da partição swap e todos os bytes são definidos como “4141”, a notação hexadecimal correspondente para o caractere “A”, tudo funciona conforme o esperado. Este é um script de exemplo para ler setor por setor o conteúdo da partição swap:

    #!/bin/bash
    
    for sector in 'seq 194560 4100095' ; do
        hdparm --read-sector $sector /dev/sda
    done
    

NOTA: você pode obter o setor start / end da partição swap usando parted, cfdisk, etc.

Quando eu paro o script, ele libera toda a memória, incluindo as alocações de troca, “swapon -s” não retorna nenhum uso de swap no sistema. Neste ponto, é esperado que o Linux comece a descartar o conteúdo da partição swap em background, mas não funciona, o conteúdo dos setores ainda é 4141, mesmo várias horas depois. / p>

Eu fiz vários testes e parece que o Linux só executa um descarte completo quando a partição está ativada usando swapon() chamada de sistema, mas nunca em segundo plano, embora as opções de montagem de "descarte" estejam ativadas em /etc/fstab.

Mais pesquisas: blkdev_issue_discard () é a função do kernel encarregada de enviar comandos TRIM para dispositivos SSD subjacentes, há duas referências exclusivas a essa função em mm/swapfile.c :

  • discard_swap() é chamado durante o processo swapon (), se a opção de montagem "descartar" estiver ativada, ele descarta todo o conteúdo, isso funciona como esperado.
  • discard_swap_cluster() deve descartar o conteúdo de uma troca de cluster, mas parece que nunca executa um comando TRIM.

Pergunta: qual é o comportamento esperado do Linux em dispositivos swap + SSD? Ele deve descartar todos os setores / páginas livres ou apenas emitir um descarte completo inicial quando a partição é ativada durante a inicialização processo? Obrigado.

    
por santisaez 13.08.2013 / 16:09

3 respostas

1

Parece que discard_swap_cluster só é chamado de scan_swap_map que, por sua vez, é chamado de get_swap_page ou get_swap_page_of_type . Então, se eu estiver correto, o descarte só acontecerá quando uma nova página de troca for alocada, não quando uma página for liberada.

    
por 13.01.2016 / 11:05
1

Pode ser que o seu sistema tenha --discard=once como padrão. Você tentou montar com uma opção de descarte específica?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

e forçando assim:

# swapon --discard=pages /dev/sda2

Você também pode tentar criar um serviço fstrim ou configurá-lo, se já estiver disponível.

    
por 11.04.2016 / 14:33
-1

When I stop the script it releases all the memory including the swap allocations, “swapon -s” returns no swap usage in the system. At this point, it’s expected that Linux starts discarding the content of the swap partition in background, but it doesn’t work, the content of the sectors is still “4141”, even several hours later.

O conteúdo do swap é efetivamente 'descartado' quando swapon -s retorna "nenhum swap usado". O sistema não sobrescreverá o conteúdo dos blocos (preenchidos com "4141") porque é um SSD e gravações excessivas encurtariam a vida útil do SSD. (Pelo menos, é o que eu tiro da documentação)

    
por 19.08.2013 / 23:19