TL;DR: dit artikel bespreekt een gemakkelijke, snelle en betrouwbare manier om Linux-programma's te identificeren die gegevens naar de schijf schrijven, wat helpt bij het opsporen van hoge of abnormaal frequente belasting op het schijfsubsystemen, en ook om de overhead van het bestandssysteem in te schatten. Dit is vooral relevant voor SSD's in pc's, EMMC en Flash-geheugen in single-board computers.
Tijdens het schrijven van het artikel ontdekte ik dat het schrijven van enkele kilobytes aan gegevens naar het BTRFS-bestandssysteem resulteert in het schrijven van 3 megabytes aan werkelijke gegevens naar de schijf.
Inleiding
‘Oh, onzin, de geheugencellen van moderne SSD's gaan tientallen jaren mee bij normaal gebruik, maak je er geen zorgen over, laat staan het verplaatsen van swap, virtuele machines en de profielmap van de browser naar HDD’ — een typisch antwoord op de vraag over de betrouwbaarheid van solid-state drives met gegarandeerde ≈150 TBW. Als je schat hoeveel typisch software gegevens kan schrijven, lijkt 10-20 GB per dag al een groot cijfer, laten we zeggen maximaal 40 GB, meer moet niet kunnen. Met zulke cijfers lijkt het antwoord redelijk — het duurt 10 jaar om de gegarandeerde waarden voor het aantal herschrijvingen van cellen te bereiken, bij 40 GB aan geschreven gegevens per dag.
Echter, in de 6 jaar dat ik gebruik maak van mijn derde SSD: de eerste had een defecte controller, en de tweede begon meerdere keren per dag gegevens tussen cellen te verplaatsen, wat resulteerde in 30 seconden vertraging bij het verwerken van schijfbewerking.
Na 7 maanden gebruik van de nieuwe SSD besloot ik de hoeveelheid geschreven gegevens te controleren, zoals gerapporteerd door de schijf via SMART.
19,7 TB.
In totaal heb ik in 7 maanden tijd 13% van de gegarandeerde hoeveelheid geschreven gegevens gebruikt, terwijl hij is ingesteld volgens de aanbevelingen voor het uitlijnen van partities en de configuratie van het FS, swap wordt bijna niet gebruikt, de schijven virtuele machines staan op HDD!
Dit is een abnormaal hoog cijfer, bij deze snelheid zal de garantie TBW eerder worden overschreden dan dat de 5-jarige garantietermijn van de schijf is bereikt. Bovendien kan mijn computer niet zomaar 93 gigabyte per dag schrijven! Ik moet controleren hoeveel gegevens er in 10 minuten op de schijf worden geschreven…
Totaal:
Schrijfacties in de wachtrij: 24.712, 2.237MiB
Voltooide schrijfacties: 25.507, 2.237MiB
Schrijfsamenvoegingen: 58, 5.472KiB
2,2 GiB, wow!
Vaststellen van de hoeveelheid geschreven gegevens naar het opslagapparaat
Als je apparaat S.M.A.R.T. ondersteunt (SSD, EMMC, sommige industriële MicroSD), vraag dan als eerste de gegevens van de schijf op met de programma's smartctl, skdump of mmc (van de mmc-utils verzameling).
Voorbeeld van uitvoer van het programma smartctl
$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (lokale build)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
=== START VAN INFORMATIESECTIE ===
Model Familie: Samsung gebaseerde SSD's
Apparaatmodel: Samsung SSD 860 EVO mSATA 250GB
Serienummer: S41MNC0KA13477K
LU WWN Apparaat-ID: 5 002538 e700fa64b
Firmwareversie: RVT41B6Q
Gebruikerscapaciteit: 250 059 350 016 bytes [250 GB]
Sector Grootte: 512 bytes logisch/fysiek
Rotatie Snelheid: Solid State Device
Vormfactor: mSATA
Apparaat is: In smartctl database [voor details gebruik: -P show]
ATA Versie is: ACS-4 T13/BSR INCITS 529 revisie 5
SATA Versie is: SATA 3.1, 6.0 Gb/s (huidige: 3.0 Gb/s)
Locaal Tijd is: Di 19 nov 01:48:50 2019 MSK
SMART ondersteuning is: Beschikbaar - apparaat heeft SMART functionaliteit.
SMART ondersteuning is: Ingeschakeld
=== START VAN LEES SMART DATA SECTIE ===
SMART algehele gezondheid zelfevaluatie test resultaat: GESLAAGD
Algemene SMART Waarden:
Offline gegevensverzamelstatus: (0x00) Offline gegevensverzamelactiviteit
is nog nooit gestart.
Automatische Offline Gegevensverzameling: Uitgeschakeld.
Status van zelftestuitvoering: ( 0) De vorige zelftestroutine is beëindigd
zonder fout of er is nooit een zelftest uitgevoerd.
Totale tijd om Offline
gegevensverzameling te voltooien: ( 0) seconden.
Offline gegevensverzameling
mogelijkheden: (0x53) SMART voer Offline onmiddellijk uit.
Automatische Offline gegevensverzameling aan/uit ondersteuning.
Pauzeer Offline verzameling bij nieuwe
opdracht.
Geen Offline oppervlaktescan ondersteund.
Zelftest ondersteund.
Geen Overdracht Zelftest ondersteund.
Selectieve Zelftest ondersteund.
SMART mogelijkheden: (0x0003) Slaan SMART gegevens op voordat ze in
de energiebesparende modus gaan.
Ondersteunt SMART automatische opslagtimer.
Fout logging mogelijkheid: (0x01) Fout logging ondersteund.
Algemene logging ondersteund.
Korte zelftestroutine
aanbevolen polltijd: ( 2) minuten.
Uitgebreide zelftestroutine
aanbevolen polltijd: ( 85) minuten.
SCT mogelijkheden: (0x003d) SCT Status ondersteund.
SCT Fout Herstel Controle ondersteund.
SCT Kenmerk Controle ondersteund.
SCT Gegevens Tabel ondersteund.
SMART Attributen Gegevensstructuur revisienummer: 1
Vendor Specifieke SMART Attributen met Drempels:
ID# ATTRIBUT_NAAM VLAK WAARDE SLECHT DREMPEL TYPE BIJGEWERKT WANNEER_GEFAILD RAAD_GETAL
5 Herallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Altijd - 0
9 Aantal_Beschikbare_Uren 0x0032 098 098 000 Oud_leeftijd Altijd - 5171
12 Aantal_Kringels 0x0032 099 099 000 Oud_leeftijd Altijd - 459
177 Versleten_Niveau_Aantal 0x0013 096 096 000 Pre-fail Altijd - 62
179 Gebruikte_Event_Blok_Totaal 0x0013 100 100 010 Pre-fail Altijd - 0
181 Program_Fout_Aantal_Totaal 0x0032 100 100 010 Oud_leeftijd Altijd - 0
182 Wissen_Fout_Aantal_Totaal 0x0032 100 100 010 Oud_leeftijd Altijd - 0
183 Runtime_Vaak_Fout 0x0013 100 100 010 Pre-fail Altijd - 0
187 Onherstelbare_Fout_Aantal 0x0032 100 100 000 Oud_leeftijd Altijd - 0
190 Luchtstroom_Temperatuur_Cel 0x0032 058 039 000 Oud_leeftijd Altijd - 42
195 ECC_Fout_Tarief 0x001a 200 200 000 Oud_leeftijd Altijd - 0
199 CRC_Fout_Aantal 0x003e 100 100 000 Oud_leeftijd Altijd - 0
235 POR_Herstel_Aantal 0x0012 099 099 000 Oud_leeftijd Altijd - 29
241 Totaal_LBAs_Geschreven 0x0032 099 099 000 Oud_leeftijd Altijd - 38615215765
SMART Fout Log Versie: 1
Geen Fouten Gelogd
SMART Zelf-test logstructuur revisienummer 1
Geen zelftests zijn gelogd. [Om zelftests uit te voeren, gebruik: smartctl -t]
SMART Selectieve zelf-test loggegevensstructuur revisienummer 1
SPAN MIN_LBA MAX_LBA HUIDIGE_TEST_STATUS
1 0 0 Niet_aan_testen
2 0 0 Niet_aan_testen
3 0 0 Niet_aan_testen
4 0 0 Niet_aan_testen
5 0 0 Niet_aan_testen
Selectieve zelf-test vlaggen (0x0):
Na het scannen van geselecteerde segmenten, lees de rest van de schijf NIET.
Als Selectieve zelf-test in afwachting is bij opstarten, hervat na 0 minuten vertraging.Mijn SSD houdt het aantal geschreven gegevens bij in de parameter 241 Total_LBAs_Written, in logische blokken (LBA) en niet in bytes. De grootte van het logische blok in mijn geval is 512 bytes (dit is te zien in de output van smartctl, in Sector Size). Om bytes te krijgen, moet je de waarde van de parameter met 512 vermenigvuldigen.
38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 TB
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 TiBzal de metadata van het bestandssysteem overschrijven. Gebruik hiervoor het volgende commando: skdump mijn SSD probeert de waarde van Total_LBAs_Written op een bepaalde manier te interpreteren, waardoor het weergeeft 1296217.695 TB, wat blijkbaar niet juist is.
Om de hoeveelheid geschreven informatie op apparaatniveau te achterhalen, gebruiken we het programma btrace uit het pakket blktrace. Het toont zowel de totale statistieken voor de gehele draaitijd van het programma als afzonderlijke processen en threads (inclusief cores) die schrijfbewerkingen hebben uitgevoerd.
Voer de volgende opdracht uit om informatie over een periode van 10 minuten te verzamelen, waarbij /dev/sdb uw schijf is:
# btrace -w 600 -a write /dev/sdbTypische output van het commando
…
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):
Gelezen in de wachtrij: 0, 0KiB Geschreven in de wachtrij: 345, 25,932KiB
Lezen dispatches: 0, 0KiB Schrijven dispatches: 331, 25,788KiB
Gelezen opnieuw in de wachtrij: 0 Geschreven opnieuw in de wachtrij: 0
Gelezen voltooid: 0, 0KiB Geschreven voltooid: 1,597, 117,112KiB
Lezen samengevoegd: 0, 0KiB Schrijven samengevoegd: 1, 16KiB
Leesdiepte: 0 Schrijfdiepte: 177
I/O ontkoppelingen: 0 Timer ontkoppelingen: 0
CPU1 (8,16):
Gelezen in de wachtrij: 0, 0KiB Geschreven in de wachtrij: 502, 39,948KiB
Lezen dispatches: 0, 0KiB Schrijven dispatches: 495, 40,076KiB
Gelezen opnieuw in de wachtrij: 0 Geschreven opnieuw in de wachtrij: 0
Gelezen voltooid: 0, 0KiB Geschreven voltooid: 0, 0KiB
Lezen samengevoegd: 0, 0KiB Schrijven samengevoegd: 0, 0KiB
Leesdiepte: 0 Schrijfdiepte: 177
I/O ontkoppelingen: 0 Timer ontkoppelingen: 0
CPU2 (8,16):
Gelezen in de wachtrij: 0, 0KiB Geschreven in de wachtrij: 297, 26,800KiB
Lezen dispatches: 0, 0KiB Schrijven dispatches: 287, 26,800KiB
Gelezen opnieuw in de wachtrij: 0 Geschreven opnieuw in de wachtrij: 0
Gelezen voltooid: 0, 0KiB Geschreven voltooid: 0, 0KiB
Lezen samengevoegd: 0, 0KiB Schrijven samengevoegd: 0, 0KiB
Leesdiepte: 0 Schrijfdiepte: 177
I/O ontkoppelingen: 0 Timer ontkoppelingen: 0
CPU3 (8,16):
Gelezen in de wachtrij: 0, 0KiB Geschreven in de wachtrij: 418, 24,432KiB
Lezen dispatches: 0, 0KiB Schrijven dispatches: 408, 24,448KiB
Gelezen opnieuw in de wachtrij: 0 Geschreven opnieuw in de wachtrij: 0
Gelezen voltooid: 0, 0KiB Geschreven voltooid: 0, 0KiB
Lezen samengevoegd: 0, 0KiB Schrijven samengevoegd: 2, 272KiB
Leesdiepte: 0 Schrijfdiepte: 177
I/O ontkoppelingen: 0 Timer ontkoppelingen: 0
Totaal (8,16):
Gelezen in de wachtrij: 0, 0KiB Geschreven in de wachtrij: 1,562, 117,112KiB
Lezen dispatches: 0, 0KiB Schrijven dispatches: 1,521, 117,112KiB
Gelezen opnieuw in de wachtrij: 0 Geschreven opnieuw in de wachtrij: 0
Gelezen voltooid: 0, 0KiB Geschreven voltooid: 1,597, 117,112KiB
Lezen samengevoegd: 0, 0KiB Schrijven samengevoegd: 3, 288KiB
I/O ontkoppelingen: 0 Timer ontkoppelingen: 0
Doorvoersnelheid (R/W): 0KiB/s / 2,338KiB/s
Evenementen (8,16): 9,287 invoeren
Overslaan: 0 vooruit (0 - 0.0%) btrace maakt het mogelijk om op een visuele manier het werkelijke aantal geschreven gegevens te zien, maar het is moeilijk te begrijpen welke programma's schrijven op basis van de uitvoer.
Identificatie van programma's die naar de schijf schrijven
zal de metadata van het bestandssysteem overschrijven. Gebruik hiervoor het volgende commando: iotop zal de processen tonen die naar de schijf schrijven, evenals de hoeveelheid geschreven gegevens.
De handigste uitvoer wordt gegarandeerd door de volgende parameters:
# iotop -obPatVoorbeeld uitvoer van het programma
02:55:47 Totaal DISK LEZEN : 0.00 B/s | Totaal DISK SCHRIJVEN : 30.65 K/s
02:55:47 Werkelijk DISK LEZEN: 0.00 B/s | Werkelijk DISK SCHRIJVEN: 0.00 B/s
TIJD PID PRIO GEBRUIKER DISK LEZEN DISK SCHRIJVEN SWAPIN IO COMMANDO
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]'Het valt op dat Firefox 283 megabyte heeft geschreven in enkele minuten gebruik van iotop.
Identificatie van bestanden waarin wordt geschreven
Informatie over het proces dat de schijf belast - goed, maar de paden waarlangs wordt geschreven - nog beter.
Laten we het programma fatrace, dat wijzigingen in het bestandssysteem bijhoudt, gebruiken.
# fatrace -f WVoorbeeld uitvoer van het programma
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 kan de hoeveelheid geschreven data niet weergeven vanwege het gebruik van een vrij eenvoudige manier om toegang tot bestanden te volgen via inotify.
Uit de uitvoer blijkt hoe Habr mijn artikel opslaat in de lokale opslag van de browser terwijl ik het schrijf, evenals de extensie Group Speed Dial, die, zoals ik met behulp van fatrace ontdekte, zijn gegevens elke 30 seconden leest. Het leest, en schrijft niet: CW De boodschap vóór het bestand geeft aan dat het bestand geopend wordt voor lezen en schrijven, met tegelijkertijd het creëren van het bestand als het niet bestaat (openat wordt aangeroepen met de vlag O_RDWR|O_CREAT), maar geeft niet aan dat er daadwerkelijk informatie in het bestand is geschreven.
Voor alle zekerheid, laten we strace gebruiken met een filter op bestandsystemaanroepen:
strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extensionDe uitvoer van het commando
[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 Er zijn geen aanroepen write(), wat duidt op de afwezigheid van schrijfoperaties naar het bestand.
Bepaling van de overhead van het bestandssysteem
Grote verschillen in de metingen iotop en btrace doen me denken aan het testen van het bestandssysteem door handmatig gegevens naar een bestand te schrijven en de metingen met btrace te volgen.
Als we het schrijven naar de schijf volledig uitsluiten door op te starten in de emergency-modus van systemd en met de hand een paar byte data in een bestaand bestand schrijven, meldt btrace op de SSD met btrfs een schrijfoperatie van 3 megabyte werkelijke gegevens. Een nieuw aangemaakt bestandssysteem op een 8 GB flashstation schrijft minimaal 264 KiB bij het schrijven van één byte.
Ter vergelijking, het schrijven van een paar bytes naar een bestand op ext4 eindigt met het schrijven van 24 kilobytes aan gegevens naar de schijf.
In 2017 voerden Jayashree Mohan, Rohan Kadekodi en Vijay Chidambaram , hun resultaten voor btrfs en ext4 bij het schrijven van 4 KB zijn vergelijkbaar met de mijne.

Conclusie en bevindingen
Door de beschreven manipulaties werd ontdekt:
- Frequent schrijven van statusinformatie van taken door de CUPS-printdaemon naar /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Het feit dat de database elke 30 seconden wordt gelezen door de Group Speed Dial-extensie voor Firefox;
- Periodiek schrijven van logboeken door verschillende prestatiemonitoringsservices in Fedora, wat leidde tot het schrijven van enkele megabytes aan gegevens naar btrfs: pmcd.service, pmie.service, pmlogger.service;
- Enorme amplificatie bij het schrijven van kleine hoeveelheden gegevens bij gebruik van btrfs.
Conclusie: btrfs moet niet worden gebruikt als programma's vaak kleine hoeveelheden gegevens (enkele kilobytes) schrijven, anders resulteert dit in megabytes aan geschreven gegevens. Dit is vooral relevant voor single-board computers met een besturingssysteem op MicroSD.
Bron: habr.com
