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