macOS Monterey supporte enfin le TRIM en USB

Bonne nouvelle, car le problème existait depuis des années : macOS Monterey supporte (enfin) la commande TRIM en USB pour les SSD externes.

Petites précisions : je le mets en début d’article parce qu’on a plusieurs fois fait la remarques sur divers sites. Pour le fait de devoir l’activer manuellement, c’est probablement le cas (je n’ai pas de quoi tester) et c’est historique sous macOS, pour pleins de raisons. Pour le fait que l’exFAT ne prenne pas en charge le TRIM, c’est lié à Microsoft, a priori (comme expliqué plus bas, Windows ne le gère pas non plus). Et pour le fait que tous les adaptateurs USB vers SATA ne gèrent pas la commande, c’est matériel. C’est une limitation des adaptateurs, et c’est la même chose avec d’autres OS. Enfin, si votre SSD affiche deux lignes pour le même identifiant, ça peut venir du fait qu’il contient une partition EFI (cachée) qui ne prend pas en compte le TRIM.

J’ai trouvé des sujets sur MacRumors qui en parlaient, donc j’ai fait quelques essais. Attention, il faut peut-être explicitement activer le TRIM pour les SSD tiers (c’était déjà fait sur mes machines) avec la commande sudo trimforce enable.

Mais c’est quoi le TRIM et pourquoi c’est important ? En simplifiant vraiment, c’est une commande qui permet de dire au contrôleur du SSD que les données effacées sont libres. Elle est importante pour la gestion de l’usure des SSD (sans TRIM, ça s’use un peu plus vite) mais aussi pour les performances. Sur les SSD avec un cache qui accélère les écritures (la majorité des modèles modernes), le cache en question ne fonctionne pas réellement sans la commande TRIM, et les performances peuvent donc s’effondrer. Donc le TRIM en USB, c’est important.

Attention, il y a quelques limites. Premièrement, le SSD externe doit être formaté en APFS et pas en exFAT. Ce n’est pas une limitation arbitraire d’Apple, c’est juste que l’exFAT ne supporte pas le TRIM (en tout cas sous Windows et sous macOS).

Deuxièmement, il faut un bridge qui supporte la commande. Pour être plus clair : ça ne fonctionne pas avec tous les boitiers et adaptateurs USB (comme sous Windows, du reste). Il y a deux contraintes à ce niveau : le bridge (la puce qui fait le lien entre l’USB et le SSD) doit supporter l’UASP et le TRIM.

L’UASP est un protocole qui augmente les performances en USB et une bonne partie des adaptateurs modernes supporte ça. Ce n’est malheureusement pas généralisé, mais c’est simple à vérifier. Une fois le SSD branché, tapez cette commande dans le Terminal. Si elle donne une réponse, c’est bon. S’il n’y a pas de réponse, vous n’aurez pas le TRIM.

ioreg |egrep 'IOUSBMassStorageUASDriver'

Pour le TRIM, c’est un peu la même chose. Pour vérifier si ça marche, il faut débranchez le SSD, le rebranchez et taper la commande suivante. Il faut adapter la date en mettant un timing un peu avant le branchement.

log show --predicate "processID == 0" --start "2021-12-23 15:30:00" | grep spaceman

Avec un boitier qui supporte le TRIM, vous aurez une réponse de ce genre (j’ai viré les heures pour que ce soit plus simple à lire). En gros, si ça affiche le nombre de trims/s, c’est a priori bon.

kernel: (apfs) spaceman_scan_free_blocks:3153: disk4 scan took 4.544669 s, trims took 2.996066 s
kernel: (apfs) spaceman_scan_free_blocks:3155: disk4 100157466 blocks free in 4570 extents
kernel: (apfs) spaceman_scan_free_blocks:3163: disk4 100157466 blocks trimmed in 4570 extents (655 us/trim, 1525 trims/s)
kernel: (apfs) spaceman_scan_free_blocks:3166: disk4 trim distribution 1:815 2+:622 4+:809 16+:312 64+:174 256+:1838

S’il ne supporte pas le TRIM (que ce soit le boîtier, le SSD, le HDD, etc.), vous aurez plutôt ceci.

kernel: (apfs) spaceman_metazone_init:191: disk4 metazone for device 0 of size 2693771 blocks (encrypted: 0-1346885 unencrypted: 1346885-2693771)
kernel: (apfs) spaceman_scan_free_blocks:3171: disk4 scan took 2.461839 s (no trims)

Quelques essais

Comme j’ai pas mal de SSD et adaptateurs à la maison, j’ai essayé avec beaucoup d’appareils.

Sur les boîtiers USB vers SATA que je possède qui utilisent des puces Asmedia… ça dépend. J’en ai plusieurs qui s’identifient avec les mêmes valeurs (0x174c et 0x55aa) et une prise en charge variable, probablement en fonction du firmware. Certains supportent TRIM et UASP, d’autres uniquement l’UASP et d’autres aucun des deux. Il faut tester.

J’ai un USB vers SATA avec une puce Via qui accepte le TRIM et un Prolific qui ne l’accepte pas.

La bonne nouvelle vient des adaptateurs USB vers NVMe : j’en ai trois, deux à base de JMicron 562 et un à base d’Asmedia 2364 et les trois fonctionnent. De même, un SSD externe Crucial X8 accepte bien la commande.

Si vous voulez vérifier la prise en charge, il y a une autre commande : ioreg -l. Il suffit ensuite de chercher "Unmap"=Yes. Unmap est le nom de la commande SCSI équivalente au TRIM. Assez bizarrement, certains contrôleurs affichent aussi "UnmapCapable"=Yes, mais ça ne semble rien changer.

Enfin, j’ai testé avec Catalina (et ça ne semble pas fonctionner) et Guillaume m’a aidé pour Big Sur, et ça ne semble pas fonctionner non plus. Donc c’est a priori une nouveauté de Monterey.

Si quelqu’un se sent motivé pour faire une app’ ou un script qui donne le résultat facilement, ça peut être intéressant (je n’ai aucune idée de comment faire ça).