Identificerer processer med diskaktivitet i Linux

TL;DR: Denne artikel beskriver en praktisk, hurtig og pålidelig metode til at identificere Linux-programmer, der skriver data til disk, hvilket hjælper med at opdage stor eller unormalt hyppig belastning på disksystemet, samt giver mulighed for at vurdere filsystemets omkostninger. Dette er især relevant for SSD'er i pc'er, EMMC og flashhukommelse i enkeltbundkort computere.
Under skrivningen af artiklen blev det opdaget, at skrivning af nogle få kilobyte data til BTRFS-filsystemet resulterer i, at 3 megabyte reelle data skrives til disk.

Introduktion

“Åh, det er nonsense, hukommelsescellerne på moderne SSD'er vil fejle efter årtier med normal brug, så det er ikke værd at bekymre sig om, og slet ikke at flytte swap, virtuelle maskiner og browserprofilmappen til HDD” – et typisk svar på spørgsmålet om pålideligheden af SSD'er med en garanti på ca. 150 TBW. Hvis man overvejer, hvor meget typisk software kan skrive af data, synes det som om 10-20 GB om dagen allerede er et stort tal, lad os sige maksimalt 40 GB, er det ikke mere. I sådanne tal er svaret ganske rimeligt – man skal bruge 10 år for at nå de garanterede værdier for antallet af omskrivninger af celler, ved 40 GB skrevne data dagligt.
Men på 6 år har jeg allerede brugt mit tredje SSD: den første fejlede kontrolle, og den anden begyndte at flytte data mellem cellerne flere gange om dagen, hvilket resulterede i 30 sekunders forsinkelser i skrivebehandlingen.

Efter 7 måneders brug af den nye SSD besluttede jeg at tjekke mængden af skrevne data, som den selv rapporterer gennem SMART.
19,7 TB.
I alt har jeg på 7 måneder brugt 13% af den garanterede mængde skrevne data, på trods af at den er konfigureret i henhold til anbefalingerne for at justere partitioner og indstille FS, swap bruges næsten ikke, og diskene virtual machines er placeret på HDD!
Det er et unormalt stort tal; i det tempo vil den garanterede TBW blive overskredet før afslutningen af den 5-årige garanti på disken. Og min computer kan bestemt ikke skrive 93 gigabyte om dagen! Jeg skal tjekke, hvor mange data der skrives til disken på 10 minutter …

Total:
Skriver i kø: 24.712, 2.237MiB
Skriver afsluttet: 25.507, 2.237MiB
Skrive sammenslutninger: 58, 5.472KiB

2,2 GiB, wow!

Bestemmelse af antallet af skrevne data til diskdrev

Hvis dit apparat understøtter S.M.A.R.T. (SSD, EMMC, nogle industrielle MicroSD'er), så bør du først anmode om data fra lagringsenheden med programmerne smartctl, skdump eller mmc (fra mmc-utils).

Eksempel på output fra 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 build)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== START AF INFORMATIONSDATA SEKTION ===
Model Family:     Samsung baserede SSD'er
Device Model:     Samsung SSD 860 EVO mSATA 250GB
Serial Number:    S41MNC0KA13477K
LU WWN Device Id: 5 002538 e700fa64b
Firmware Version: RVT41B6Q
User Capacity:    250 059 350 016 bytes [250 GB]
Sector Size:      512 bytes logisk/fysisk
Rotation Rate:    Solid State Device
Form Factor:      mSATA
Device is:        I smartctl-databasen [for detaljer brug: -P show]
ATA Version is:   ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (nuværende: 3.0 Gb/s)
Local Time is:    Tue Nov 19 01:48:50 2019 MSK
SMART support is: Er tilgængelig - enheden har SMART-funktion.
SMART support is: Aktiveret

=== START AF LÆSNING AF SMART DATA SEKTION ===
SMART samlet sundhed selvvurdering test resultat: BESTÅET

Generelle SMART værdier:
Offline dataindsamlingsstatus:  (0x00) Offline dataindsamlingsaktivitet
                                        blev aldrig startet.
                                        Automatisk Offline dataindsamling: Deaktiveret.
Selvtestudførselsstatus:      (   0) Den tidligere selvtestrutine blev
                                        fuldført uden fejl, eller ingen selvtest er nogensinde
                                        blevet udført.
Total tid til at fuldføre Offline 
dataindsamling:                (    0) sekunder.
Offline dataindsamlings
kapabiliteter:                    (0x53) SMART udfør Offline umiddelbart.
                                        Automatisk Offline dataindsamling on/off support.
                                        Suspendere Offline indsamling ved ny
                                        kommando.
                                        Ingen offline overfladeskanning understøttet.
                                        Selvtest understøttet.
                                        Ingen Conveyance Selvtest understøttet.
                                        Selektiv Selvtest understøttet.
SMART kapabiliteter:            (0x0003) Gemmer SMART data før indtastning
                                        i strømbesparende tilstand.
                                        Understøtter SMART automatisk gemme timer.
Fejlregistreringskapabilitet:        (0x01) Fejlregistrering understøttet.
                                        Generelt Formål Logging understøttet.
Kort selvtest rutine
anbefalet polling tid:        (   2) minutter.
Udvidet selvtest rutine
anbefalet polling tid:        (  85) minutter.
SCT kapabiliteter:              (0x003d) SCT Status understøttet.
                                        SCT Fejlgenopretningskontrol understøttet.
                                        SCT Funktion Kontrol understøttet.
                                        SCT Datatabel understøttet.

SMART Attributter Datastruktur revisionsnummer: 1
Leverandørspecifikke SMART Attributter med tærskler:
ID# ATTRIBUTE_NAME          FLAG     VALUE VÆRST TÆRSK TYPE      OPDATERET  HVIS_FEJL RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Altid       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Altid       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Altid       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Pre-fail  Altid       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Altid       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Altid       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Altid       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Altid       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Old_age   Altid       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Old_age   Altid       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Old_age   Altid       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Altid       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Old_age   Altid       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Altid       -       38615215765

SMART Fejllog Version: 1
Ingen fejl registreret

SMART Selvtest logstruktur revisionsnummer 1
Ingen selvtests er blevet registreret.  [For at køre selvtests, brug: smartctl -t]

SMART Selektiv selvtest logdata struktur revisionsnummer 1
 SPAN  MIN_LBA  MAX_LBA  NUVÆRENDE_TEST_STATUS
    1        0        0  Ikke_tester
    2        0        0  Ikke_tester
    3        0        0  Ikke_tester
    4        0        0  Ikke_tester
    5        0        0  Ikke_tester
Selektiv selvtestflags (0x0):
  Efter scanning af valgte intervaller, LÆS IKKE resterende disk.

Min SSD gemmer antallet af skrevne data i parameteren 241 Total_LBAs_Written, i logiske blokke (LBA), ikke i bytes. Størrelsen på den logiske blok i mit tilfælde er 512 bytes (det kan ses i output fra smartctl under Sektorstørrelse). For at få bytes skal værdien af parameteren ganges med 512.

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

Program skdump på min SSD forsøger at fortolke værdien af Total_LBAs_Written på sin egen måde, hvilket resulterer i 1296217.695 TB, hvilket åbenlyst er forkert.

For at finde ud af, hvor meget information der skrives på enheder, kan vi bruge programmet btrace fra pakken blktrace. Det viser både den samlede statistik over programmets samlede kørsel samt individuelle processer og tråde (inklusive kerner), der udførte skrivningen.

Kør følgende kommando for at samle information over 10 minutter, hvor /dev/sdb er din disk:

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

Typisk output fra kommandoen

…
  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 gør det muligt at se det faktiske antal skrevne data, men det er svært at forstå, hvilke specifikke programmer der udfører skrivningen ud fra outputtet.

Identifikation af programmer, der skriver til lagermediet

Program iotop viser de processer, der skriver til disken, og størrelsen af de skrevne data.
De mest nyttige output leveres af følgende parametre:

# iotop -obPat

Eksempel på programmets output

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 % 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 springer i øjnene, at Firefox har skrevet 283 megabyte på få minutters arbejde med iotop.

Identifikation af de filer, der skrives til

Information om processen, der slider på disken - godt, men oplysninger om de stier, hvorpå der skrives - endnu bedre.

Lad os bruge programmet fatrace, der overvåger ændringer i filsystemet.

# fatrace -f W

Eksempel på programmets output

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 ikke vise mængden af data, der er skrevet, da det bruger en ret simpel metode til at overvåge adgang til filer via inotify.

I outputtet kan man se, hvordan Habr gemmer min artikel i browserens local storage, mens jeg skriver den, samt udvidelsen Group Speed Dial, som, ved hjælp af fatrace, viser, at den læser sine data hver 30. sekund. Den læser, ikke skriver: CW Før filen indikerer, at filen åbnes til læsning og skrivning, samtidig med at filen oprettes, hvis den ikke eksisterer (openat kaldes med flaget O_RDWR|O_CREAT), men den angiver ikke, at der faktisk blev skrevet nogen information til filen.

For en sikkerheds skyld, for at være sikker på dette, bruger vi strace med filter på filsystemet kald:

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

Output fra kommandoen

[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

Ingen systemkald write(), hvilket indikerer, at der ikke er nogen skrivning til filen.

Bestemmelse af filsystemets overhead

Store forskelle i aflæsninger iotop og btrace gav anledning til at teste filsystemet ved manuelt at skrive data til filen og overvåge aflæsningerne med btrace.

Hvis skrivning til disken helt udelukkes ved at starte i systemd nødtilstand og skrive manuelt et par bytes data til en eksisterende fil, rapporterer btrace på SSD med btrfs at der skrives 3 megabyte virkelige data. Et nyoprettet filsystem på et 8 GB USB-drev skriver mindst 264 KiB ved at skrive ét byte.
Til sammenligning afsluttes skrivningen af et par bytes til en fil på ext4 med en dataoverførsel på 24 kilobyte til disken.

I 2017 udførte Jayashree Mohan, Rohan Kadekodi og Vijay Chidambaram en undersøgelse af skriveforstærkning i forskellige filsystemer, deres resultater for btrfs og ext4 ved skrivning af 4 KB stemmer overens med mine.

Identificerer processer med diskaktivitet i Linux

Konklusion og resultater

Gennem de beskrevne manøvrer blev det opdaget:

  1. Hyppig skrivning af jobstatusser for printere af CUPS dæmonen i /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Faktisk læsning af databasen hver 30. sekund af Group Speed Dial-udvidelsen til Firefox;
  3. Periodisk skrivning af logfiler af forskellige ydelser, der overvåger ydeevnen i Fedora, hvilket førte til skrivning af flere megabyte data på btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Kæmpe forstærkning ved skrivning af små mængder data ved brug af btrfs.

Konklusion: btrfs bør undgås, hvis programmer ofte skriver små mængder data (flere kilobyte), ellers vil det føre til megabyte af gemte data. Dette er især relevant for enkeltbundkort-computere med OS på MicroSD.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster