Identifiera processer med diskaktivitet i Linux

TL;DR: Artikeln handlar om ett bekvÀmt, snabbt och pÄlitligt sÀtt att identifiera Linux-program som skriver data till disken, vilket hjÀlper till att upptÀcka hög eller onormalt frekvent belastning pÄ disksystemet, samt gör det möjligt att utvÀrdera filsystemets overhead. Detta Àr sÀrskilt relevant för SSD:er i PC, EMMC och Flash-minne i enkortsdatorer.
Under skrivandet av artikeln upptÀcktes att skrivning av flera kilobyte data till filsystemet BTRFS leder till att 3 megabyte verklig data skrivs till disken.

Introduktion

“Åh, nonsense, minnescellerna pĂ„ moderna SSD:er kommer att gĂ„ sönder efter tiotals Ă„r av vanlig anvĂ€ndning, sĂ„ du behöver inte oroa dig, och absolut inte flytta swap, virtuella maskiner och webblĂ€sarens profilsmappar till HDD” — ett typiskt svar pĂ„ frĂ„gan om tillförlitligheten hos solid-state-enheter med garanterade ≈150 TBW. Om man uppskattar hur mycket typisk mjukvara kan skriva data, sĂ„ verkar 10-20 GB per dag redan vara en stor siffra, lĂ„t det vara maximalt 40 GB, hur mer kan man skriva? Med sĂ„dana siffror Ă€r svaret helt rimligt — man behöver 10 Ă„r för att nĂ„ garanterade vĂ€rden för antalet över skrivningar av celler, med 40 GB skrivna data varje dag.
Men efter 6 Är anvÀnder jag redan min tredje SSD: den första fick en trasig kontroller, och den andra började flytta data mellan cellerna flera gÄnger om dagen, vilket resulterade i 30-sekunders latens i skrivhanteringen.

Efter 7 mÄnader med den nya SSD:en bestÀmde jag mig för att kontrollera mÀngden skrivna data, som rapporteras av disken via SMART.
19.7 TB.
Totalt under 7 mÄnader har jag anvÀnt 13% av det garanterade antalet skrivna data, medan den Àr instÀlld enligt rekommendationerna för att jÀmna ut partitioner och stÀlla in filsystem, jag anvÀnder nÀstan ingen swap, diskarna virtuella maskiner Àr placerade pÄ HDD!
Detta Ă€r en onormalt stor siffra, i den takten kommer det garanterade TBW att överskridas innan 5-Ă„rs garantiavtalet för disken uppnĂ„s. Och min dator kan inte skriva 93 gigabyte per dag! Jag behöver kolla hur mycket data som skrivs till disken pĂ„ 10 minuter


Totalt:
Skrivningar i kö: 24 712, 2 237 MiB
Skrivningar genomförda: 25 507, 2 237 MiB
Skrivningssammanfogningar: 58, 5 472 KiB

2.2 GiB, wow!

BestÀmma mÀngden skrivna data till lagringsenheten

Om din enhet stöder S.M.A.R.T. (SSD, EMMC, vissa industriella MicroSD), bör du först begÀra data frÄn lagringsenheten med programmen smartctl, skdump eller mmc (ur mmc-utils).

Exempel pÄ utdata frÄn programmet smartctl

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

=== BÖRJAN AV INFORMATIONSAVSNITTET ===
Modellfamilj:     Samsung-baserade SSD:er
Enhetsmodell:     Samsung SSD 860 EVO mSATA 250GB
Serienummer:    S41MNC0KA13477K
LU WWN Enhets-ID: 5 002538 e700fa64b
Firmware-version: RVT41B6Q
AnvĂ€ndarkapacitet:    250 059 350 016 byte [250 GB]
Sektorstorlek:      512 byte logiskt/fysiskt
Rotationshastighet:    Solid State-enhet
Formfaktor:      mSATA
Enheten Àr:        I smartctl-databasen [för detaljer anvÀnd: -P show]
ATA-version:   ACS-4 T13/BSR INCITS 529 revision 5
SATA-version:  SATA 3.1, 6.0 Gb/s (nuvarande: 3.0 Gb/s)
Lokal tid:    Tis Nov 19 01:48:50 2019 MSK
SMART-stöd Àr: TillgÀngligt - enheten har SMART-funktioner.
SMART-stöd Àr: Aktiverat

=== BÖRJAN AV LÄSNING AV SMART-DATAAVSNITTET ===
SMART:s övergripande hĂ€lsovĂ€rdering resultat av sjĂ€lvbedömning: GÅTT

AllmÀnna SMART-vÀrden:
Offline datainsamlingsstatus:  (0x00) Offline datainsamlingsaktivitet
                                        har aldrig pÄbörjats.
                                        Automatisk offline datainsamling: Inaktiverad.
SjÀlvtestens genomförandestatus:      (   0) Den föregÄende sjÀlvtestrutinen slutfördes
                                        utan fel eller inget sjÀlvtest har nÄgonsin 
                                        körts.
Total tid för att slutföra offline 
datainsamling:                (    0) sekunder.
Offline datainsamlings
funktioner:                    (0x53) SMART kör offline omedelbart.
                                        Automatisk offline datainsamling pÄ/av stöd.
                                        Pausa offline insamlingen vid ny
                                        kommando.
                                        Ingen offline ytsökning stöds.
                                        SjÀlvtest stöds.
                                        Ingen transport av sjÀlvtest stöds.
                                        Selektivt sjÀlvtest stöds.
SMART-egenskaper:            (0x0003) Sparar SMART-data innan den gÄr in i
                                        strömsparlÀge.
                                        Stöder SMART automatisk spara timer.
Felföljdsloggningskapabiliteter:        (0x01) Felföljdsloggning stöds.
                                        AllmÀn loggning stöds.
Kort sjÀlvtest-rutin 
rekommenderad polltid:        (   2) minuter.
Utökad sjÀlvtest-rutin
rekommenderad polltid:        (  85) minuter.
SCT-funktioner:              (0x003d) SCT-status stöds.
                                        SCT-felÄterstÀllningskontroll stöds.
                                        SCT-funktionskontroll stöds.
                                        SCT-datatabell stöds.

SMART-attributens datastruktur revideringsnummer: 1
Leverantörsspecifika SMART-attribut med trösklar:
ID# EGNAKTION_NAMN          FLAGGA     VÄRDE SÄMST TRÖSKEL TYP      UPPDATERAD  NÄR_FEL RAW_VÄRDE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-failure  Alltid       -       0
  9 Power_On_Hours          0x0032   098   098   000    Ålderdom   Alltid       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Ålderdom   Alltid       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Pre-failure  Alltid       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-failure  Alltid       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Ålderdom   Alltid       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Ålderdom   Alltid       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-failure  Alltid       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Ålderdom   Alltid       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Ålderdom   Alltid       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Ålderdom   Alltid       -       0
199 CRC_Error_Count         0x003e   100   100   000    Ålderdom   Alltid       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Ålderdom   Alltid       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Ålderdom   Alltid       -       38615215765

SMART-felloggar versionsnummer: 1
Inga fel loggade

SMART SjÀlvtest-loggstruktur revisionsnummer 1
Inga sjÀlvtester har loggats.  [För att köra sjÀlvtester, anvÀnd: smartctl -t]

SMART Selektiv sjÀlvtest-loggdata struktur revisionsnummer 1
 SPAN  MIN_LBA  MAX_LBA  AKTUELL_TEST_STATUS
    1        0        0  Ingen_testande
    2        0        0  Ingen_testande
    3        0        0  Ingen_testande
    4        0        0  Ingen_testande
    5        0        0  Ingen_testande
Selektiva sjÀlvtestflaggor (0x0):
  Efter att ha skannat utvalda spann, gör INTE lÀs-skan Äterstoden av disken.
Om selektivt sjÀlvtest vÀntar vid uppstart, Äteruppta efter 0 minuters försening.

Min SSD lagrar mÀngden skrivna data i parametern 241 Total_LBAs_Written, i logiska block (LBA), och inte i byte. Storleken pÄ det logiska blocket i mitt fall Àr 512 byte (det kan ses i smartctl-utdata, i Sector Size). För att fÄ byte mÄste man multiplicera vÀrdet pÄ parametern med 512.

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

Programmet skdump pÄ min SSD försöker att tolka vÀrdet av Total_LBAs_Written pÄ sitt eget sÀtt, vilket gör att den visar 1296217.695 TB, vilket uppenbarligen Àr felaktigt.

För att ta reda pÄ mÀngden skrivinformation pÄ enhetsnivÄ anvÀnder vi programmet btrace som ingÄr i paketet blktrace. Det visar bÄde allmÀn statistik under hela programmets drift och enskilda processer och trÄdar (inklusive kÀrnor) som utförde skrivningar.

Kör följande kommando för att samla information under 10 minuter, dÀr /dev/sdb Àr din disk:

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

Typisk utdata frÄn kommandot



  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 möjliggör en tydlig översikt över den verkliga mÀngden data som skrivits, men det Àr svÄrt att förstÄ vilka program som gör skrivningar utifrÄn dess utdata.

Identifiering av program som skriver till lagringsenheten

Programmet iotop visar processerna som skriver till disken och hur mycket data som skrivs.
De mest anvÀndarvÀnliga utdata ges av följande alternativ:

# iotop -obPat

Exempel pÄ programmets utdata

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

Det Àr slÄende att Firefox har skrivit 283 megabyte pÄ bara nÄgra minuter av iotops arbete.

Identifiering av filer som skrivs till

Information om processen som sliter pÄ disken Àr bra, men vÀgarna som skrivs till Àr Ànnu bÀttre.

Vi anvÀnder programmet fatrace, som spÄrar förÀndringar i filsystemet.

# fatrace -f W

Exempel pÄ programmets utdata

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 inte visa mÀngden data som skrivits pÄ grund av den relativt enkla spÄrningen av filÄtkomst genom inotify.

FrÄn utskriften framgÄr att Habr sparar min artikel i webblÀsarens lokal lagring medan jag skriver, samt tillÀgget Group Speed Dial som, som jag upptÀckte med hjÀlp av fatrace, lÀser sina data var 30:e sekund. Det Àr just lÀsning, inte skrivning: CW Innan filen anges att filen öppnas för bÄde lÀsning och skrivning, med skapandet av filen om den inte finns (openat anropas med flaggan O_RDWR|O_CREAT), men det anges inte att nÄgon information faktiskt skrivits till filen.

För sÀkerhets skull, för att sÀkerstÀlla detta, anvÀnder vi strace med en filter för filsystemanrop:

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

Kommandots utdata

[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

Det finns inga anrop write(), vilket tyder pÄ att det inte finns nÄgon skrivning till filen.

Definition av filsystemets overhead

Stor skillnad i mÀtningarna iotop och btrace ledde till att jag tÀnkte testa filsystemet genom att manuellt skriva data till filen och spÄra mÀtningarna med btrace.

Om du helt utesluter skrivning till disken genom att starta i emergency-lÀget för systemd och skriva manuellt ett par byte data till en befintlig fil, rapporterar btrace pÄ SSD med btrfs att det skrevs 3 megabyte verkliga data. Det nyinrÀttade filsystemet pÄ ett 8 GB USB-minne skriver minst 264 KiB vid skrivning av ett enda byte.
Som jÀmförelse avslutas skrivning av ett par byte i en fil pÄ ext4 med att 24 kilobyte data skrivs till disken.

År 2017 genomförde Jayashree Mohan, Rohan Kadekodi och Vijay Chidambaram en studie av skrivförstĂ€rkning i olika filsystem, deras resultat för btrfs och ext4 vid skrivning av 4 KB överensstĂ€mmer med mina.

Identifiera processer med diskaktivitet i Linux

Slutsats och utvÀrdering

Genom de beskrivna manipulationerna upptÀcktes:

  1. Frekvent skrivning av jobbstatusar för skrivaren av CUPS-demonen i /var/cache/cups ĐșĐ°Đ¶ĐŽŃƒŃŽ ĐŒĐžĐœŃƒŃ‚Ńƒ. ĐŸŃ€ĐŸĐ±Đ»Đ”ĐŒĐ° ŃƒŃŃ‚Ń€Đ°ĐœĐ”ĐœĐ° ĐŸŃ‡ĐžŃŃ‚ĐșĐŸĐč /var/spool/cups (Ń…ĐŸŃ‚Ń ĐœĐžĐșаĐșох Đ·Đ°ĐŽĐ°ĐœĐžĐč пДчатО ĐœĐ” Đ±Ń‹Đ»ĐŸ);
  2. Faktumet att databasen lÀses var 30:e sekunder av tillÀgget Group Speed Dial för Firefox;
  3. Periodisk skrivning av loggar av olika prestandaövervakningstjÀnster i Fedora, vilket ledde till att flera megabyte data skrevs till btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. En enorm förstÀrkning vid skrivning av en liten mÀngd data nÀr btrfs anvÀnds.

Slutsats: btrfs bör undvikas om program ofta skriver smÄ mÀngder data (nÄgra kilobyte), annars resulterar det i megabyte av skrivna data. Detta Àr sÀrskilt relevant för enkortsdatorer med operativsystem pÄ MicroSD.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster