Identificăm procesele cu activitate pe disc în Linux

TL;DR: articolul discută despre o metodă convenabilă, rapidă și de încredere pentru identificarea programelor Linux care scriu date pe disk, ceea ce ajută la detectarea unei sarcini mari sau anormal de frecvente pe subsistemul de disk și permite evaluarea costurilor de operare ale sistemului de fișiere. Acest lucru este deosebit de relevant pentru SSD-urile din PC-uri, EMMC și memoria Flash din computerele monocircuit.
În timpul scrierii articolului, s-a descoperit că scrierea a câtorva kilobyte de date pe sistemul de fișiere BTRFS conduce la scrierea a 3 megabytes de date reale pe disk.

Introducere

„Oh, prostie, celulele de memorie de pe SSD-urile moderne se vor defecta după zeci de ani de utilizare normală, nu trebuie să ne facem griji în privința asta și cu atât mai puțin să mutăm swap, mașinile virtuale și folderul profilului browser-ului pe HDD” — un răspuns tipic la întrebarea despre fiabilitatea unităților de stocare cu aproximativ 150 TBW garantat. Dacă ne gândim cât pot scrie de obicei programele, pare că 10-20 GB pe zi e deja o cifră mare, să spunem că e maxim 40 GB, nu putem merge mai mult de atât. La astfel de cifre, răspunsul pare să fie rezonabil — e nevoie de 10 ani pentru a atinge valorile garantate în ceea ce privește numărul de rescrieri ale celulelor, având în vedere 40 GB de date scrise zilnic.
Cu toate acestea, după 6 ani, folosesc deja al treilea SSD: la primul s-a defectat controlerul, iar al doilea a început să mute date între celule de câteva ori pe zi, ceea ce crea întârzieri de 30 de secunde în procesarea scrierilor.

După 7 luni de utilizare a noului SSD, am decis să verific cantitatea de date scrise, așa cum o raportează disk-ul prin intermediul SMART.
19.7 TB.
În total, în 7 luni am utilizat 13% din cantitatea garantată de date scrise, având în vedere că este configurat conform recomandărilor pentru alinierea partițiilor și configurarea FS, swap-ul meu este aproape deloc utilizat, disk-urile mașini virtuale sunt stocate pe HDD!
Aceasta este o cifră anormal de mare, cu acest ritm, TBW-ul garantat va fi depășit înainte de a atinge perioada de 5 ani de garanție a disk-ului. Și nu poate computerul meu să scrie 93 de gigabytes pe zi! Trebuie să verific cât de multe date sunt scrise pe disk într-un interval de 10 minute…

Total:
Scrisori în așteptare: 24,712, 2,237MiB
Scrisori finalizate: 25,507, 2,237MiB
Combinări de scriere: 58, 5,472KiB

2.2 GiB, wow!

Determinarea cantității de date scrise pe dispozitivul de disk

Dacă dispozitivul dvs. suportă S.M.A.R.T. (SSD, EMMC, unele MicroSD industriale), atunci primul lucru pe care ar trebui să-l faceți este să solicitați datele de la unitate cu ajutorul programelor smartctl, skdump sau mmc (din pachetul mmc-utils).

Exemplul de ieșire al programului smartctl

$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (construcție locală)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== ÎNCEPUTUL SECȚIUNII DE INFORMAȚII ===
Familia Modelului:     SSD-uri bazate pe Samsung
Model Dispozitiv:     Samsung SSD 860 EVO mSATA 250GB
Număr de Serie:    S41MNC0KA13477K
ID Dispozitiv LU WWN: 5 002538 e700fa64b
Versiune Firmware: RVT41B6Q
Capacitate Utilizator:    250 059 350 016 bytes [250 GB]
Dimensiune Sector:      512 bytes logic/physical
Viteza de Rotire:    Dispozitiv cu Stat Solid
Factor de Formă:      mSATA
Dispozitiv este:        În baza de date smartctl [pentru detalii folosiți: -P show]
Versiunea ATA este:   ACS-4 T13/BSR INCITS 529 revizia 5
Versiunea SATA este:  SATA 3.1, 6.0 Gb/s (curent: 3.0 Gb/s)
Ora Locală este:    Marți, 19 Nov 2019 01:48:50 MSK
Suport SMART este:: Disponibil - dispozitivul are capacitate SMART.
Suport SMART este: Activat

=== ÎNCEPUTUL SECȚIUNII DE CITIRE A DATELOR SMART ===
Rezultatul testului de autoevaluare a sănătății SMART: APROBAT

Valori Generale SMART:
Statusul colectării de date offline:  (0x00) Activitatea de colectare a datelor offline
                                        nu a fost niciodată începută.
                                        Colectare automată a datelor offline: Dezactivată.
Statusul execuției auto-testului:      (   0) Rutina anterioară a auto-testului s-a finalizat
                                        fără eroare sau nu a fost
                                        niciodată efectuat un auto-test.
Timpul total pentru a finaliza colectarea de date offline:                (    0) secunde.
Colectarea de date offline
capacități:                    (0x53) Execută imediat SMART Offline.
                                        Suport pentru activarea/dezactivarea automată a colectării de date offline.
                                        Suspendare a colecției offline la noua
                                        comandă.
                                        Nu se suportă scanarea suprafeței offline.
                                        Auto-testul este suportat.
                                        Nu se suportă Auto-testul de Transport.
                                        Auto-testul Selectiv este suportat.
Capacități SMART:            (0x0003) Salvează datele SMART înainte de a intra
                                        în modul de economisire a energiei.
                                        Suportă temporizatorul de salvare automată SMART.
Capacitatea de logare a erorilor:        (0x01) Logarea erorilor este suportată.
                                        Logarea General Purpose este suportată.
Timpul recomandat de polling pentru rutina de auto-test scurt:        (   2) minute.
Timpul recomandat de polling pentru rutina de auto-test extins:        (  85) minute.
Capacități SCT:              (0x003d) SCT Status este suportat.
                                        SCT Error Recovery Control este suportat.
                                        SCT Feature Control este suportat.
                                        SCT Data Table este suportat.

Versiunea structurii de date a atributelor SMART: 1
Atribute SMART specifice furnizorului cu praguri:
ID# NUMELE_ATRIBUTULUI          FLAG     VALOARE CEA MAI RĂU TIPOLOGIE      ONORAT  CÂND_A_FALIMENTAT VALOARE_BRUTĂ
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Întotdeauna       -       0
  9 Power_On_Hours          0x0032   098   098   000    Vârstă_avansată   Întotdeauna       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Vârstă_avansată   Întotdeauna       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Pre-fail  Întotdeauna       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Întotdeauna       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Vârstă_avansată   Întotdeauna       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Vârstă_avansată   Întotdeauna       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Întotdeauna       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Vârstă_avansată   Întotdeauna       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Vârstă_avansată   Întotdeauna       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Vârstă_avansată   Întotdeauna       -       0
199 CRC_Error_Count         0x003e   100   100   000    Vârstă_avansată   Întotdeauna       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Vârstă_avansată   Întotdeauna       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Vârstă_avansată   Întotdeauna       -       38615215765

Versiunea Logului de Erori SMART: 1
Nu au fost înregistrate erori

Structura logului de auto-test SMART revizia 1
Nu au fost înregistrate auto-testuri.  [Pentru a rula auto-testuri, folosiți: smartctl -t]

Structura de date a logului de auto-test selectiv SMART revizia 1
 SPAN  MIN_LBA  MAX_LBA  STATUSUL_TESTULUI_ACTUAL
    1        0        0  Nu_se_testază
    2        0        0  Nu_se_testază
    3        0        0  Nu_se_testază
    4        0        0  Nu_se_testază
    5        0        0  Nu_se_testază
Punctele de auto-test selectiv (0x0):
  După scanarea porțiunilor selectate, NU citiți-scanarea restului discului.
Dacă auto-testul selectiv este în așteptare la pornire, reluați după o întârziere de 0 minute.

SSD-ul meu stochează cantitatea de date scrise în parametru 241 Total_LBAs_Written, în blocuri logice (LBA), nu în octeți. Dimensiunea blocului logic în cazul meu este de 512 octeți (acest lucru poate fi văzut în ieșirea smartctl, în Sector Size). Pentru a obține octeți, trebuie să înmulțim valoarea parametrului cu 512.

38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 TB
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 TiB

Programul skdump SSD-ul meu încearcă să interpreteze valoarea Total_LBAs_Written într-un mod propriu, motiv pentru care afișează 1296217.695 TB, ceea ce este, evident, incorect.

Pentru a afla cantitatea de informații scrise la nivel de dispozitiv, vom folosi programul btrace din pachetul blktrace. Acesta arată atât statistici generale pentru întreaga durată de funcționare a programului, cât și procese și fire individuale (inclusiv nuclee) care au efectuat scrierea.

Rulați următoarea comandă pentru a colecta informații timp de 10 minute, unde /dev/sdb este discul dumneavoastră:

# btrace -w 600 -a write /dev/sdb

Ieșirea tipică a comenzii

…
  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):
 Reads Queued:           0,        0KiB  Writes Queued:         345,   25,932KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:      331,   25,788KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:    1,597,  117,112KiB
 Read Merges:            0,        0KiB  Write Merges:            1,       16KiB
 Read depth:             0               Write depth:           177
 IO unplugs:             0               Timer unplugs:           0
CPU1 (8,16):
 Reads Queued:           0,        0KiB  Writes Queued:         502,   39,948KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:      495,   40,076KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        0,        0KiB
 Read Merges:            0,        0KiB  Write Merges:            0,        0KiB
 Read depth:             0               Write depth:           177
 IO unplugs:             0               Timer unplugs:           0
CPU2 (8,16):
 Reads Queued:           0,        0KiB  Writes Queued:         297,   26,800KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:      287,   26,800KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        0,        0KiB
 Read Merges:            0,        0KiB  Write Merges:            0,        0KiB
 Read depth:             0               Write depth:           177
 IO unplugs:             0               Timer unplugs:           0
CPU3 (8,16):
 Reads Queued:           0,        0KiB  Writes Queued:         418,   24,432KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:      408,   24,448KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        0,        0KiB
 Read Merges:            0,        0KiB  Write Merges:            2,      272KiB
 Read depth:             0               Write depth:           177
 IO unplugs:             0               Timer unplugs:           0

Total (8,16):
 Reads Queued:           0,        0KiB  Writes Queued:       1,562,  117,112KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:    1,521,  117,112KiB
 Reads Requeued:         0               Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:    1,597,  117,112KiB
 Read Merges:            0,        0KiB  Write Merges:            3,      288KiB
 IO unplugs:             0               Timer unplugs:           0

Throughput (R/W): 0KiB/s / 2,338KiB/s
Events (8,16): 9,287 entries
Skips: 0 forward (0 -   0.0%)

btrace oferă o vizualizare clară a cantității reale de date scrise, dar este greu să înțelegem ce anume programe efectuează scrierea, din ieșirea acesteia.

Identificarea programelor care scriu pe mediu

Programul iotop va arăta procesele care scriu pe disc și dimensiunea datelor scrise.
Cele mai convenabile ieșiri sunt asigurate de următoarele opțiuni:

# iotop -obPat

Exemplu de ieșire a programului

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]'

Se observă imediat Firefox, care a scris 283 megabytes în câteva minute de funcționare a iotop.

Identificarea fișierelor în care se face scrierea

Informațiile despre procesul care folosește discurile sunt utile, dar este și mai bine să știm căile prin care se face scrierea.

Să folosim programul fatrace, care urmărește modificările sistemului de fișiere.

# fatrace -f W

Exemplu de ieșire a programului

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 nu poate arăta cantitatea de date scrise din cauza utilizării unui mecanism oarecum simplu de urmărire a accesării fișierelor prin inotify.

Din rezultatul obținut, se poate observa cum Habr își salvează articolul în stocarea locală a browserului, pe măsură ce îl scriu, precum și extensia Group Speed Dial, care, așa cum a fost descoperit tocmai cu ajutorul fatrace, își citește datele la fiecare 30 de secunde. Exact, citește, nu scrie: CW În fața fișierului se menționează că fișierul este deschis pentru citire și scriere, cu crearea acestuia în același timp, dacă nu există (se apelează openat cu flagul O_RDWR|O_CREAT), dar nu se afirmă că în fișier a fost scris efectiv vreo informație.

Pentru a fi absolut sigur de acest lucru, să utilizăm strace, cu un filtru pe apelurile de sistem de fișiere:

strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extension

Ieșirea comenzii

[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

Nu există nicio apelare write(), ceea ce sugerează lipsa scrierii în fișier.

Definirea supracosturilor sistemului de fișiere

O mare diferență în citiri iotop și btrace m-a făcut să mă gândesc să testez sistemul de fișiere prin scriere manuală de date în fișier și urmărind citirile cu btrace.

Dacă excludem complet scrierea pe disc, încărcându-ne în modul de urgență systemd, și scriem manual câteva byte de date în fișierul existent, btrace pe SSD cu btrfs raportează scrierea 3 megabytes date reale. Un sistem de fișiere recent creat pe o unitate flash de 8 GB scrie minimum 264 KiB la scrierea unui singur byte.
Pentru comparație, scrierea a două byte într-un fișier pe ext4 se finalizează cu scrierea a 24 kilobyte de date pe disc.

În 2017, Jayashree Mohan, Rohan Kadekodi și Vijay Chidambaram au realizat un studiu privind amplificarea scrierii în diferite sisteme de fișiere., rezultatele lor pentru btrfs și ext4 la scrierea a 4 KB se corelează cu ale mele.

Identificăm procesele cu activitate pe disc în Linux

Concluzie și rezultate

Prin manevrele descrise, s-a descoperit:

  1. Scrierea frecventă a stărilor sarcinilor pentru imprimantă de către daemonul de imprimare CUPS în /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Faptul că baza de date este citită la fiecare 30 de secunde de extensia Group Speed Dial pentru Firefox;
  3. Scrierea periodică a jurnalelor de către diverse servicii de monitorizare a performanței în Fedora, ceea ce a dus la scrierea a câtorva megabyte de date pe btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. O amplificare imensă la scrierea unei cantități mici de date atunci când se folosește btrfs.

Concluzie: nu ar trebui să folosiți btrfs dacă aplicațiile scriu frecvent cantități mici de date (câteva kilobyte), altfel se va traduce în megabyte de date scrise. Acest lucru este deosebit de relevant pentru computerele cu o singură placă care rulează OS pe MicroSD.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster