Identificiramo procese s diskovnom aktivnošću u Linuxu

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 TiB

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

Tipič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 -obPat

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

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

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

Izlaz 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 proveli su istraživanje poboljšanja zapisivanja različitih datotečnih sustava, a njihovi rezultati za btrfs i ext4 prilikom zapisivanja 4 KB odnose se na moje.

Identificiramo procese s diskovnom aktivnošću u Linuxu

Zaključak i zaključak

Putem opisanih manipulacija otkriveno je:

  1. Često zapisivanje stanja zadataka za ispisna čudovišta putem CUPS-a u /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Čin čitanja baze podataka svake 30 sekundi putem proširenja Group Speed Dial za Firefox;
  3. 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;
  4. 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

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster