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 TiBProgram 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/sdbTypický 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 -obPatPří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 WPří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.sqliteFatrace 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 extensionVý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 , jejichž výsledky pro btrfs a ext4 při zápisu 4 KB se vztahují k mým.

Závěr a shrnutí
Pomocí popsaných manipulací bylo zjištěno:
- Častý zápis stavů úloh pro tiskárnu démonem tisku CUPS do /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Fakt čtení databáze každých 30 sekund rozšířením Group Speed Dial pro Firefox;
- 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;
- 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
