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