Identifier les processus d'activité disque sous Linux

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 TiB

Programme 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/sdb

Sortie 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 -obPat

Exemple 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 W

Exemple 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.sqlite

Fatrace 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 extension

Sortie 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 ont mené une étude sur l'amplification des écritures de différents systèmes de fichiers.Leurs résultats pour btrfs et ext4 lors de l'écriture de 4 Ko correspondent aux miens.

Identifier les processus d'activité disque sous Linux

Conclusion et résultats

À travers les manipulations décrites, il a été découvert :

  1. L'écriture fréquente des états d'impression par le démon CUPS dans /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Le fait de lire la base de données toutes les 30 secondes par l'extension Group Speed Dial pour Firefox ;
  3. 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 ;
  4. 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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster