Descartar em segundo plano em partições de swap no Linux + SSD

11

Problema

Desejo habilitar operações TRIM em segundo plano em uma partição swap dentro de um disco SSD no Linux. De acordo com vários artigos, por exemplo, este , o kernel detecta essa configuração e realiza operações de descarte automaticamente, mas nos meus testes parece que não está funcionando, embora a opção de montagem "descartar" seja usada para forçar esse comportamento.

Cenário

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

fundo

Estas são as etapas a seguir para verificar se o TRIM em segundo plano está funcionando na partição de swap:

  1. Suporte ao 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. Swap fill-up : monte a partição, limpe todos os caches da VM e configure o Linux para trocar agressivamente, definindo vm.swappiness para 100. Em seguida, execute um script que aloque toda a memória disponível e force o kernel a começar a trocar:

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

    O script executa um servidor com 32 GB de memória física + partição de swap de 2 GB e cria um objeto de ~ 33,8 GB na memória, o suficiente para encher toda a memória e começar a trocar. Este é um exemplo de script que alcança 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 de troca é usada. Usando “hdparm --read-sector”, verifico o conteúdo bruto dos setores de partição swap e todos os bytes são definidos como “4141”, a notação hexadecimal correspondente ao caractere “A”, tudo funciona como esperado. Este é um exemplo de script 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 inicial / final da partição de swap usando parted, cfdisk, etc.

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

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

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

  • discard_swap() é chamado durante o processo swapon (), se a opção de montagem "descartar" estiver ativada, ela descarta todo o conteúdo, isso funciona como esperado.
  • discard_swap_cluster() ele 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 emitir apenas um descarte inicial completo quando a partição é ativada durante o processo de inicialização? Obrigado.

santisaez
fonte
4
Qual é o objetivo? A RAM é barata, pois você está provando adequadamente 32 grandes no seu servidor. Desative Swap, use seu SSD para algo útil e pare de fazer bitfricks.
Tom O'Connor
3
A troca não pode ser desativada nesses servidores e eles têm um disco SSD exclusivo; não há opção para hospedar a partição de troca em um HDD tradicional. Estou ciente de que colocar swap em um disco SSD não é a melhor opção, mas queria saber se posso obter o mesmo comportamento ext4 de "descarte" em partições de swap, para melhorar o desempenho do disco o máximo possível.
santisaez
2
Isso realmente soa como um caso de otimização prematura.
precisa saber é o seguinte
"Os comentários só podem ser editados por 5 minutos" - me serve como estando no SF enquanto trabalhava ... como eu estava dizendo; @ MikeyB Na verdade, eu tenho lido sobre isso. O artigo da Wikipedia mencionou algo que eu não conhecia. "Devido à natureza da operação da memória flash, os dados não podem ser sobrescritos diretamente, como em uma unidade de disco rígido." Portanto, faria sentido que os blocos usados ​​anteriormente no swap estivessem vazios ... mas seriam parecidos com "0000" quando santisaez verifica o conteúdo do swap?
Signal15
Tudo isso acontece em uma camada abaixo do sistema operacional. No que diz respeito ao sistema operacional, os dados em um bloco estão lá até serem reescritos. É responsabilidade da unidade lidar com o ciclo de leitura, exclusão e gravação.
MikeyB

Respostas:

1

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

lav
fonte
Isso soa como um bug.
precisa saber é
2
Pode não ser um bug. Dessa maneira, o linux pode descartar muitas páginas de uma só vez, em vez de fazê-las uma a uma.
lav
1

Pode ser que seu sistema tenha --discard=oncecomo padrão. Você já 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 fstrimserviço ou configurá-lo, se já estiver disponível.

kgizdov
fonte
-1

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

O conteúdo da troca é efetivamente 'descartado "quando swapon -sretorna" nenhuma troca usada ". O sistema não substituirá o conteúdo dos blocos (preenchido com" 4141 ") porque é um SSD e gravações excessivas reduziriam a vida útil do SSD (pelo menos é o que retiro da documentação)

Signal15
fonte
5
Se a discardopção de montagem for usada, os comandos TRIM devem ser enviados para a unidade de estado sólido subjacente para evitar problemas de amplificação de gravação em discos SSD. Pelo menos, é dessa maneira que outros sistemas de arquivos, como o ext4.
santisaez
Para ser claro, que seria, de fato resultar em leitura apenas zeros com esse comando hdparm, mas só depois de coletor de lixo do SSD teve a chance de correr ..
Halfgaar