Problème
Je souhaite activer les opérations TRIM en arrière-plan sur une partition de swap dans un disque SSD sous Linux. Selon plusieurs articles, par exemple celui-ci , le noyau détecte cette configuration et effectue automatiquement les opérations de suppression, mais mes tests semblent ne pas fonctionner bien que l'option de montage «discard» soit utilisée pour forcer ce comportement.
Scénario
- Debian Wheezy exécutant Linux 3.2.0
- Disque SSD: 1 x 120 Go OCZ Vertex 3 MI
- 2 Go de partition «plate» d'échange, sans autres couches (LVM, RAID, etc.)
Contexte
Voici les étapes que je suis pour vérifier si TRIM en arrière-plan fonctionne sur la partition de swap:
Prise en charge de TRIM : vérifiez si le disque SSD prend en charge les commandes TRIM et si le noyau marque le périphérique comme non rotatif:
# 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
Remplissage d'échange : montez la partition, nettoyez tous les caches de VM et configurez Linux pour permuter de manière agressive en définissant vm.swappiness à 100. Ensuite, exécutez un script qui alloue toute la mémoire disponible et force le noyau à commencer à échanger:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
Le script exécute un serveur avec 32 Go de mémoire physique + une partition de swap de 2 Go et crée un objet de ~ 33,8 Go en mémoire, ce qui est suffisant pour remplir toute la mémoire et commencer à échanger. Voici un exemple de script qui réalise ce comportement:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
Vérifiez le contenu du swap : «swapon -s» indique que 100% de la mémoire de swap est utilisée. En utilisant «hdparm --read-sector», je vérifie le contenu brut des secteurs de partition de swap et tous les octets sont définis sur «4141», la notation hexadécimale correspondante pour le caractère «A», tout fonctionne comme prévu. Voici un exemple de script pour lire secteur par secteur le contenu de la partition de swap:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
REMARQUE: vous pouvez obtenir le secteur de début / fin de la partition de swap en utilisant parted, cfdisk, etc.
Lorsque j'arrête le script, il libère toute la mémoire, y compris les allocations de swap, «swapon -s» ne renvoie aucune utilisation de swap dans le système. À ce stade, il est prévu que Linux commence à supprimer le contenu de la partition de swap en arrière-plan, mais cela ne fonctionne pas , le contenu des secteurs est toujours «4141», même plusieurs heures plus tard.
J'ai fait plusieurs tests et il semble que Linux n'effectue un rejet complet que lorsque la partition est activée à l'aide d' swapon()
un appel système, mais jamais en arrière-plan, bien que les options de montage «discard» soient activées sur / etc / fstab.
Recherches complémentaires: blkdev_issue_discard () est la fonction du noyau chargée d'envoyer des commandes TRIM aux périphériques SSD sous-jacents, il existe deux références uniques à cette fonction sur mm/swapfile.c
:
discard_swap()
il est appelé pendant le processus swapon (), si l'option de montage «discard» est activée, elle rejette tout le contenu, cela fonctionne comme prévu.discard_swap_cluster()
il doit supprimer le contenu d'un échange de cluster, mais semble ne jamais exécuter de commande TRIM.
Question: quel est le comportement attendu de Linux sur les périphériques swap + SSD? Il doit supprimer tous les secteurs / pages libres ou uniquement émettre un rejet complet initial lorsque la partition est activée pendant le processus de démarrage? Merci.