We onthullen processen met schrijfactiviteit in Linux

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 TiB

zal 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/sdb

Typische 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 -obPat

Voorbeeld 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 W

Voorbeeld 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.sqlite

Fatrace 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 extension

De 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 een onderzoek uit naar de versterking van het schrijven naar verschillende bestandssystemen, hun resultaten voor btrfs en ext4 bij het schrijven van 4 KB zijn vergelijkbaar met de mijne.

We onthullen processen met schrijfactiviteit in Linux

Conclusie en bevindingen

Door de beschreven manipulaties werd ontdekt:

  1. Frequent schrijven van statusinformatie van taken door de CUPS-printdaemon naar /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Het feit dat de database elke 30 seconden wordt gelezen door de Group Speed Dial-extensie voor Firefox;
  3. 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;
  4. 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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster