TL;DR: članak govori o praktičnom, brzom i pouzdanom načinu određivanja Linux programa koji upisuju podatke na disk, što pomaže u identifikaciji velike ili nenormalno česte opterećenosti diskovnog sustava, kao i omogućava procjenu troškova datotečnog sustava. Ovo je posebno važno za SSD-ove u računalima, EMMC i Flash memorijskim čipovima u jednoplatnim računalima.
Tijekom pisanja članka otkriveno je da upis nekoliko kilobajta podataka na datotečni sustav BTRFS rezultira upisivanjem 3 megabajta stvarnih podataka na disk.
Uvod
„Oh, gluposti, memorijske ćelije na modernim SSD-ovima će se pokvariti nakon desetljeća uobičajenog korištenja, ne trebate se brinuti o tome, a pogotovo ne premještati swap, virtualne mašine i mapu profila preglednika na HDD“ — tipičan odgovor na pitanje o pouzdanosti čvrstih diskova s garancijom ≈150 TBW. Ako procijenimo koliko tipični softver može zapisivati podatke, čini se da je 10-20 GB dnevno već velika cifra, neka bude maksimum 40 GB, gdje više? Sa takvim brojkama odgovor je sasvim razuman — potrebno je 10 godina da se dosegne garantiranih vrijednosti po broju ponovnog pisanja ćelija, pri 40 GB upisanih podataka dnevno.
Međutim, u 6 godina koristim već treći SSD: prvo se pokvario kontroler, a drugi je počeo premještati podatke između ćelija nekoliko puta dnevno, što je rezultiralo 30-sekundnim kašnjenjima pri obradi upisa.
Nakon 7 mjeseci korištenja novog SSD-a odlučio sam provjeriti koliko je podataka upisano, prema informacijama koje disk pruža preko SMART-a.
19,7 TB.
U ukupno 7 mjeseci iskoristio sam 13% od garancijom predviđenog broja upisanih podataka, pri čemu je dotični postavljen prema preporukama za ravnanje particija i podešavanje FS-a, swap gotovo ne koristim, diskovi virtualnih mašina smješteni su na HDD!
To je nenormalno visoka cifra, ovakvim tempom jamstveni TBW će biti premašen prije nego što se dosegne petogodišnji rok jamstva diska. A moj računalni sustav ne može zapisivati 93 gigabajta dnevno! Treba provjeriti koliko podataka se zapisuje na disk u 10 minuta...
Ukupno:
Zapisane čekanje: 24,712, 2,237MiB
Zapisani završeni: 25,507, 2,237MiB
Spojevi zapisa: 58, 5,472KiB
2.2 GiB, wow!
Određivanje broja upisanih podataka na diskovno uređaje
Ako vaše uređaj podržava S.M.A.R.T. (SSD, EMMC, neki industrijski MicroSD), prvo što trebate učiniti je zatražiti podatke s memorije putem programa smartctl, skdump ili mmc (iz skupa mmc-utils).
Primjer izlaza programa smartctl
$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (local build)
Autorska prava (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
=== POČETAK INFORMACIJSKE SEKCIJE ===
Obitelj modela: Samsung SSD-ovi
Model uređaja: Samsung SSD 860 EVO mSATA 250GB
Serijski broj: S41MNC0KA13477K
LU WWN identifikator uređaja: 5 002538 e700fa64b
Verzija firmvera: RVT41B6Q
Korisni kapacitet: 250 059 350 016 bajtova [250 GB]
Veličina sektora: 512 bajtova logički/fizički
Brzina okretanja: Solid State Device
Oblik uređaja: mSATA
Uređaj je: U smartctl bazi podataka [za detalje upotrijebite: -P show]
ATA verzija je: ACS-4 T13/BSR INCITS 529 revizija 5
SATA verzija je: SATA 3.1, 6.0 Gb/s (trenutno: 3.0 Gb/s)
Lokalno vrijeme je: Uto Nov 19 01:48:50 2019 MSK
SMART podrška je:: Dostupna - uređaj ima SMART mogućnosti.
SMART podrška je: Omogućena
=== POČETAK SEKCIJE ČITANJE SMART PODATAKA ===
SMART ukupni rezultat samo-evaluacije zdravlja: PROŠAO
Opće SMART vrijednosti:
Status offline prikupljanja podataka: (0x00) Aktivnost offline prikupljanja podataka
nikada nije započeta.
Automatsko offline prikupljanje podataka: Onemogućeno.
Status izvršenja samoprovere: ( 0) Prethodna rutinska samoprovera završena
bez greške ili niti jedna samoprovera
nikada nije izvršena.
Ukupno vrijeme potrebno za završetak offline
podataka prikupljanja: ( 0) sekundi.
Offline prikupljanje podataka
mogućnosti: (0x53) SMART izvršava offline odmah.
Automatsko offline prikupljanje podataka uključeno/isključeno.
Pauza offline prikupljanja podataka po novom
naredbi.
Nema podržanih offline površinskih skeniranja.
Samoprovera podržana.
Nema podrške za samoproveru prenosa.
Podržana selektivna samoprovera.
SMART mogućnosti: (0x0003) Čuva SMART podatke prije nego što uđe
u način uštede energije.
Podrška za SMART automatski sat.
Mogućnost prijavljivanja grešaka: (0x01) Podrška za prijavljivanje grešaka.
Opća podrška za prijavljivanje.
Preporučeno vrijeme ispitivanja kratke samoprovere: ( 2) minute.
Preporučeno vrijeme ispitivanja duge samoprovere: ( 85) minuta.
SCT mogućnosti: (0x003d) SCT Status podržan.
SCT Kontrola oporavka grešaka podržana.
SCT Kontrola značajki podržana.
SCT Tabela podataka podržana.
SMART struktura podataka atributa, broj revizije: 1
Proizvođački specifični SMART atributi s pragovima:
ID# IME_ATRIBUTA FLAG VRIJEDNOST NAJGORI PRAG TIPO AŽURIRANO KADA_GREŠKA RAW_VRIJEDNOST
5 Broj_prekvalificiranih_sektora 0x0033 100 100 010 Pre-fail Uvijek - 0
9 Sat_na_uženju 0x0032 098 098 000 Staro Uvijek - 5171
12 Broj_ciklusa napajanja 0x0032 099 099 000 Staro Uvijek - 459
177 Broj_izjednačavanja 0x0013 096 096 000 Pre-fail Uvijek - 62
179 Broj_korištenog_bloka_zdravlja 0x0013 100 100 010 Pre-fail Uvijek - 0
181 Ukupni_broj_grešaka_programiranja 0x0032 100 100 010 Staro Uvijek - 0
182 Ukupni_broj_grešaka_brisanja 0x0032 100 100 010 Staro Uvijek - 0
183 Runtime_Bad_Block 0x0013 100 100 010 Pre-fail Uvijek - 0
187 Broj_neispravnih_grešaka 0x0032 100 100 000 Staro Uvijek - 0
190 Temperatura_vjetra_Cel 0x0032 058 039 000 Staro Uvijek - 42
195 Stopa_ECC_grešaka 0x001a 200 200 000 Staro Uvijek - 0
199 Broj_CRC_grešaka 0x003e 100 100 000 Staro Uvijek - 0
235 Broj_POR_oporavka 0x0012 099 099 000 Staro Uvijek - 29
241 Ukupno_LBAs_Zapisano 0x0032 099 099 000 Staro Uvijek - 38615215765
SMART verzija loga grešaka: 1
Nema zabilježenih grešaka
SMART struktura loga samoprovere, broj revizije: 1
Nema zabilježenih samoprovera. [Za pokretanje samoprovera, koristite: smartctl -t]
SMART struktura podataka loga selektivne samoprovere, broj revizije: 1
OPSEG MIN_LBA MAX_LBA STATUS_TRENUTNE_TESTIRANJA
1 0 0 Ne_testira
2 0 0 Ne_testira
3 0 0 Ne_testira
4 0 0 Ne_testira
5 0 0 Ne_testira
Flags samoprovere selektivne (0x0):
Nakon skeniranja odabranih opsega, ne čitajte ostatak diska.
Ako je selektivna samoprovera u tijeku pri pokretanju, nastavite nakon 0 minutnog kašnjenja.Moj SSD pohranjuje količinu zapisane podatke u parametru 241 Total_LBAs_Written, u logičkim blokovima (LBA), a ne u bajtovima. Veličina logičkog bloka u mom slučaju iznosi 512 bajtova (može se vidjeti u outputu smartctl, u Sector Size). Da bismo dobili bajtove, potrebno je pomnožiti vrijednost parametra sa 512.
38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 TB
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 TiBProgram skdump na mom SSD-u pokušava interpretirati vrijednost Total_LBAs_Written nekako po svom, zbog čega izbacuje 1296217.695 TB, što je očito netočno.
Kako bismo saznali količinu zapisivanja informacija na razini uređaja, upotrijebit ćemo program btrace iz sastava paketa blktrace. On prikazuje kako ukupne statistike za cijelo vrijeme rada programa, tako i pojedinačne procese i niti (uključujući jezgre) koje su izvršavale zapisivanje.
Pokrenite sljedeću naredbu da prikupite informacije tijekom 10 minuta, gdje /dev/sdb — vaš disk:
# btrace -w 600 -a write /dev/sdbTipični izlaz naredbe
…
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 omogućava jasan pregled stvarne količine zapisanih podataka, ali je teško razumjeti koje točno programe vrše zapis prema njegovom izlazu.
Identifikacija programa koji vrše zapis na uređaj
Program iotop pokazat će procese koji pišu na disk i količinu zapisanih podataka.
Najprikladniji izlaz osiguravaju sljedeći parametri:
# iotop -obPatPrimjer izlaza programa
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]'Uočava se Firefox, koji je zapisao 283 megabajta u nekoliko minuta rada iotopa.
Identifikacija datoteka u koje se vrši zapis
Informacije o procesu koji opterećuje disk su korisne — a još su bolje staze preko kojih se vrši zapis.
Iskoristit ćemo program fatrace, koji prati promjene u datotečnom sustavu.
# fatrace -f WPrimjer izlaza programa
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 može prikazati količinu zapisanih podataka zbog korištenja prilično jednostavnog praćenja činjenice pristupa datotekama putem inotify.
Iz izlaza se vidi kako Habr sprema moj članak u local storage preglednika dok ga pišem, kao i ekstenzija Group Speed Dial koja, kako se moglo otkriti upravo uz pomoć fatrace, čita svoje podatke svake 30 sekundi. Točno čita, a ne zapisuje: CW Informacija ispred datoteke ukazuje na to da se datoteka otvara za čitanje i pisanje, uz istovremeno kreiranje datoteke ako ona ne postoji (poziva se openat s flagom O_RDWR|O_CREAT), no ne navodi da je u datoteku zaista pisana neka informacija.
Za svaki slučaj, da bismo se uvjerili u to, koristit ćemo strace s filtriranjem na sistemske pozive datoteka:
strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extensionIzlaz naredbe
[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 Nema poziva write(), što ukazuje na odsustvo zapisa u datoteku.
Određivanje troškova datotečnog sistema
Velika razlika u očitanjima iotop i btrace navela me je na pomisao da testiram datotečni sistem ručnim upisivanjem podataka u datoteku i praćenjem očitanja btrace-a.
Ako potpuno isključim zapis na disk, pokrenem se u emergency modu systemd i ručno upišem nekoliko bajtova podataka u postojeću datoteku, btrace na SSD-u s btrfs javlja o zapisu 3 megabajta stvarnih podataka. Svježe stvoreni datotečni sustav na USB-u kapaciteta 8 GB zapisuje najmanje 264 KiB prilikom zapisivanja jednog bajta.
Za usporedbu, zapisivanje nekoliko bajtova u datoteku na ext4 završava zapisivanjem 24 kilobajta podataka na disk.
U 2017. godini, Jayashree Mohan, Rohan Kadekodi i Vijay Chidambaram , a njihovi rezultati za btrfs i ext4 prilikom zapisivanja 4 KB odnose se na moje.

Zaključak i zaključak
Putem opisanih manipulacija otkriveno je:
- Često zapisivanje stanja zadataka za ispisna čudovišta putem CUPS-a u /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Čin čitanja baze podataka svake 30 sekundi putem proširenja Group Speed Dial za Firefox;
- Periodično zapisivanje logova različitim uslugama za praćenje performansi na Fedori, što je dovelo do zapisa nekoliko megabajta podataka na btrfs: pmcd.service, pmie.service, pmlogger.service;
- Ogromno pojačanje prilikom zapisivanja male količine podataka uz korištenje btrfs.
Zaključak: ne preporučuje se korištenje btrfs ukoliko programi često zapisivaju malu količinu podataka (nekoliko kilobajta), inače će to rezultirati megabajtima zapisanih podataka. Ovo je posebno važno za jednoplatne računale sa OS-om na MicroSD.
Izvor: habr.com
