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.


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.


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.


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


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