Identifikujeme procesy s diskovou aktivitou v Linuxu

TL;DR: Článek popisuje pohodlný, rychlý a spolehlivý způsob, jak určit Linuxové programy, které zapisují data na disk, což pomáhá odhalit vysokou nebo abnormálně častou zátěž na diskovém subsystému, a také umožňuje vyhodnotit zátěž souborového systému. To je obzvláště aktuální pro SSD v PC, EMMC a flash paměti v jednodeskových počítačích.
Při psaní článku se ukázalo, že zápis několika kilobajtů dat do souborového systému BTRFS vede k zápisu 3 megabajtů skutečných dat na disk.

Úvod

„Ach, nesmysl, paměťové buňky na moderních SSD selžou za desítky let běžného používání, není třeba se o to obávat, a už vůbec ne přesouvat swap, virtuální stroje a složku profilu prohlížeče na HDD“ — typická odpověď na otázku o spolehlivosti SSD s garantovanými ≈150 TBW. Pokud odhadneme, kolik typický software může zapisovat, zdá se, že 10-20 GB za den je už velké číslo, ať je to maximálně 40 GB, kam víc. Při těchto číslech je odpověď celkem rozumná — je potřeba 10 let k dosažení garantovaných hodnot v počtu přepisovaných buněk, při 40 GB zapsaných dat denně.
Za 6 let však už používám třetí SSD: prvnímu selhal řadič, a druhý začal několikrát denně přesouvat data mezi buňkami, což vedlo k 30sekundovým zpožděním při obsluze zápisu.

Po 7 měsících používání nového SSD jsem se rozhodl zkontrolovat množství zapsaných dat, jak to disk hlásí prostřednictvím SMART.
19,7 TB.
Za 7 měsíců jsem využil 13 % z garantovaného množství zapsaných dat, přičemž je nastaven podle doporučení pro vyrovnání oddílů a nastavení FS, swap skoro nepoužívám, disky virtuálních strojů jsou umístěny na HDD!
To je abnormálně velké číslo, takovým tempem garantovaný TBW bude překročen dříve, než dosáhne 5leté záruky disku. A přece můj počítač nemůže zapisovat 93 gigabajtů denně! Musím zkontrolovat, kolik dat se zapisuje na disk za 10 minut…

Celkem:
Zapsané úkoly: 24 712, 2 237 MiB
Zapsané úkoly dokončeny: 25 507, 2 237 MiB
Zlúčení zápisů: 58, 5 472 KiB

2,2 GiB, wow!

Určování množství zapsaných dat na diskové zařízení

Pokud vaše zařízení podporuje S.M.A.R.T. (SSD, EMMC, některé průmyslové MicroSD), měli byste nejdříve vyžádat data z úložiště pomocí programů smartctl, skdump nebo mmc (součást mmc-utils).

Příklad výstupu programu smartctl

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

=== ZAČÁTEK SEKCE INFORMACÍ ===
Rodina modelů:     SSD na bázi Samsung
Model zařízení:     Samsung SSD 860 EVO mSATA 250GB
Sériové číslo:    S41MNC0KA13477K
Id zařízení LU WWN: 5 002538 e700fa64b
Verze firmwaru: RVT41B6Q
Uživatelská kapacita:    250 059 350 016 bajtů [250 GB]
Velikost sektoru:      512 bajtů logických/fyzických
Rychlost otáčení:    Solid State Device
Formát:      mSATA
Zařízení je:        V databázi smartctl [pro podrobnosti použijte: -P show]
Verze ATA:   ACS-4 T13/BSR INCITS 529 revize 5
Verze SATA:  SATA 3.1, 6.0 Gb/s (aktuální: 3.0 Gb/s)
Místní čas:    Út 19. listopadu 01:48:50 2019 MSK
Podpora SMART je:: K dispozici - zařízení má schopnost SMART.
Podpora SMART je: Zapnuta

=== ZAČÁTEK SEKCE ČTENÍ DAT SMART ===
Test výsledku sebehodnocení SMART: PROŠLO

Obecné hodnoty SMART:
Stav sběru offline dat:  (0x00) Aktivita sběru offline dat
                                        nikdy nezačala.
                                        Automatický sběr offline dat: Zakázán.
Stav provádění sebetestování:      (   0) Předchozí rutina sebetestování
                                        byla dokončena
                                        bez chyby nebo žádný sebetest dosud 
                                        nebyl proveden.
Celkový čas k dokončení sběru 
offline dat:                (    0) sekund.
Možnosti sběru offline dat:
                                        (0x53) Vykoná SMART offline okamžitě.
                                        Podpora zapnutí/vypnutí sběru
                                        offline dat.
                                        Pozastavení sběru offline dat při novém
                                        příkazu.
                                        Žádné vyšetřování povrchu offline nepodporováno.
                                        Sebetest podporován.
                                        Žádný sebetest převodu nepodporován.
                                        Výběrový sebetest podporován.
Schopnosti SMART:            (0x0003) Ukládá SMART data před vstupem
                                        do režimu úspory energie.
                                        Podporuje automatický časovač ukládání SMART.
Možnost protokolování chyb:        (0x01) Podporováno protokolování chyb.
                                        Podpora obecných účelů protokolování.
Doporučený čas pro krátkou rutinu sebetestování:        (   2) minuty.
Doporučený čas pro rozšířenou rutinu sebetestování:        (  85) minut.
Schopnosti SCT:              (0x003d) Podporován stav SCT.
                                        Podpora řízení obnovy chyb SCT.
                                        Podpora řízení funkcí SCT.
                                        Podpora datové tabulky SCT.

Verze struktury údajů atributů SMART: 1
Specifické atributy SMART výrobce s prahy:
ID# NÁZEV_ATTRIBUTU          FLAG     HODNOTA NEJHORŠÍ PRÁH TYP      AKTUALIZOVÁNO  KDY_ZKOMPLIKOVÁNO RAW_HODNOTA
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Před-chyba  Vždy       -       0
  9 Power_On_Hours          0x0032   098   098   000    Starý_vek   Vždy       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Starý_vek   Vždy       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Před-chyba  Vždy       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Před-chyba  Vždy       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Starý_vek   Vždy       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Starý_vek   Vždy       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Před-chyba  Vždy       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Starý_vek   Vždy       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Starý_vek   Vždy       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Starý_vek   Vždy       -       0
199 CRC_Error_Count         0x003e   100   100   000    Starý_vek   Vždy       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Starý_vek   Vždy       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Starý_vek   Vždy       -       38615215765

Verze protokolu chyb SMART: 1
Žádné chyby nezaregistrovány

Struktura protokolu sebetestování SMART revize 1
Žádné sebetesty nebyly registrovány.  [Pro spuštění sebetestů použijte: smartctl -t]

Struktura protokolu selektivního sebetestování SMART revize 1
 SPAN  MIN_LBA  MAX_LBA  STAV_AKTIVNÍHO_TESTU
    1        0        0  Ne_testuje se
    2        0        0  Ne_testuje se
    3        0        0  Ne_testuje se
    4        0        0  Ne_testuje se
    5        0        0  Ne_testuje se
Příznaky selektivního sebetestování (0x0):
  Po skenování vybraných úseků, NEOČEKÁVEJTE, že budete znovu skenovat zbytek disku.
Pokud je selektivní sebetestování v čekání při zapnutí, pokračujte po 0 minutovém zpoždění.

Můj SSD uchovává množství zapsaných dat v parametru 241 Total_LBAs_Written, ve logických blocích (LBA), a ne v bajtech. Velikost logického bloku je v mém případě 512 bajtů (to lze vidět ve výstupu smartctl v Sector Size). Abychom získali bajty, je třeba hodnotu parametru vynásobit 512.

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

Program skdump na mém SSD se snaží interpretovat hodnotu Total_LBAs_Written nějak po svém, což způsobuje, že vykazuje 1296217.695 TB, což je zřejmě nesprávně.

Abychom zjistili množství zapisovaných informací na úrovni zařízení, použijeme program btrace z balíčku blktrace. Tento program ukazuje jak celkovou statistiku za celou dobu provozu, tak jednotlivé procesy a vlákna (včetně jader), které prováděly zápis.

Spusťte následující příkaz pro sběr informací za 10 minut, kde /dev/sdb je váš disk:

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

Typický výstup příkazu

…
  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):
 Počet čtení v řadě:           0,        0KiB  Počet zápisů v řadě:         345,   25,932KiB
 Objednávky čtení:        0,        0KiB  Objednávky zápisů:      331,   25,788KiB
 Přesunuté čtení:         0               Přesunuté zápisy:         0
 Čtení dokončena:        0,        0KiB  Dokončené zápisy:    1,597,  117,112KiB
 Sloučení čtení:            0,        0KiB  Sloučení zápisů:            1,       16KiB
 Hloubka čtení:             0               Hloubka zápisů:           177
 Odpojení IO:             0               Odpojení časovače:           0
CPU1 (8,16):
 Počet čtení v řadě:           0,        0KiB  Počet zápisů v řadě:         502,   39,948KiB
 Objednávky čtení:        0,        0KiB  Objednávky zápisů:      495,   40,076KiB
 Přesunuté čtení:         0               Přesunuté zápisy:         0
 Čtení dokončena:        0,        0KiB  Dokončené zápisy:        0,        0KiB
 Sloučení čtení:            0,        0KiB  Sloučení zápisů:            0,        0KiB
 Hloubka čtení:             0               Hloubka zápisů:           177
 Odpojení IO:             0               Odpojení časovače:           0
CPU2 (8,16):
 Počet čtení v řadě:           0,        0KiB  Počet zápisů v řadě:         297,   26,800KiB
 Objednávky čtení:        0,        0KiB  Objednávky zápisů:      287,   26,800KiB
 Přesunuté čtení:         0               Přesunuté zápisy:         0
 Čtení dokončena:        0,        0KiB  Dokončené zápisy:        0,        0KiB
 Sloučení čtení:            0,        0KiB  Sloučení zápisů:            0,        0KiB
 Hloubka čtení:             0               Hloubka zápisů:           177
 Odpojení IO:             0               Odpojení časovače:           0
CPU3 (8,16):
 Počet čtení v řadě:           0,        0KiB  Počet zápisů v řadě:         418,   24,432KiB
 Objednávky čtení:        0,        0KiB  Objednávky zápisů:      408,   24,448KiB
 Přesunuté čtení:         0               Přesunuté zápisy:         0
 Čtení dokončena:        0,        0KiB  Dokončené zápisy:        0,        0KiB
 Sloučení čtení:            0,        0KiB  Sloučení zápisů:            2,      272KiB
 Hloubka čtení:             0               Hloubka zápisů:           177
 Odpojení IO:             0               Odpojení časovače:           0

Celkem (8,16):
 Počet čtení v řadě:           0,        0KiB  Počet zápisů v řadě:       1,562,  117,112KiB
 Objednávky čtení:        0,        0KiB  Objednávky zápisů:    1,521,  117,112KiB
 Přesunuté čtení:         0               Přesunuté zápisy:         0
 Čtení dokončena:        0,        0KiB  Dokončené zápisy:    1,597,  117,112KiB
 Sloučení čtení:            0,        0KiB  Sloučení zápisů:            3,      288KiB
 Odpojení IO:             0               Odpojení časovače:           0

Průchodnost (R/W): 0KiB/s / 2,338KiB/s
Události (8,16): 9,287 položek
Přeskočení: 0 vpřed (0 -   0.0%)

btrace Umožňuje jasně vidět skutečné množství zapsaných dat, ale pochopit, které konkrétní programy zapisují, je z jeho výstupu obtížné.

Určení programů, které zapisují na úložiště

Program iotop zobrazí procesy, které zapisují na disk, a velikost zapsaných dat.
Nejpohodlnější výstup zajišťují následující parametry:

# iotop -obPat

Příklad výstupu programu

02:55:47 Celkové ČTENÍ DISKU :       0.00 B/s | Celkové ZAPSANÉ NA DISK :      30.65 K/s
02:55:47 Skutečné ČTENÍ DISKU:       0.00 B/s | Skutečné ZAPSANÉ NA DISK:       0.00 B/s
    ČAS  PID  PRIO  UŽIVATEL     ČTENÍ DISKU  ZAPSANÉ NA DISK  SWAPIN      IO    PŘÍKAZ
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]'

Na první pohled padá do oka Firefox, který zapsal 283 megabajtů během několika minut provozu iotop.

Určení souborů, do kterých se zapisuje

Informace o procesu, který vykonává zápis na disk — to je dobré, ale cesty, kterými se zapisuje — to je ještě lepší.

Využijeme program fatrace, který sleduje změny v souborovém systému.

# fatrace -f W

Příklad výstupu programu

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 nedokáže zobrazit množství zapsaných dat kvůli používání poměrně jednoduchého sledování přístupu k souborům prostřednictvím inotify.

Z výstupu je vidět, jak Habr ukládá můj článek do místního úložiště prohlížeče, zatímco ho píšu, a také rozšíření Group Speed Dial, které, jak se podařilo zjistit právě pomocí fatrace, čte svá data každých 30 sekund. Opravdu čte, a ne zapisuje: CW Před souborem se uvádí, že soubor se otevírá pro čtení a zápis, přičemž se současně vytváří soubor, pokud neexistuje (volá se openat s příznakem O_RDWR|O_CREAT), ale není uvedeno, že by do souboru skutečně byla zapsána nějaká informace.

Pro jistotu, abychom se o tom ujistili, využijeme strace s filtrem na systémové volání souborů:

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

Výstup příkazu

[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

Nebylo provedeno žádné volání write(), což ukazuje na absenci zápisu do souboru.

Určení režijních nákladů souborového systému

Velký rozdíl ve výstupu iotop a btrace mě přivedl na myšlenku otestovat souborový systém ručním zápisem dat do souboru a sledováním výstupu btrace.

Pokud zcela vyloučím zápis na disk, když se načtu v nouzovém režimu systemd, a zapíšu ručně pár bajtů dat do existujícího souboru, btrace na SSD s btrfs hlásí zápis 3 megabajty skutečných dat. Čerstvě vytvořený souborový systém na flash disku o velikosti 8 GB zapisuje minimálně 264 KiB při zapsání jednoho bytu.
Pro srovnání, zápis dvou bytů do souboru na ext4 končí zápisem 24 kilobajtů dat na disk.

V roce 2017 provedli Jayashree Mohan, Rohan Kadekodi a Vijay Chidambaram výzkum posílení zápisu různých souborových systémů, jejichž výsledky pro btrfs a ext4 při zápisu 4 KB se vztahují k mým.

Identifikujeme procesy s diskovou aktivitou v Linuxu

Závěr a shrnutí

Pomocí popsaných manipulací bylo zjištěno:

  1. Častý zápis stavů úloh pro tiskárnu démonem tisku CUPS do /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Fakt čtení databáze každých 30 sekund rozšířením Group Speed Dial pro Firefox;
  3. Periodický zápis protokolů různými službami pro sledování výkonu ve Fedoře, což vedlo k zápisu několika megabajtů dat na btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Obrovské zesílení při zápisu malého množství dat při použití btrfs.

Závěr: není rozumné používat btrfs, pokud programy často zapisují malé množství dat (několik kilobajtů), jinak to povede k megabajtům zapsaných dat. To je obzvlášť důležité pro jednodeskové počítače s OS na MicroSD.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster