Tuletame välja protsessid, millel on kettategevus Linuxis

TL;DR: Artikkel räägib mugavast, kiirest ja usaldusväärsest viisist Linuxi programmide tuvastamiseks, mis salvestavad andmeid kettale, mis aitab tuvastada suurt või ebanormaalselt sagedast koormust kettaalale ja võimaldab hinnata failisüsteemi kulusid. See on eriti актуaalne SSD-de puhul arvutites, EMMC ja Flash-mälude puhul ühekandjalistes arvutites.
Artikli kirjutamise käigus selgus, et paarikümne kilobaidi andmete kirjutamine BTRFS failisüsteemi toob endaga kaasa 3 megabaiti reaalseid andmeid, mis salvestatakse kettale.

Sissejuhatus

„Ai, vale jutt, modernaalsete SSD-de mälurakud lagunevad tavakasutuses aastate jooksul, ei ole põhjust muretseda, ja veel vähem kanda swap-i, virtuaalmasinaid ja brauseri profiilikatalooge HDD-le“ — tüüpiline vastus küsimusele SSD-de usaldusväärsuse kohta, millega on tagatud ≈150 TBW. Kui arvutada, kui palju tüüpiline tarkvara võib andmeid kirjutada, siis näib, et 10-20 GB päevas on juba suur number, las olla maksimum 40 GB, kuhu enam. Selliste numbritega on vastus täiesti mõistlik — 10 aastat on vajalik, et saavutada garanteeritud rakenduste üle kirjutamise arv, kui iga päev on kirjutatud 40 GB andmeid.
Siiski olen ma 6 aasta jooksul kasutanud juba kolmandat SSD-d: esimesel lagunes kontroller, ja teisel hakkas andmeid mitme korra päevas rakenduste vahel liigutama, mis viis 30-sekundiliste viivitusteni kirjutamise teenindamisel.

Pärast uue SSD kasutamist 7 kuu jooksul otsustasin kontrollida kirjutatud andmete hulka, nagu seda teatab ketas ise läbi SMART-i.
19.7 TB.
Kokku 7 kuu jooksul olen kasutanud 13% garantiis sätestatud kirjutatud andmete kogusest, kuigi see on seadistatud vastavalt sektsioonide tasakaalustamise ja failisüsteemi seadistamise soovitustele, swap-i kasutan ma peaaegu üldse, kettad virtuaalmasinate asuvad HDD-l!
See on ebaharilikult suur number, selliste tempo korral ületatakse garantiiga TBW enne, kui ketta 5-aastane garantii on saavutatud. Ja mu arvuti ei saa ju kirjutada 93 gigabaidi päevas! Tuleb kontrollida, kui palju andmeid kirjutatakse kettale 10 minuti jooksul…

Kokku:
Kirjutamised järjekorras: 24,712, 2,237MiB
Kirjutamised lõpetatud: 25,507, 2,237MiB
Kirjutamise ühendused: 58, 5,472KiB

2.2 GiB, vau!

Andmete hulga määramine salvestusseadmest

Kui teie seade toetab S.M.A.R.T. (SSD, EMMC, mõned tööstuslikud MicroSD), siis tuleks kõigepealt küsida andmeid seadmest programmidega smartctl, skdump või mmc (mmc-utils komplektist).

Smartctl programmi väljundi näide

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

=== ALUSTAME TEABE SEKTSIOON ===
Mudeli perekond:     Samsungi põhised SSD-d
Seadmestiku mudel:     Samsung SSD 860 EVO mSATA 250GB
Seerianumber:    S41MNC0KA13477K
LU WWN seadme ID: 5 002538 e700fa64b
Firmware'i versioon: RVT41B6Q
Kasutaja mahutavus:    250 059 350 016 baiti [250 GB]
Sektsioonide suurus:      512 baiti loogilise/füüsilise
Pöörlemiskiirus:    Kindel olek
Korpuse tüüp:      mSATA
Seade on:        smartctl andmebaasis [detailide kasutamiseks: -P show]
ATA versioon on:   ACS-4 T13/BSR INCITS 529 revision 5
SATA versioon on:  SATA 3.1, 6.0 Gb/s (praegu: 3.0 Gb/s)
Kohalik aeg on:    Teisipäev, 19. november 2019 01:48:50 MSK
SMART tugi on:    Saadaval - seade omab SMART võimet.
SMART tugi on:    Lubatud

=== ALUSTAME SMART ANDME LUGEMISE SEKTSIOONI ===
SMART üldise tervise enesehindamise testitulemus: JÄETUD KANDIDEERIMA

Üldised SMART väärtused:
Offline andmete kogumise staatus:  (0x00) Offline andmete kogumise tegevus
                                        ei ole kunagi alustatud.
                                        Automaatne Offline andmete kogumine: Keelatud.
Enese-testimise teostamise staatus:      (   0) Eelmine enese-testimise rutiin
                                        lõpetati
                                        vea või mitte pernahii enese- 
                                        testimist ei ole kunagi teostatud.
Kokkuvõtteks aeg Online 
data kogumiseks:                (    0) sekundit.
Offline andmete kogumise
võimed:                    (0x53) SMART teostada Offline kohe.
                                        Automaatne Offline andmete kogumise kaasa/ära tugi.
                                        Suspend Online kogumine uue
                                        käsu korral.
                                        Ei toetata Offline pinnaskannimist.
                                        Enese-testimine toetatud.
                                        Ei toetata edastus enese-testimist.
                                        Valikuline enese-testimine toetatud.
SMART võimed:            (0x0003) Salvestab SMART andmeid enne sisenemist
                                        energiasäästu režiimi.
                                        Toetab SMART automaatset salvestusaja.
Veakogumise võime:        (0x01) Veakogumine toetatud.
                                        Üldkasutusega logimist toetatud.
Lühike enese-testimise rutiin 
soovitatav jälgimisaeg:        (   2) minutit.
Pikendatud enese-testimise rutiin
soovitatav jälgimisaeg:        (  85) minutit.
SCT võimed:              (0x003d) SCT olek toetatud.
                                        SCT veakontrolli juhtimine toetatud.
                                        SCT funktsiooni juhtimine toetatud.
                                        SCT andme tabel toetatud.

SMART atribuutide andmestruktuuri versiooni number: 1
Müüja spetsiifilised SMART atribuudid koos künnisväärtustega:
ID# ATRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UUPDATED  KUI_VIGA RAW_VALUE
  5 Tagasi loetletud sektorite arv   0x0033   100   100   010    Enne rikke   Alati       -       0
  9 Kasutusaeg           0x0032   098   098   000    Vanus   Alati       -       5171
 12 Toite tsüklite arv       0x0032   099   099   000    Vanus   Alati       -       459
177 Kulumise tasakaalu arv     0x0013   096   096   000    Enne rikke   Alati       -       62
179 Kasutatud reserveeritud plokkide arvu kogus   0x0013   100   100   010    Enne rikke   Alati       -       0
181 Programmi vea kogust   0x0032   100   100   010    Vanus   Alati       -       0
182 Kustutamise vea kogust  0x0032   100   100   010    Vanus   Alati       -       0
183 Käitusse vigased plokkide arv       0x0013   100   100   010    Enne rikke   Alati       -       0
187 Parandamatute vigade arv 0x0032   100   100   000    Vanus   Alati       -       0
190 Õhuvoolu temperatuur Celsiuse järgi 0x0032   058   039   000    Vanus   Alati       -       42
195 ECC veateenuse määr          0x001a   200   200   000    Vanus   Alati       -       0
199 CRC viga kogust         0x003e   100   100   000    Vanus   Alati       -       0
235 POR taastamisarv      0x0012   099   099   000    Vanus   Alati       -       29
241 Koguväärtus, LBAd kirjutatud      0x0032   099   099   000    Vanus   Alati       -       38615215765

SMART veakirjeldus Versioon: 1
Ei ole logitud vigu

SMART enese-testimise logistruktuuri revision number 1
Ei ole logitud enese-testimist.  [Enese-testimiseks, kasutage: smartctl -t]

SMART valikuline enese-testimise logi andmestruktuuri revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Ei testita
    2        0        0  Ei testita
    3        0        0  Ei testita
    4        0        0  Ei testita
    5        0        0  Ei testita
Valikuline enese-testimise lipud (0x0):
  Pärast valitud ulatuste skannimist, EI LUGE skännida ketta ülejäänud osa.
Kui valikuline enese-testimine on ooterežiimis, jätkake pärast 0-minutilist viivitust.

Minu SSD salvestab kirjutatud andmete hulga parameetris 241 Total_LBAs_Written loogilistes blokkgades (LBA), mitte baitides. Minu juhul on loogilise bloki suurus 512 baiti (seda saab näha smartctl väljundis, sektorite suuruses). Baitide saamiseks tuleb parameetri väärtus korrutada 512-ga.

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

Programm skdump minu SSD püüab tõlgendada Total_LBAs_Written väärtust omamoodi, mistõttu väljastab ta 1296217.695 TB, mis on ilmselgelt vale.

Kandke andmete kirjutamise hulga määramiseks seadme tasemel kasutusele programm btrace komplektist blktrace'i. See näitab nii kogu statistikat programmi kogu tööaja jooksul kui ka üksikute protsesside ja lõimede (sealhulgas tuumade) kirjutamisprotsesse.

Käitage järgmist käsku, et koguda teavet 10 minuti jooksul, kus /dev/sdb on teie ketas:

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

Käsku tüüpiline väljund

…
  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):
 Ooteidud:           0,        0KiB  Kirjutamised Ooteidud:         345,   25,932KiB
 Ootevalu:        0,        0KiB  Kirjutamised:      331,   25,788KiB
 Ooteidud uuesti:         0               Kirjutamised uuesti:         0
 Ooteidud lõpetatud:        0,        0KiB  Kirjutamised lõpetatud:    1,597,  117,112KiB
 Ootepankad:            0,        0KiB  Kirjutamised pankade ühendused:            1,       16KiB
 Oote sügavus:             0               Kirjutamiste sügavus:           177
 IO lahtiühendamine:             0               Ajastuse lahtiühendamine:           0
CPU1 (8,16):
 Ooteidud:           0,        0KiB  Kirjutamised Ooteidud:         502,   39,948KiB
 Ootevalu:        0,        0KiB  Kirjutamised:      495,   40,076KiB
 Ooteidud uuesti:         0               Kirjutamised uuesti:         0
 Ooteidud lõpetatud:        0,        0KiB  Kirjutamised lõpetatud:        0,        0KiB
 Ootepankad:            0,        0KiB  Kirjutamised pankade ühendused:            0,        0KiB
 Oote sügavus:             0               Kirjutamiste sügavus:           177
 IO lahtiühendamine:             0               Ajastuse lahtiühendamine:           0
CPU2 (8,16):
 Ooteidud:           0,        0KiB  Kirjutamised Ooteidud:         297,   26,800KiB
 Ootevalu:        0,        0KiB  Kirjutamised:      287,   26,800KiB
 Ooteidud uuesti:         0               Kirjutamised uuesti:         0
 Ooteidud lõpetatud:        0,        0KiB  Kirjutamised lõpetatud:        0,        0KiB
 Ootepankad:            0,        0KiB  Kirjutamised pankade ühendused:            0,        0KiB
 Oote sügavus:             0               Kirjutamiste sügavus:           177
 IO lahtiühendamine:             0               Ajastuse lahtiühendamine:           0
CPU3 (8,16):
 Ooteidud:           0,        0KiB  Kirjutamised Ooteidud:         418,   24,432KiB
 Ootevalu:        0,        0KiB  Kirjutamised:      408,   24,448KiB
 Ooteidud uuesti:         0               Kirjutamised uuesti:         0
 Ooteidud lõpetatud:        0,        0KiB  Kirjutamised lõpetatud:        0,        0KiB
 Ootepankad:            0,        0KiB  Kirjutamised pankade ühendused:            2,      272KiB
 Oote sügavus:             0               Kirjutamiste sügavus:           177
 IO lahtiühendamine:             0               Ajastuse lahtiühendamine:           0

Kokku (8,16):
 Ooteidud:           0,        0KiB  Kirjutamised Ooteidud:       1,562,  117,112KiB
 Ootevalu:        0,        0KiB  Kirjutamised:    1,521,  117,112KiB
 Ooteidud uuesti:         0               Kirjutamised uuesti:         0
 Ooteidud lõpetatud:        0,        0KiB  Kirjutamised lõpetatud:    1,597,  117,112KiB
 Ootepankad:            0,        0KiB  Kirjutamised pankade ühendused:            3,      288KiB
 IO lahtiühendamine:             0               Ajastuse lahtiühendamine:           0

Läbilöök (R/W): 0KiB/s / 2,338KiB/s
Sündmused (8,16): 9,287 sissekannet
Vahelejätud: 0 edasi (0 -   0.0%)

btrace näitab selgelt salvestatud andmete tegelikku hulka, kuid on keeruline aru saada, millised programmid salvestavad, selle väljundi põhjal.

Programmide määramine, mis kirjutavad salvestusse

Programm iotop näitab protsesse, mis kirjutavad ketta peale, ja salvestatud andmete mahtu.
Kõige mugavamat väljundit tagavad järgmised parameetrid:

# iotop -obPat

Programmi väljundi näide

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

Silma järgi jääb silma Firefox, mis on salvestanud 283 megabaiti paari minuti jooksul iotop-i töötab.

Failide määramine, kuhu kirjutatakse

Teave protsessi kohta, mis koormab ketast — see on hea, kuid teave salvestuskohtade kohta on veel parem.

Kasutame programmi fatrace, mis jälgib failisüsteemi muudatusi.

# fatrace -f W

Programmi väljundi näide

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 ei suuda näidata kirjutatud andmete hulka, kuna see kasutab üsna lihtsat faili kasutamise jälgimist inotify kaudu.

Väljundist nähtub, kuidas habr salvestab minu artiklit brauseri kohaliku salvestusse, kuni ma seda kirjutan, samuti laiendust Group Speed Dial, mis, nagu selgus fatrace'i abiga, loeb oma andmeid iga 30 sekundi järel. Nimelt loeb, mitte ei kirjuta: CW Faili üle avamine räägib, et fail avatakse lugemiseks ja kirjutamiseks ning samal ajal luuakse fail, kui seda pole olemas (kutsutakse esile openat koos lipuga O_RDWR|O_CREAT), kuid ei ütle, et faili kirjutati tegelikult mingit teavet.

Igaks juhuks, et selles veenduda, kasutame strace'i koos failisüsteemi süsteemikutsungite filtriga:

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

Käskluse väljund

[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

Ühtegi kutsungit pole write(), mis näitab, et faili kirjutamist ei olnud.

Failisüsteemi overheadi määramine

Suur erinevus mõõtmistes iotop ja btrace ajendas mind katsetama failisüsteemi, kirjutades andmeid faili käsitsi ja jälgides btrace'i näitumisi.

Kui kirjutamine kettale täielikult välistada, käivitudes systemd hädaolukorraseisundis ja kirjutades käsitsi paar bait andmeid olemasolevasse faili, btrace SSD-l btrfs teatab kirjutamisest 3 megabaiti reaalne teave. Uues loodud failisüsteem USB-mälupangal, mille maht on 8 GB, salvestab vähemalt 264 KiB, kui salvestatakse üks bait.
Võrdluseks, paaribaitide salvestamine failile ext4 lõpeb 24 kilobaiti andmete salvestamisega kettale.

Aastal 2017 viibisid Jayashree Mohan, Rohan Kadekodi ja Vijay Chidambaram uurimus erinevate failisüsteemide salvestuse tugevdamisest, nende tulemused btrfs ja ext4 puhul 4 KB salvestamisel vastavad minu omadele.

Tuletame välja protsessid, millel on kettategevus Linuxis

Kokkuvõte ja järeldus

Esitatud toimingute käigus selgus:

  1. Prindi tööolekute sagedane salvestamine CUPS-i printimise deemoniga kaustas /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Andmebaasi lugemise fakt iga 30 sekundi järel Firefoxi laienemise Group Speed Dial jaoks;
  3. Erinevate jõudluse jälgimise teenuste perioodiline logi salvestamine Fedoral, mis viis mitme megabaidi andmete salvestamiseni btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Mitteolulise andmemahu salvestamisel btrfs-i kasutamisel tohutu amplifikatsioon.

Järeldus: btrfs-i ei tasu kasutada, kui programmid salvestavad sageli väikesi andmeliike (mõned kilobaitid), vastasel juhul lõpeb see megabaitide salvestamisega. See on eriti asjakohane ühesilindrilistele arvutitele, millel on OS MicroSD-l.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster