Identifikimi i proceseve me aktivitet disku në Linux

TL;DR: ky artikulli flet për një mënyrë të përshtatshme, të shpejtë dhe të besueshme për të përcaktuar programet Linux që shkruajnë të dhëna në disk, gjë që ndihmon në identifikimin e ngarkesave të mëdha ose anomalisht të shpeshta në nën-sistemin disk, si dhe në vlerësimin e kostove të sistemit të skedarëve. Kjo është veçanërisht e rëndësishme për SSD në PC, EMMC dhe memorien Flash në kompjuterët me një pllakë.
Gjatë shkruarjes së artikullit, u zbulua se shkrimi i disa kilobyteve të dhënash në sistemin e skedarëve BTRFS shkakton shkrimin e 3 megabyteve të dhënash reale në disk.

Hyrje

«O, është budallallëk, qelizat e memories në SSD-të moderne do të shkatërrohen pas dhjetëra vitesh përdorimi të zakonshëm, nuk ka arsye për t'u shqetësuar, dhe aq më pak për të transferuar swap, makinat virtuale dhe dosjen e profilit të shfletuesit në HDD» — një përgjigje tipike ndaj pyetjes për besueshmërinë e dysqeve të gjendjes solide me një garanci të ≈150 TBW. Nëse kalkulojmë se sa të dhëna mund të shkruajë një softuer tipik, duket se 10-20 GB në ditë është një numër i madh, le të mendojmë se maksimumi është 40 GB, çfarë më shumë. Me këto numra, përgjigjja duket mjaft e arsyeshme — nevojitet 10 vjet për të arritur vlerat e garantuara për numrin e rikthimeve të qelizave, me 40 GB të dhënash të shkruara çdo ditë.
Megjithatë, gjatë 6 viteve, unë kam përdorur tashmë SSD-në time të tretë: e para kishte dështuar kontrolluesi, dhe e dyta filloi të zhgënjente të dhënat midis qelizave disa herë në ditë, gjë që rezultoi në vonesa prej 30 sekondash në shërbimin e shkarkimit.

Pas 7 muajsh përdorimi të SSD-së së re, vendosa të kontrolloj numrin e të dhënave të shkruara, ashtu siç i raporton vetë disku përmes SMART.
19.7 TB.
Gjatë 7 muajve, kam përdorur 13% të numrit të garantuar të të dhënave të shkruara, për më tepër, ai është konfiguruar sipas rekomandimeve për rrafshimin e ndarjeve dhe konfigurimin e FS, swap-i im pothuajse nuk përdoret, disqet makinat virtuale janë të vendosura në HDD!
Ky është një numër anormalisht i madh, me këto ritme TBW e garantuar do të tejkalohet përpara se të arrijë 5 vjet garancie për diskin. Dhe kompjuteri im nuk mund të shkruajë 93 gigabyte në ditë! Duhet të kontrollojmë se sa të dhëna shkruhen në disk brenda 10 minutash…

Totali:
Shkruajtjet në pritje: 24,712, 2,237MiB
Shkruajtjet e përfunduara: 25,507, 2,237MiB
Bashkimet e shkruajtjeve: 58, 5,472KiB

2.2 GiB, oh wow!

Përcaktimi i sasisë së të dhënave të shkruara në pajisjen diskore

Nëse pajisja juaj mbështet S.M.A.R.T. (SSD, EMMC, disa MicroSD industriale), atëherë e para gjë që duhet bërë është të kërkoni të dhënat nga disku me programet smartctl, skdump ose mmc (nga grupi mmc-utils).

Shembuj të nxjerrjes së programit 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)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     SSD-të e bazuara në Samsung
Device Model:     Samsung SSD 860 EVO mSATA 250GB
Serial Number:    S41MNC0KA13477K
LU WWN Device Id: 5 002538 e700fa64b
Firmware Version: RVT41B6Q
User Capacity:    250 059 350 016 bytes [250 GB]
Sector Size:      512 bytes logjik/ fizik
Rotation Rate:    Pajisje SSD
Form Factor:      mSATA
Device is:        Në bazën e të dhënave smartctl [për detaje përdorni: -P show]
ATA Version is:   ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (aktuale: 3.0 Gb/s)
Local Time is:    Mar 19 Nënt 01:48:50 2019 MSK
SMART support is:: I disponueshëm - pajisja ka kapacitet SMART.
SMART support is: Aktivizuar

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: KALUAR

Vlerat Generale SMART:
Statusi i grumbullimit të të dhënave Offline:  (0x00) Aktiviteti i grumbullimit të të dhënave Offline
                                        nuk është nisur kurrë.
                                        Grumbullimi Automatik i të Dhënave Offline: I Çaktivizuar.
Statusi i ekzekutimit të vetë-testit:      (   0) Rutinë e mëparshme e vetë-testit përfundoi
                                        pa gabim ose nuk është kryer ndonjë vetë-test.
Koha totale për të përfunduar grumbullimin e të dhënave Offline:                (    0) sekonda.
Aftësitë e grumbullimit të të dhënave Offline:                    (0x53) SMART ekzekuto grumbullimin Offline të menjëhershëm.
                                        Grumbullimi automatik i të dhënave Offline në/on mbështetje.
                                        Përcakto grumbullimin Offline pas urdhrit të ri.
                                        Asnjë skanim të sipërfaqes Offline nuk mbështetet.
                                        Vetë-testi mbështetet.
                                        Asnjë Vetë-test i transportit nuk mbështetet.
                                        Vetë-test i zgjedhur i mbështetur.
Aftësitë SMART:            (0x0003) Ruaj të dhënat SMART para se të hysh
                                        në modalitetin e kursimit të energjisë.
                                        Mbështet orarin e ruajtjes automatike të SMART.
Kapaciteti i regjistrimit të gabimeve:        (0x01) Regjistrimi i gabimeve mbështetet.
                                        Regjistrimi i Qëllimeve të Përgjithshme mbështetet.
Koha e rekomanduar e ankesës për rutinën e vetë-testit të shkurtër:        (   2) minuta.
Koha e rekomanduar e ankesës për rutinën e vetë-testit të zgjeruar:        (  85) minuta.
Aftësitë SCT:              (0x003d) Statusi SCT mbështetet.
                                        Kontrolli i Rindërtimit të Gabimeve SCT mbështetet.
                                        Kontrolli i Karakteristikave SCT mbështetet.
                                        Tabela e të Dhënave SCT mbështetet.

Numri i rishikimeve të Strukturës së të Dhënave të Atributeve SMART: 1
Atributet SMART të markave me threshold:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Para-dështim  Gjithmonë       -       0
  9 Power_On_Hours          0x0032   098   098   000    Mosha e vjetër   Gjithmonë       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Mosha e vjetër   Gjithmonë       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Para-dështim  Gjithmonë       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Para-dështim  Gjithmonë       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Mosha e vjetër   Gjithmonë       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Mosha e vjetër   Gjithmonë       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Para-dështim  Gjithmonë       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Mosha e vjetër   Gjithmonë       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Mosha e vjetër   Gjithmonë       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Mosha e vjetër   Gjithmonë       -       0
199 CRC_Error_Count         0x003e   100   100   000    Mosha e vjetër   Gjithmonë       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Mosha e vjetër   Gjithmonë       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Mosha e vjetër   Gjithmonë       -       38615215765

Versioni i Regjistrit të Gabimeve SMART: 1
Asnjë Gabim të Regjistruar

Struktura e regjistrit të vetë-testit SMART e numrit të rishikimeve 1
Nuk janë regjistruar vetë-teste.  [Për të ekzekutuar vetë-testet, përdorni: smartctl -t]

Struktura e të dhënave të regjistrit të vetë-testit të zgjedhur SMART e numrit të rishikimeve 1
 SPAN  MIN_LBA  MAX_LBA  STATUSI AKTUAL_TESTIM
    1        0        0  Nuk_po_testohet
    2        0        0  Nuk_po_testohet
    3        0        0  Nuk_po_testohet
    4        0        0  Nuk_po_testohet
    5        0        0  Nuk_po_testohet
Flagat e vetë-testit të zgjedhura (0x0):
  Pas skenimit të shtrirjeve të zgjedhura, mos lexoni skanimin e mbetur të diskut.
Nëse vetë-testi i zgjedhur është duke pritur pas ndezjes, rifilloni pas 0 minutash vonese.

SSD im në ruan sasinë e të dhënave të shkruara në parametrin 241 Total_LBAs_Written, në blloqet logjikë (LBA), dhe jo në bajta. Madhësia e bllokut logjik në rastin tim është 512 bajtë (mund të shihet në daljen smartctl, në Sector Size). Për të marrë bajta, duhet të shumëzojmë vlerën e parametrin me 512.

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

Programi skdump në SSD-në time përpiqet të interpretojë vlerën Total_LBAs_Written në një mënyrë të vetën, duke u shkaktuar që të shfaqë 1296217.695 TB, që, është e qartë, është e pasaktë.

Për të zbuluar sasinë e informacionit të shkruar në nivelin e pajisjes, do të përdorim programin btrace nga paketa blktrace. Ai tregon si statistikën e përgjithshme për të gjitha kohët e funksionimit të programit, ashtu edhe proceset dhe thread-et e veçanta (përfshirë bllokadat), të cilat kanë kryer shkrimin.

Ekzekutoni komandën e mëposhtme për të mbledhur informacion për 10 minuta, ku /dev/sdb është disku juaj:

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

Dilja tipike e komandës

…
  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 tregon qartë sasinë reale të të dhënave të shkruara, por është e vështirë të kuptohet se cilat programe po shkruajnë nga nxjerrja e saj.

Përcaktimi i programeve që shkruajnë në ruajtës

Programi iotop do të tregojë proceset që shkruajnë në hard disk dhe madhësinë e të dhënave të shkruara.
Parametrat më të përshtatshëm për një dalje të qartë janë:

# iotop -obPat

Shembulli i daljes së programit

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

Kaq shumë bie në sy Firefox, i cili ka shkruar 283 megabajt brenda disa minutash që iotop ishte në veprim.

Përcaktimi i skedarëve ku po shkruhet

Informacioni për procesin që abuzon me diskun — është mirë, por edhe më mirë do të ishin rrugët ku po bëhet shkrimi.

Do të përdorim programin fatrace, i cili ndjek ndryshimet në sistemin e skedarëve.

# fatrace -f W

Shembulli i daljes së programit

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 nuk e mbështet shfaqjen e sasisë së të dhënave të shkruara për shkak të përdorimit të një ndjekjeje mjaft të thjeshtë të faktit të qasjes në skedarë përmes inotify.

Nga dalja tregohet se si habr ruan artikullin tim në ruajtjen lokale të shfletuesit ndërsa e shkruaj, si dhe shtesa Group Speed Dial, që u zbulua të lexojë të dhënat e saj çdo 30 sekonda. Në fakt, ajo lexon, e jo shkruan: CW para skedullin e skedullin e skedullin e skedullin e skedullin nj"period"(file)", me menyrë të krijohet, nëse ai nuk ekziston (thirrja openat me flakën O_RDWR|O_CREAT), por nuk tregon që në skedullin e dokumentit është shkruar ndonjë informacion.

Për çdo rast, për t'u siguruar për këtë, do të përdorim strace, me filtrin për thirrjet e sistemit të skedhës:

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

Dalja e komandës

[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

Nuk ka asnjë thirrje write(), që tregon për mungesën e të dhënave të shkruara në skedull.

Përkufizimi i kostove të sistemit të skedhës

Një diferencë e madhe në lexime iotop dhe btrace më shtyu të provonim sistemin e skedhës duke shkruar dorazi të dhëna në një skedull dhe duke ndjekur leximet e btrace.

Nëse e përjashtojmë plotësisht shkrimin në disk, duke u ngarkuar në modalitetin emergjent të systemd, dhe shkruajmë dorazi disa byte të dhënash në një skedull ekzistues, btrace në SSD me btrfs raporton për shkrimin 3 megabajt të dhënave reale. Sistemi i skedarëve të sapo krijuar në një flash drive prej 8 GB shkruan minimum 264 KiB kur shkruan një byte.
Për krahasim, shkrimi i një çifti byte në një skedar në ext4 përfundon me shkrimin e 24 kilobajtëve të dhënash në disk.

Në vitin 2017, Jayashree Mohan, Rohan Kadekodi dhe Vijay Chidambaram kryer një studim mbi përforcimin e shkrimit të sistemet e ndryshme të skedarëve, rezultatet e tyre për btrfs dhe ext4 kur shkruajnë 4 KB janë të lidhura me të mijat.

Identifikimi i proceseve me aktivitet disku në Linux

Përfundim dhe konkluzion

Dhe përmes manovrave të përshkruara u zbulua:

  1. Shkrimi i shpesh i shteteve të punëve për printerin nga demonsi i printimit CUPS në /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Fakti i leximit të bazës së të dhënave çdo 30 sekonda nga zgjerimi Group Speed Dial për Firefox;
  3. Shkrimi periodik i ditarëve nga shërbime të ndryshme për monitorimin e performancës në Fedora, i cili çonte në shkrimin e disa megabajt të dhënash në btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Një amplifikim i madh kur shkruhet një sasi të vogël të dhënash duke përdorur btrfs.

Përfundimi: nuk rekomandohet të pëdoresh btrfs nëse programet shkruajnë shpesh sasi të vogla të dhënash (disa kilobajtë), përndryshe kjo do të rezultojë në megabajt të dhënash të shkruara. Kjo është veçanërisht e rëndësishme për kompjuterët me një plackë që përdorin një sistem operativ në MicroSD.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster