Wir identifizieren Prozesse mit Festplattenaktivität in Linux

TL;DR: Der Artikel beschreibt eine einfache, schnelle und zuverlässige Methode zur Ermittlung von Linux-Programmen, die Daten auf die Festplatte schreiben. Dies hilft, große oder ungewöhnlich hohe Lasten auf das Disk-Subsystem zu erkennen und die Overhead-Kosten des Dateisystems zu bewerten. Dies ist besonders relevant für SSDs in PCs, EMMC und Flash-Speicher in Einplatinencomputern.
Im Verlauf des Schreibens des Artikels wurde festgestellt, dass das Schreiben mehrerer Kilobyte Daten auf das BTRFS-Dateisystem zu 3 Megabyte tatsächlicher Daten auf der Festplatte führt.

Einführung

„Oh, Quatsch, die Speichermodule moderner SSDs werden nach Jahrzehnten des normalen Gebrauchs ausfallen. Man braucht sich darüber keine Sorgen zu machen, und schon gar nicht sollte man Swap, virtuelle Maschinen und den Browser-Profilordner auf HDDs verlagern.“ – eine typische Antwort auf die Frage nach der Zuverlässigkeit von Solid-State-Laufwerken mit garantierten ≈150 TBW. Wenn man bedenkt, wie viel typischer Software Daten schreiben kann, scheint es, dass 10-20 GB pro Tag bereits viel sind, lassen wir es maximal 40 GB sein, mehr geht nicht. Bei solchen Zahlen ist die Antwort durchaus vernünftig – es dauert 10 Jahre, um garantierten Werte bezüglich der Anzahl der Zellenschreibvorgänge bei täglich 40 GB an geschriebenen Daten.
In den sechs Jahren, in denen ich SSDs benutze, habe ich bereits die dritte SSD: Bei der ersten ist der Controller ausgefallen, und die zweite begann, Daten mehrmals täglich zwischen den Zellen zu verschieben, was zu 30-sekündigen Verzögerungen beim Schreiben führte.

Nach 7 Monaten Nutzung der neuen SSD entschied ich mich, die Anzahl der geschriebenen Daten zu überprüfen, wie sie vom Laufwerk selbst über SMART angegeben werden.
19,7 TB.
In nur 7 Monaten habe ich 13 % der garantierten Schreibdatenmenge erreicht, obwohl sie gemäß den Empfehlungen zum Partition Alignment und zur Dateisystemkonfiguration eingerichtet ist; Swap wird von mir kaum genutzt, die Festplatten virtuellen Maschinen sind auf HDDs!
Das ist eine anomal hohe Zahl; bei diesem Tempo wird die garantierte TBW (Terabytes Written) früher als die 5-jährige Garantiezeit des Laufwerks erreicht. Mein Computer kann doch nicht 93 Gigabyte pro Tag schreiben! Ich sollte überprüfen, wie viele Daten in 10 Minuten auf die Festplatte geschrieben werden…

Gesamt:
Ausgeschriebene Writes: 24.712, 2.237MiB
Abgeschlossene Writes: 25.507, 2.237MiB
Write Merges: 58, 5.472KiB

2,2 GiB, wow!

Bestimmung der Anzahl der auf das Speichergerät geschriebenen Daten

Wenn Ihr Gerät S.M.A.R.T. unterstützt (SSD, EMMC, einige industrielle MicroSDs), sollten Sie zuerst die Daten vom Speicher mit Programmen anfordern smartctl, skdump oder mmc (aus den mmc-utils).

Beispielausgabe des Programms smartctl

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

=== BEGIN DER INFORMATIONSEBENE ===
Modellfamilie:     Samsung basierte SSDs
Gerätemodell:     Samsung SSD 860 EVO mSATA 250GB
Seriennummer:    S41MNC0KA13477K
LU WWN Geräte-ID: 5 002538 e700fa64b
Firmware-Version: RVT41B6Q
Benutzerkapazität:    250 059 350 016 Bytes [250 GB]
Sektorengröße:      512 Bytes logisch/physical
Drehzahl:    Solid State Device
Formfaktor:      mSATA
Gerät ist:        In der smartctl-Datenbank [für Details nutzen: -P show]
ATA-Version ist:   ACS-4 T13/BSR INCITS 529 Revision 5
SATA-Version ist:  SATA 3.1, 6.0 Gb/s (aktuell: 3.0 Gb/s)
Lokale Zeit ist:    Di Nov 19 01:48:50 2019 MSK
SMART-Unterstützung ist: Verfügbar - Gerät hat SMART-Fähigkeit.
SMART-Unterstützung ist: Aktiviert

=== BEGIN DER SMART-DATENLESUNG ===
SMART Gesamtgesundheits-Selbstbewertungstest Ergebnis: BESTANDEN

Allgemeine SMART-Werte:
Status der Offline-Datensammlung:  (0x00) Offline-Datensammlung wurde
                                        nie gestartet.
                                        Automatische Offline-Datensammlung: Deaktiviert.
Selbsttest-Ausführungsstatus:      (   0) Die vorherige Selbsttestroutine wurde
                                        ohne Fehler abgeschlossen oder es wurde
                                        niemals ein Selbsttest durchgeführt.
Gesamtzeit zur vollständigen Offline- 
Datensammlung:                (    0) Sekunden.
Offline-Datensammlung
Fähigkeiten:                    (0x53) SMART-Funktion sofort offline ausführen.
                                        Unterstützung für automatische Offline-Datensammlung ein-/ausschalten.
                                        Offline-Sammlung bei neuem
                                        Befehl pausieren.
                                        Kein Offline-Oberflächen-Scan unterstützt.
                                        Selbsttest unterstützt.
                                        Kein Übertragungs-Selbsttest unterstützt.
                                        Selektiver Selbsttest unterstützt.
SMART-Fähigkeiten:            (0x0003) Speichert SMART-Daten vor dem Eintritt in
                                        den Energiesparmodus.
                                        Unterstützt SMART-Autospeicher-Timer.
Fehlerprotokollierungsfähigkeit:        (0x01) Fehlerprotokollierung unterstützt.
                                        Allgemeine Protokollierung unterstützt.
Kurze Selbsttestroutine 
empfohlene Abfragezeit:        (   2) Minuten.
Erweiterte Selbsttestroutine
empfohlene Abfragezeit:        (  85) Minuten.
SCT-Fähigkeiten:              (0x003d) SCT-Status unterstützt.
                                        SCT-Fehlerbewältigungssteuerung unterstützt.
                                        SCT-Funktionssteuerung unterstützt.
                                        SCT-Datentabelle unterstützt.

SMART Attribut-Datenstruktur Revisionsnummer: 1
Herstellerspezifische SMART-Attribute mit Schwellenwerten:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Vorwarnung  Immer       -       0
  9 Power_On_Hours          0x0032   098   098   000    Alter   Immer       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Alter   Immer       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Vorwarnung  Immer       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Vorwarnung  Immer       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Alter   Immer       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Alter   Immer       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Vorwarnung  Immer       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Alter   Immer       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Alter   Immer       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Alter   Immer       -       0
199 CRC_Error_Count         0x003e   100   100   000    Alter   Immer       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Alter   Immer       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Alter   Immer       -       38615215765

SMART Fehlerprotokollversion: 1
Keine Fehler protokolliert

SMART Selbsttestprotokollstruktur Revisionsnummer 1
Keine Selbsttests wurden protokolliert.  [Um Selbsttests auszuführen, nutzen Sie: smartctl -t]

SMART Selektiver Selbsttestprotokoll-Datenstruktur Revisionsnummer 1
 SPAN  MIN_LBA  MAX_LBA  AKTUELLER_TEST_STATUS
    1        0        0  Nicht getestet
    2        0        0  Nicht getestet
    3        0        0  Nicht getestet
    4        0        0  Nicht getestet
    5        0        0  Nicht getestet
Selektive Selbsttest-Flags (0x0):
  Nach dem Scannen der ausgewählten Bereiche, lesen Sie NICHT den Rest der Festplatte aus.
Wenn ein selektiver Selbsttest beim Hochfahren aussteht, setzen Sie ihn nach 0 Minuten fort.

Mein SSD speichert die Anzahl der geschriebenen Daten im Parameter 241 Total_LBAs_Written in logischen Blöcken (LBA) und nicht in Bytes. Die Größe des logischen Blocks in meinem Fall beträgt 512 Bytes (dies kann im smartctl-Ausgabe unter Sektorgrößen gesehen werden). Um die Bytes zu erhalten, muss der Wert des Parameters mit 512 multipliziert werden.

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

Das Programm skdump Mein SSD versucht, den Wert von Total_LBAs_Written irgendwie anders zu interpretieren, was dazu führt, dass er ausgibt 1296217.695 TB, was offensichtlich inkorrekt ist.

Um die Menge der geschriebenen Informationen auf Gerätestufe zu ermitteln, verwenden wir das Programm btrace aus dem Paket blktrace. Es zeigt sowohl die Gesamtheit der Statistiken über die gesamte Betriebszeit des Programms als auch einzelne Prozesse und Threads (einschließlich Kerne), die Schreibvorgänge durchgeführt haben.

Führen Sie den folgenden Befehl aus, um Informationen für 10 Minuten zu sammeln, wobei /dev/sdb Ihre Festplatte ist:

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

Typische Ausgabe des Befehls

…
  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 zeigt anschaulich die tatsächliche Menge der aufgezeichneten Daten, aber es ist schwer zu verstehen, welche spezifischen Programme die Aufzeichnung vornehmen.

Identifizierung der Programme, die auf das Laufwerk schreiben

Das Programm iotop zeigt die Prozesse, die auf die Festplatte schreiben, und die Menge der aufgezeichneten Daten.
Die folgenden Parameter bieten die benutzerfreundlichsten Ausgaben:

# iotop -obPat

Beispielausgabe des Programms

02:55:47 Gesamter DISK Lesevorgang:       0,00 B/s | Gesamter DISK Schreibvorgang:      30,65 K/s
02:55:47 Tatsächlicher DISK Lesevorgang:       0,00 B/s | Tatsächlicher DISK Schreibvorgang:       0,00 B/s
    ZEIT  PID  PRIO  BENUTZER   DISK Lesevorgang  DISK Schreibvorgang  SWAPIN      IO    BEFEHL
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]'

Während der Nutzung von iotop sticht Firefox hervor, da es in nur wenigen Minuten 283 Megabyte verbraucht.

Bestimmung der Dateien, in die geschrieben wird

Informationen über den Prozess, der die Festplatte belastet – das ist gut, aber die Pfade, über die die Daten geschrieben werden, sind noch besser.

Lassen Sie uns das Programm fatrace, welches die Änderungen im Dateisystem überwacht, verwenden.

# fatrace -f W

Beispielausgabe des Programms

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 kann die Menge der geschriebenen Daten aufgrund der recht einfachen Verfolgung des Zugriffs auf Dateien mit inotify nicht anzeigen.

Aus der Ausgabe ist ersichtlich, wie Habr meinen Artikel im lokalen Speicher des Browsers speichert, während ich ihn schreibe, sowie die Erweiterung Group Speed Dial, die, wie sich genau mit Fatrace herausfand, ihre Daten alle 30 Sekunden liest. Genauer gesagt liest sie, und schreibt nicht: CW Vor der Datei zeigt an, dass die Datei zum Lesen und Schreiben geöffnet wird, wobei gleichzeitig eine Datei erstellt wird, falls sie nicht vorhanden ist (wird mit openat mit den Flags O_RDWR|O_CREAT aufgerufen), sagt jedoch nicht, dass tatsächlich Informationen in die Datei geschrieben wurden.

Um sicherzugehen, verwenden wir strace mit einem Filter für Dateisystemaufrufe:

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

Die Ausgabe des Befehls

[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

Es gibt keinen Aufruf write(),, was auf das Fehlen eines Eintrags in die Datei hinweist.

Definition der Overheadkosten des Dateisystems

Ein großer Unterschied in den Messwerten iotop und btrace hat mich auf die Idee gebracht, das Dateisystem durch manuelles Schreiben von Daten in die Datei und Verfolgen der btrace-Messwerte zu testen.

Wenn man das Schreiben auf die Festplatte vollständig ausschließt, indem man in den Emergency-Modus von systemd bootet und manuell ein paar Bytes Daten in eine vorhandene Datei schreibt, berichtet btrace auf SSD mit btrfs über das Schreiben 3 Megabyte echter Daten. Ein frisch erstelltes Dateisystem auf einem 8 GB USB-Stick schreibt mindestens 264 KiB, wenn ein Byte geschrieben wird.
Im Vergleich dazu endet das Schreiben von ein paar Bytes in eine Datei auf ext4 mit dem Schreiben von 24 Kilobytes Daten auf die Festplatte.

Im Jahr 2017 führten Jayashree Mohan, Rohan Kadekodi und Vijay Chidambaram eine Studie über die Aufzeichnungseffizienz verschiedener Dateisysteme durch, ihre Ergebnisse für btrfs und ext4 beim Schreiben von 4 KB stimmen mit meinen überein.

Wir identifizieren Prozesse mit Festplattenaktivität in Linux

Fazit und Zusammenfassung

Durch die beschriebenen Manipulationen wurde festgestellt:

  1. Häufiges Schreiben von Statusinformationen der Druckaufträge durch den Druckdaemon CUPS in /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Das Lesen der Datenbank alle 30 Sekunden durch die Erweiterung Group Speed Dial für Firefox;
  3. Periodische Protokollierung durch verschiedene Leistungsüberwachungsdienste in Fedora, was zu mehreren Megabyte an Daten auf btrfs führte: pmcd.service, pmie.service, pmlogger.service;
  4. Enorme Amplifikation bei der Aufzeichnung einer kleinen Datenmenge bei der Verwendung von btrfs.

Fazit: btrfs sollte nicht verwendet werden, wenn Programme häufig kleine Datenmengen (einige Kilobyte) aufzeichnen, da dies zu mehreren Megabyte an aufgezeichneten Daten führt. Besonders relevant für Einplatinencomputer mit Betriebssystem auf MicroSD.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster