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 TiBProgramul 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/sdbIeș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 -obPatExemplu 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 WExemplu 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.sqliteFatrace 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 extensionIeș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 , rezultatele lor pentru btrfs și ext4 la scrierea a 4 KB se corelează cu ale mele.

Concluzie și rezultate
Prin manevrele descrise, s-a descoperit:
- Scrierea frecventă a stărilor sarcinilor pentru imprimantă de către daemonul de imprimare CUPS în /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Faptul că baza de date este citită la fiecare 30 de secunde de extensia Group Speed Dial pentru Firefox;
- 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;
- 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
