TL;DR: cet article traite d'un moyen pratique, rapide et fiable de déterminer les programmes Linux qui écrivent des données sur le disque, ce qui aide à identifier une charge importante ou anormalement élevée sur le sous-système de disque, et permet également d'évaluer les surcharges du système de fichiers. Cela est particulièrement pertinent pour les SSD dans les PC, EMMC et mémoire Flash dans des ordinateurs à carte unique.
Au cours de la rédaction de cet article, il a été découvert que l'écriture de plusieurs kilooctets de données sur le système de fichiers BTRFS entraîne l'écriture de 3 mégaoctets de données réelles sur le disque.
Introduction
« Oh, ce n'est pas grave, les cellules de mémoire des SSD modernes se dégraderont après des dizaines d'années d'utilisation normale, il ne faut pas s'en préoccuper, et encore moins déplacer le swap, les machines virtuelles et le dossier de profil du navigateur vers le HDD » — réponse typique à la question de la fiabilité des disques à état solide garantissant environ 150 TBW. Si l'on considère combien de données un logiciel typique peut écrire, on estime que 10-20 Go par jour est déjà un chiffre important, maximisons à 40 Go, que pourrait-on écrire de plus ? Avec ces chiffres, la réponse semble tout à fait raisonnable : il faut 10 ans pour atteindre les valeurs garanties concernant le nombre d'écritures des cellules, avec 40 Go de données écrites quotidiennement. Cependant, en 6 ans, j'ai déjà utilisé mon troisième SSD : le premier a vu son contrôleur tomber en panne, et le second a commencé à déplacer des données entre les cellules plusieurs fois par jour, entraînant des retards de 30 secondes dans le traitement des écritures.
Après 7 mois d'utilisation du nouveau SSD, j'ai décidé de vérifier la quantité de données écrites, comme le rapportait le disque lui-même via SMART.
19,7 To.
Au total, en 7 mois, j'ai utilisé 13 % de la quantité garantie de données écrites, sachant qu'il est configuré selon les recommandations d'alignement des partitions et de configuration du système de fichiers, le swap est presque inexploité, les disques
sont placés sur HDD ! machines virtuelles C'est un chiffre anormalement élevé, à ce rythme, le TBW garanti sera dépassé avant la fin des 5 ans de garantie du disque. Mon ordinateur ne peut pas écrire 93 Go par jour ! Il faut vérifier combien de données sont écrites sur le disque en 10 minutes…
2,2 Go, oh là là !
Total :
Écritures en attente : 24 712, 2 237 Mo
Écritures terminées : 25 507, 2 237 Mo
Fusions d'écriture : 58, 5 472 Ko
Détermination de la quantité de données écrites sur le dispositif de stockage
Si votre appareil supporte S.M.A.R.T. (SSD, EMMC, certains MicroSD industriels), il convient de demander d'abord des données au stockage avec les programmes
smartctl skdump, mmc ou (issu de mmc-utils). (des ensembles mmc-utils).
Exemple de sortie du programme smartctl
$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (construit local)
Droit d'auteur (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
=== DÉBUT DE LA SECTION D'INFORMATION ===
Famille de modèle : SSDs basés sur Samsung
Modèle de périphérique : Samsung SSD 860 EVO mSATA 250GB
Numéro de série : S41MNC0KA13477K
Id de périphérique LU WWN : 5 002538 e700fa64b
Version du firmware : RVT41B6Q
Capacité utilisateur : 250 059 350 016 octets [250 Go]
Taille de secteur : 512 octets logique/physique
Taux de rotation : Dispositif à état solide
Facteur de forme : mSATA
Le périphérique est : Dans la base de données smartctl [pour plus de détails, utilisez : -P show]
La version ATA est : ACS-4 T13/BSR INCITS 529 révision 5
La version SATA est : SATA 3.1, 6.0 Gb/s (actuel : 3.0 Gb/s)
L'heure locale est : Mar Nov 19 01:48:50 2019 MSK
Le support SMART est : Disponible - le périphérique a la capacité SMART.
Le support SMART est : Activé
=== DÉBUT DE LA SECTION DES DONNÉES SMART ===
Résultat du test d'auto-évaluation de santé globale SMART : RÉUSSI
Valeurs SMART générales :
État de collecte de données hors ligne : (0x00) Activité de collecte de données hors ligne
n'a jamais commencé.
Collecte de données hors ligne automatique : Désactivée.
État d'exécution du test : ( 0) La routine précédente d'auto-test s'est terminée
sans erreur ou aucun auto-test n'a jamais
été effectué.
Temps total pour compléter la
collecte de données hors ligne : ( 0) secondes.
Capacités de collecte de données hors ligne : (0x53) SMART exécute Offline immédiat.
Prise en charge de la collecte de données hors ligne automatique.
Suspendre la collecte hors ligne sur nouvelle
commande.
Aucune analyse de surface hors ligne prises en charge.
Auto-test pris en charge.
Pas de test de transport pris en charge.
Test sélectif pris en charge.
Capacités SMART : (0x0003) Sauvegarde des données SMART avant d'entrer
en mode économie d'énergie.
Prend en charge le minuteur de sauvegarde automatique SMART.
Capacité de journalisation des erreurs : (0x01) Journalisation des erreurs prise en charge.
Journalisation à des fins générales prise en charge.
Temps de sondage recommandé pour la
routine d'auto-test rapide : ( 2) minutes.
Temps de sondage recommandé pour la routine d'auto-test
étendu : ( 85) minutes.
Capacités SCT : (0x003d) État SCT pris en charge.
Contrôle de récupération d'erreur SCT pris en charge.
Contrôle des caractéristiques SCT pris en charge.
Tableau de données SCT pris en charge.
Numéro de révision de la structure des données des attributs SMART : 1
Attributs SMART spécifiques au fournisseur avec seuils :
ID# NOM_DE_L_ATTRIBUT FLAG VALEUR PIRE SEUIL TYPE MISE À JOUR LORS_ECHOUÉ VALEUR_BRUTE
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pré-échec Toujours - 0
9 Power_On_Hours 0x0032 098 098 000 Vieillesse Toujours - 5171
12 Power_Cycle_Count 0x0032 099 099 000 Vieillesse Toujours - 459
177 Wear_Leveling_Count 0x0013 096 096 000 Pré-échec Toujours - 62
179 Used_Rsvd_Blk_Cnt_Tot 0x0013 100 100 010 Pré-échec Toujours - 0
181 Program_Fail_Cnt_Total 0x0032 100 100 010 Vieillesse Toujours - 0
182 Erase_Fail_Count_Total 0x0032 100 100 010 Vieillesse Toujours - 0
183 Runtime_Bad_Block 0x0013 100 100 010 Pré-échec Toujours - 0
187 Uncorrectable_Error_Cnt 0x0032 100 100 000 Vieillesse Toujours - 0
190 Airflow_Temperature_Cel 0x0032 058 039 000 Vieillesse Toujours - 42
195 ECC_Error_Rate 0x001a 200 200 000 Vieillesse Toujours - 0
199 CRC_Error_Count 0x003e 100 100 000 Vieillesse Toujours - 0
235 POR_Recovery_Count 0x0012 099 099 000 Vieillesse Toujours - 29
241 Total_LBAs_Written 0x0032 099 099 000 Vieillesse Toujours - 38615215765
Version du journal d'erreurs SMART : 1
Aucune erreur enregistrée
Structure log d'auto-test SMART numéro de révision 1
Aucun auto-test n'a été enregistré. [Pour exécuter des auto-tests, utilisez : smartctl -t]
Structure de données du journal d'auto-test sélectif SMART numéro de révision 1
ÉTENDRE MIN_LBA MAX_LBA ÉTAT_TEST_ACTUEL
1 0 0 Non_testé
2 0 0 Non_testé
3 0 0 Non_testé
4 0 0 Non_testé
5 0 0 Non_testé
Drapeaux du test sélectif (0x0) :
Après avoir scanné les étendues sélectionnées, ne pas lire le reste du disque.
Si un test sélectif est en attente à l'allumage, reprendre après 0 minute de délai.Mon SSD stocke la quantité de données écrites dans le paramètre 241 Total_LBAs_Written, en unités de blocs logiques (LBA), et non en octets. La taille du bloc logique dans mon cas est de 512 octets (vous pouvez le voir dans la sortie de smartctl, dans la taille des secteurs). Pour obtenir des octets, il faut multiplier la valeur du paramètre par 512.
38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 To
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 TiBProgramme mmc sur mon SSD essaie d'interpréter la valeur Total_LBAs_Written d'une manière qui lui est propre, ce qui donne 1296217.695 To, ce qui est manifestement incorrect.
Pour connaître la quantité d'informations écrites au niveau de l'appareil, utilisons le programme btrace qui fait partie du paquet blktrace. Il montre des statistiques globales pour toute la durée d'exécution du programme, ainsi que des processus et des threads spécifiques (y compris les cœurs) qui ont effectué des écritures.
Exécutez la commande suivante pour collecter des informations pendant 10 minutes, où /dev/sdb est votre disque :
# btrace -w 600 -a write /dev/sdbSortie typique de la commande
…
8,16 0 3253 50.085433192 0 C WS 125424240 + 64 [0]
8,16 0 3254 50.085550024 0 C WS 193577744 + 64 [0]
8,16 0 3255 50.085685165 0 C WS 197246976 + 64 [0]
8,16 0 3256 50.085936852 0 C WS 125736264 + 128 [0]
8,16 0 3257 50.086060780 0 C WS 96261752 + 64 [0]
8,16 0 3258 50.086195031 0 C WS 94948640 + 64 [0]
8,16 0 3259 50.086327355 0 C WS 124656144 + 64 [0]
8,16 0 3260 50.086843733 15368 C WSM 310218496 + 32 [0]
8,16 0 3261 50.086975238 753 A WSM 310218368 + 32 <– (8,20) 291339904
8,16 0 3262 50.086975560 753 Q WSM 310218368 + 32 [dmcrypt_write/2]
8,16 0 3263 50.086977345 753 G WSM 310218368 + 32 [dmcrypt_write/2]
8,16 0 3264 50.086978072 753 I WSM 310218368 + 32 [dmcrypt_write/2]
8,16 0 3265 50.086979159 753 D WSM 310218368 + 32 [dmcrypt_write/2]
8,16 0 3266 50.087055685 0 C WSM 310218368 + 32 [0]
8,16 0 3267 50.087060168 753 A WSM 310218592 + 160 <– (8,20) 291340128
8,16 0 3268 50.087060367 753 Q WSM 310218592 + 160 [dmcrypt_write/2]
8,16 0 3269 50.087061242 753 G WSM 310218592 + 160 [dmcrypt_write/2]
8,16 0 3270 50.087061698 753 I WSM 310218592 + 160 [dmcrypt_write/2]
8,16 0 3271 50.087062361 753 D WSM 310218592 + 160 [dmcrypt_write/2]
8,16 0 3272 50.087386179 0 C WSM 310218592 + 160 [0]
8,16 0 3273 50.087436417 15368 A FWS 0 + 0 <– (253,1) 0
8,16 0 3274 50.087437471 15368 Q FWS [LS Thread]
8,16 0 3275 50.087440862 15368 G FWS [LS Thread]
8,16 0 3276 50.088300047 0 C WS 0 [0]
8,16 0 3277 50.088470917 753 A WFSM 18882688 + 8 <– (8,20) 4224
8,16 0 3278 50.088471091 753 Q WFSM 18882688 + 8 [dmcrypt_write/2]
8,16 0 3279 50.088471688 753 G WFSM 18882688 + 8 [dmcrypt_write/2]
8,16 0 3280 50.088474334 32254 D WSM 18882688 + 8 [kworker/0:2H]
8,16 0 3281 50.088515572 0 C WSM 18882688 + 8 [0]
8,16 0 3282 50.089229069 0 C WSM 18882688 [0]
CPU0 (8,16):
Requêtes lues : 0, 0Ko Requêtes écrites : 345, 25,932Ko
Requêtes de lecture : 0, 0Ko Requêtes d'écriture : 331, 25,788Ko
Requêtes de lecture reclassées : 0 Requêtes d'écriture reclassées : 0
Requêtes lues terminées : 0, 0Ko Requêtes écrites terminées : 1,597, 117,112Ko
Fusions de lecture : 0, 0Ko Fusions d'écriture : 1, 16Ko
Profondeur de lecture : 0 Profondeur d'écriture : 177
Déclenchements IO : 0 Déclenchements de minuteur : 0
CPU1 (8,16):
Requêtes lues : 0, 0Ko Requêtes écrites : 502, 39,948Ko
Requêtes de lecture : 0, 0Ko Requêtes d'écriture : 495, 40,076Ko
Requêtes de lecture reclassées : 0 Requêtes d'écriture reclassées : 0
Requêtes lues terminées : 0, 0Ko Requêtes écrites terminées : 0, 0Ko
Fusions de lecture : 0, 0Ko Fusions d'écriture : 0, 0Ko
Profondeur de lecture : 0 Profondeur d'écriture : 177
Déclenchements IO : 0 Déclenchements de minuteur : 0
CPU2 (8,16):
Requêtes lues : 0, 0Ko Requêtes écrites : 297, 26,800Ko
Requêtes de lecture : 0, 0Ko Requêtes d'écriture : 287, 26,800Ko
Requêtes de lecture reclassées : 0 Requêtes d'écriture reclassées : 0
Requêtes lues terminées : 0, 0Ko Requêtes écrites terminées : 0, 0Ko
Fusions de lecture : 0, 0Ko Fusions d'écriture : 0, 0Ko
Profondeur de lecture : 0 Profondeur d'écriture : 177
Déclenchements IO : 0 Déclenchements de minuteur : 0
CPU3 (8,16):
Requêtes lues : 0, 0Ko Requêtes écrites : 418, 24,432Ko
Requêtes de lecture : 0, 0Ko Requêtes d'écriture : 408, 24,448Ko
Requêtes de lecture reclassées : 0 Requêtes d'écriture reclassées : 0
Requêtes lues terminées : 0, 0Ko Requêtes écrites terminées : 0, 0Ko
Fusions de lecture : 0, 0Ko Fusions d'écriture : 2, 272Ko
Profondeur de lecture : 0 Profondeur d'écriture : 177
Déclenchements IO : 0 Déclenchements de minuteur : 0
Total (8,16):
Requêtes lues : 0, 0Ko Requêtes écrites : 1,562, 117,112Ko
Requêtes de lecture : 0, 0Ko Requêtes d'écriture : 1,521, 117,112Ko
Requêtes de lecture reclassées : 0 Requêtes d'écriture reclassées : 0
Requêtes lues terminées : 0, 0Ko Requêtes écrites terminées : 1,597, 117,112Ko
Fusions de lecture : 0, 0Ko Fusions d'écriture : 3, 288Ko
Déclenchements IO : 0 Déclenchements de minuteur : 0
Débit (R/W) : 0Ko/s / 2,338Ko/s
Événements (8,16) : 9,287 entrées
Saut : 0 en avant (0 - 0.0%) btrace permet de visualiser clairement la quantité réelle de données enregistrées, mais il est difficile de comprendre quelles programmes effectuent cette écriture à partir de sa sortie.
Identification des programmes qui écrivent sur le disque
Programme iotop affichera les processus écrivant sur le disque et la taille des données enregistrées.
Les paramètres suivants assurent une sortie des plus pratiques :
# iotop -obPatExemple de sortie du programme
02:55:47 Total DISK READ : 0.00 B/s | Total DISK WRITE : 30.65 K/s
02:55:47 Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TIME PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b'02:55:47 753 be/4 root 0.00 B 0.00 B 0.00 % 0.04 % [dmcrypt_write/2]'
b'02:55:47 788 be/4 root 72.00 K 18.27 M 0.00 % 0.02 % [btrfs-transacti]'
b'02:55:47 15057 be/4 valdikss 216.00 K 283.05 M 0.00 % 0.01 % firefox'
b'02:55:47 1588 ?dif root 0.00 B 0.00 B 0.00 % 0.00 % Xorg -nolisten tcp -auth /var/run/sddm/{398f030f-9667-4dff-b371-81eaae48dfdf} -background none -noreset -displayfd 18 -seat seat0 vt1'
b'02:55:47 15692 be/4 valdikss 988.00 K 9.41 M 0.00 % 0.00 % python3 /usr/bin/gajim'
b'02:55:47 15730 ?dif valdikss 9.07 M 0.00 B 0.00 % 0.00 % telegram-desktop --'
b'02:55:47 2174 ?dif valdikss 1840.00 K 2.47 M 0.00 % 0.00 % yakuake'
b'02:55:47 19827 be/4 root 16.00 K 896.00 K 0.00 % 0.00 % [kworker/u16:7-events_unbound]'
b'02:55:47 19074 be/4 root 16.00 K 480.00 K 0.00 % 0.00 % [kworker/u16:4-btrfs-endio-write]'
b'02:55:47 19006 be/4 root 16.00 K 1872.00 K 0.00 % 0.00 % [kworker/u16:1-events_unbound]'
b'02:55:47 1429 be/4 root 484.00 K 0.00 B 0.00 % 0.00 % accounts-daemon'
b'02:55:47 15820 be/4 valdikss 312.00 K 0.00 B 0.00 % 0.00 % firefox -contentproc -childID 6 -isForBrowser -prefsLen 7894 -prefMapSize 223880 -parentBuildID 20191022164834 -greomni /usr/lib64/firefox/omni.ja -appomni /usr/lib64/firefox/browser/omni.ja -appdir /usr/lib64/firefox/browser 15057 tab'
b'02:55:47 2125 ?dif valdikss 0.00 B 92.00 K 0.00 % 0.00 % plasmashell'
b'02:55:47 1268 be/3 root 0.00 B 4.00 K 0.00 % 0.00 % auditd'
b'02:55:47 1414 be/4 root 0.00 B 4.00 K 0.00 % 0.00 % sssd_nss --uid 0 --gid 0 --logger=files'
b'02:55:47 15238 be/4 valdikss 0.00 B 4.00 K 0.00 % 0.00 % thunderbird'
b'02:55:47 18605 be/4 root 0.00 B 3.19 M 0.00 % 0.00 % [kworker/u16:0-btrfs-endio-write]'
b'02:55:47 18867 be/4 root 0.00 B 96.00 K 0.00 % 0.00 % [kworker/u16:5-btrfs-endio-meta]'
b'02:55:47 19070 be/4 root 0.00 B 160.00 K 0.00 % 0.00 % [kworker/u16:2-btrfs-freespace-write]'
b'02:55:47 19645 be/4 root 0.00 B 2.17 M 0.00 % 0.00 % [kworker/u16:3-events_unbound]'
b'02:55:47 19982 be/4 root 0.00 B 496.00 K 0.00 % 0.00 % [kworker/u16:6-btrfs-endio-write]'Firefox se démarque avec 283 mégaoctets enregistrés en quelques minutes d'exécution d'iotop.
Identification des fichiers sur lesquels l'écriture a lieu
Des informations sur le processus qui accapare le disque sont utiles, mais savoir quels chemins sont utilisés pour l'écriture est encore mieux.
Utilisons le programme fatrace, qui suit les modifications du système de fichiers.
# fatrace -f WExemple de sortie du programme
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqliteFatrace ne peut pas afficher la quantité de données écrites en raison de l'utilisation d'un suivi assez simple des accès aux fichiers via inotify.
Il ressort de la sortie que Habr sauvegarde mon article dans le stockage local du navigateur pendant que je l'écris, et que l'extension Group Speed Dial, que j'ai pu découvrir grâce à fatrace, lit ses données toutes les 30 secondes. Elle lit, et non écrit : CW Le message avant le fichier indique que le fichier s'ouvre en lecture et en écriture, tout en créant le fichier au besoin (appel à openat avec les options O_RDWR|O_CREAT), mais ne mentionne pas que des informations ont effectivement été écrites dans le fichier.
Par précaution, pour vérifier cela, utilisons strace avec un filtre sur les appels système de fichiers :
strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extensionSortie de la commande
[pid 20352] openat(AT_FDCWD, "/home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 153
[pid 20352] read(153, "SQLite format 3 20 22 @ d 23"..., 100) = 100
[pid 20352] read(153, "SQLite format 3 20 22 @ d 23"..., 4096) = 4096
[pid 20352] openat(AT_FDCWD, "/home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 166
…
[pid 20352] read(54, " r4304364354354364- 4204!4'414" 250 &"..., 4096) = 4096
[pid 20352] read(54, " 136Pt2262504 O24532016:"16.27 r245306>2461t1q370"..., 4096) = 4096
[pid 20352] close(77) = 0
[pid 20352] close(54) = 0 Il n'y a aucun appel write(), ce qui indique qu'aucune écriture n'a été effectuée dans le fichier.
Définition des frais généraux du système de fichiers
Une grande différence dans les relevés iotop et btrace m'a amené à tester le système de fichiers en écrivant manuellement des données dans le fichier et en suivant les relevés de btrace.
Pour totalement exclure l'écriture sur le disque, démarrez en mode d'urgence systemd et écrivez manuellement quelques octets de données dans un fichier existant, btrace sur le SSD avec btrfs indique une écriture de 3 mégaoctets Données réelles. Un système de fichiers fraîchement créé sur une clé USB de 8 Go enregistre au minimum 264 Ko lors de l'écriture d'un seul octet.
En comparaison, l'écriture de deux octets dans un fichier sur ext4 se termine par l'enregistrement de 24 kilooctets de données sur le disque.
En 2017, Jayashree Mohan, Rohan Kadekodi et Vijay Chidambaram Leurs résultats pour btrfs et ext4 lors de l'écriture de 4 Ko correspondent aux miens.

Conclusion et résultats
À travers les manipulations décrites, il a été découvert :
- L'écriture fréquente des états d'impression par le démon CUPS dans /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Le fait de lire la base de données toutes les 30 secondes par l'extension Group Speed Dial pour Firefox ;
- L'enregistrement périodique des journaux par divers services de suivi des performances dans Fedora, ce qui entraînait l'écriture de plusieurs mégaoctets de données sur btrfs : pmcd.service, pmie.service, pmlogger.service ;
- Une énorme amplification lors de l'écriture d'un petit nombre de données en utilisant btrfs.
Conclusion : il ne faut pas utiliser btrfs si les programmes écrivent fréquemment de petites quantités de données (quelques kilooctets), sinon cela se traduira par des mégaoctets de données enregistrées. Cela est particulièrement pertinent pour les ordinateurs monocarte utilisant un système d'exploitation sur MicroSD.
Source : habr.com
