Wir identifizieren Prozesse mit Festplattenaktivität in Linux

TL;DR: Der Artikel beschreibt eine bequeme, schnelle und zuverlässige Methode zur Bestimmung von Linux-Programmen, die Daten auf die Festplatte schreiben. Dies hilft, eine hohe oder anormale Belastung des Datenspeichersystems zu erkennen und die Betriebskosten des Dateisystems einzuschätzen. Dies ist besonders relevant für SSDs in PCs, EMMC und Flash-Speicher in Einplatinencomputern.
Während des Schreibens des Artikels stellte sich heraus, dass das Schreiben von mehreren Kilobyte Daten auf das BTRFS-Dateisystem dazu führt, dass 3 Megabyte tatsächlich auf die Festplatte geschrieben werden.

Einführung

„Ach, Unsinn, die Speichermodule moderner SSDs werden nach Jahrzehnten normaler Nutzung ausfallen, da muss man sich keine Sorgen machen, geschweige denn Swap, virtuelle Maschinen und den Profilordner des Browsers auf HDDs zu verschieben“ – typisch für die Antwort auf die Frage nach der Zuverlässigkeit von SSDs mit garantierten ≈150 TBW. Wenn man schätzt, wie viel typisches Software schreiben kann, scheint es, dass 10-20 GB pro Tag bereits eine große Zahl ist, vielleicht maximal 40 GB, mehr geht nicht. Bei solchen Zahlen ist die Antwort durchaus vernünftig – es braucht 10 Jahre, um die garantierten Werte hinsichtlich der Anzahl der Zellenüberschreibungen bei täglich 40 GB geschriebenen Daten zu erreichen.
Allerdings nutze ich seit 6 Jahren bereits meine dritte SSD: Bei der ersten fiel der Controller aus, und die zweite begann, Daten mehrere Male am Tag zwischen den Zellen zu verschieben, was zu 30-sekündigen Verzögerungen beim Schreiben führte.

Nach 7 Monaten Nutzung der neuen SSD beschloss ich, die Anzahl der geschriebenen Daten zu überprüfen, wie sie das Laufwerk selbst über SMART angibt.
19.7 TB.
Insgesamt habe ich in 7 Monaten 13 % der garantierten Anzahl an geschriebenen Daten verwendet, obwohl sie gemäß den Empfehlungen zur Partitionierung und zur Einstellung des Dateisystems konfiguriert ist. Swap wird bei mir fast nicht verwendet, die Festplatten virtuelle Maschinen sind auf HDDs platziert!
Das ist eine anormale große Zahl. In diesem Tempo wird die garantierte TBW vor Ablauf der 5-jährigen Garantie für die Festplatte überschritten. Mein Computer kann auch nicht 93 Gigabyte pro Tag schreiben! Ich muss überprüfen, wie viele Daten das Laufwerk in 10 Minuten schreibt…

Gesamt:
Anstehende Schreibvorgänge: 24.712, 2.237MiB
Abgeschlossene Schreibvorgänge: 25.507, 2.237MiB
Schreibzusammenführungen: 58, 5.472KiB

2.2 GiB, wow!

Bestimmung der Menge an geschriebenen Daten auf das Speichermedium

Wenn Ihr Gerät S.M.A.R.T. (SSD, EMMC, einige industrielle MicroSDs) unterstützt, sollten Sie zunächst die Daten vom Speichergerät mit Programmen anfordern smartctl, skdump oder mmc (aus dem Paket 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

=== START DER INFORMATIONSEDITION ===
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
Nutzerkapazität:    250 059 350 016 Bytes [250 GB]
Sektorgröße:      512 Bytes logisch/physisch
Drehzahl:        Solid State Gerät
Formfaktor:      mSATA
Gerät ist:        In der smartctl-Datenbank [für Details verwenden: -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 19. Nov 01:48:50 2019 MSK
SMART-Unterstützung ist: Verfügbar - das Gerät hat SMART-Fähigkeiten.
SMART-Unterstützung ist: Aktiviert

=== START DER SMART-DATENLESEBEREICH ===
SMART Gesamtgesundheits-Selbstbeurteilungstest-Ergebnis: BESTANDEN

Allgemeine SMART-Werte:
Offline-Datensammlung-Status:  (0x00) Offline-Datensammlung Aktivität
                                        wurde nie gestartet.
                                        Automatische Offline-Datensammlung: Deaktiviert.
Selbsttest-Ausführungsstatus:      (   0) Der vorherige Selbsttest-Vorgang wurde
                                        ohne Fehler abgeschlossen oder es wurde noch kein Selbsttest
                                        durchgeführt.
Gesamtzeit zum Abschluss der Offline-
Datensammlung:                (    0) Sekunden.
Offline-Datensammlung
Fähigkeiten:                    (0x53) SMART führt sofort Offline aus.
                                        Automatische Offline-Datensammlung ein/ausschalten unterstützt.
                                        Offline-Datensammlung bei neuen
                                        Befehlen aussetzen.
                                        Kein Offline-Oberflächen-Scan unterstützt.
                                        Selbsttest unterstützt.
                                        Kein Transport-Selbsttest unterstützt.
                                        Selektiver Selbsttest unterstützt.
SMART-Fähigkeiten:            (0x0003) Speichert SMART-Daten, bevor es in den
                                        Energiesparmodus wechselt.
                                        Unterstützt SMART-Autospeicher-Timer.
Fehlerprotokollierungsfähigkeit:        (0x01) Fehlerprotokollierung unterstützt.
                                        Allgemeine Protokollierung unterstützt.
Kurze Selbsttest-Routine
empfohlene Abfragedauer:        (   2) Minuten.
Erweiterte Selbsttest-Routine
empfohlene Abfragedauer:        (  85) Minuten.
SCT-Fähigkeiten:              (0x003d) SCT-Status unterstützt.
                                        SCT-Fehlerwiederherstellungskontrolle unterstützt.
                                        SCT-Feature-Control unterstützt.
                                        SCT-Datentabelle unterstützt.

SMART-Attributdatenstruktur-Version: 1
Herstellerspezifische SMART-Attribute mit Schwellenwerten:
ID# ATTRIBUT_NAME          FLAG     WERT SCHLECHTEST SCHWELLEN ART      AKTUALISIERT  BEI_FEHLER RWWERT
  5 Neukonfigurierte_Sektor_Ct   0x0033   100   100   010    Vorfehler  Immer       -       0
  9 Betriebsstunden          0x0032   098   098   000    Alter   Immer       -       5171
 12 Stromzyklus-Zähler       0x0032   099   099   000    Alter   Immer       -       459
177 Abnutzungsgrad-Zähler     0x0013   096   096   000    Vorfehler  Immer       -       62
179 Verwendete_reservierte_Blöcke_gesamt   0x0013   100   100   010    Vorfehler  Immer       -       0
181 Programmfehlgeschlagene_Gesamtzahl  0x0032   100   100   010    Alter   Immer       -       0
182 Löschfehlgeschlagene_Gesamtzahl  0x0032   100   100   010    Alter   Immer       -       0
183 Laufzeit_Bad_Block       0x0013   100   100   010    Vorfehler  Immer       -       0
187 Unkorrektierbare_Fehleranzahl 0x0032   100   100   000    Alter   Immer       -       0
190 Luftstrom_Temperatur_Cel 0x0032   058   039   000    Alter   Immer       -       42
195 ECC_Fehlerquote          0x001a   200   200   000    Alter   Immer       -       0
199 CRC_Fehleranzahl         0x003e   100   100   000    Alter   Immer       -       0
235 POR_Rückgewinnungsanzahl      0x0012   099   099   000    Alter   Immer       -       29
241 Gesamt_LBAs_geschrieben      0x0032   099   099   000    Alter   Immer       -       38615215765

SMART-Fehlerprotokollversion: 1
Keine Fehler protokolliert

SMART-Selbsttestprotokoll-Strukturversionsnummer 1
Es wurden keine Selbsttests protokolliert.  [Um Selbsttests durchzuführen, verwenden Sie: smartctl -t]

SMART Selektive Selbsttest-Protokoll-Datenstruktur-Versionsnummer 1
 SPAN  MIN_LBA  MAX_LBA  AKTUELLER_TEST_STATUS
    1        0        0  Nicht_testen
    2        0        0  Nicht_testen
    3        0        0  Nicht_testen
    4        0        0  Nicht_testen
    5        0        0  Nicht_testen
Selektive Selbsttest-Flags (0x0):
  Nach dem Scannen der ausgewählten Bereiche, NICHT den Rest der Festplatte lesen-scan.
Wenn ein selektiver Selbsttest beim Einschalten aussteht, nach 0 Minuten Verzögerung fortsetzen.

Mein SSD speichert die Menge der geschriebenen Daten im Parameter 241 Total_LBAs_Written, in logischen Blöcken (LBA) und nicht in Bytes. Die Größe des logischen Blocks beträgt in meinem Fall 512 Bytes (dies ist in der Ausgabe von smartctl im Sektorgröße sichtbar). Um 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

Programm skdump auf meinem SSD versucht, den Wert Total_LBAs_Written auf ihre eigene Weise zu interpretieren, weshalb es ausgibt 1296217.695 TB, was offensichtlich inkorrekt ist.

Um die Menge an geschriebenen Daten auf der Geräteschicht zu erfahren, verwenden wir das Programm btrace aus dem Paket blktrace. Es zeigt sowohl die allgemeine Statistik über die gesamte Laufzeit des Programms als auch einzelne Prozesse und Threads (einschließlich der Kerne), die Schreibvorgänge ausgeführt haben.

Führen Sie den folgenden Befehl aus, um Informationen über 10 Minuten zu sammeln, wobei /dev/sdb Ihr Laufwerk 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):
 Warteschlangen für Lesevorgänge:           0,        0KiB  Warteschlangen für Schreibvorgänge:         345,   25,932KiB
 Leseverarbeitungen:        0,        0KiB  Schreibverarbeitungen:      331,   25,788KiB
 Wiederholte Lesevorgänge:         0               Wiederholte Schreibvorgänge:         0
 Abgeschlossene Lesevorgänge:        0,        0KiB  Abgeschlossene Schreibvorgänge:    1,597,  117,112KiB
 Lesezusammenführungen:            0,        0KiB  Schreibzusammenführungen:            1,       16KiB
 Lese-Tiefe:             0               Schreib-Tiefe:           177
 IO-Unterbrechungen:             0               Timer-Unterbrechungen:           0
CPU1 (8,16):
 Warteschlangen für Lesevorgänge:           0,        0KiB  Warteschlangen für Schreibvorgänge:         502,   39,948KiB
 Leseverarbeitungen:        0,        0KiB  Schreibverarbeitungen:      495,   40,076KiB
 Wiederholte Lesevorgänge:         0               Wiederholte Schreibvorgänge:         0
 Abgeschlossene Lesevorgänge:        0,        0KiB  Abgeschlossene Schreibvorgänge:        0,        0KiB
 Lesezusammenführungen:            0,        0KiB  Schreibzusammenführungen:            0,        0KiB
 Lese-Tiefe:             0               Schreib-Tiefe:           177
 IO-Unterbrechungen:             0               Timer-Unterbrechungen:           0
CPU2 (8,16):
 Warteschlangen für Lesevorgänge:           0,        0KiB  Warteschlangen für Schreibvorgänge:         297,   26,800KiB
 Leseverarbeitungen:        0,        0KiB  Schreibverarbeitungen:      287,   26,800KiB
 Wiederholte Lesevorgänge:         0               Wiederholte Schreibvorgänge:         0
 Abgeschlossene Lesevorgänge:        0,        0KiB  Abgeschlossene Schreibvorgänge:        0,        0KiB
 Lesezusammenführungen:            0,        0KiB  Schreibzusammenführungen:            0,        0KiB
 Lese-Tiefe:             0               Schreib-Tiefe:           177
 IO-Unterbrechungen:             0               Timer-Unterbrechungen:           0
CPU3 (8,16):
 Warteschlangen für Lesevorgänge:           0,        0KiB  Warteschlangen für Schreibvorgänge:         418,   24,432KiB
 Leseverarbeitungen:        0,        0KiB  Schreibverarbeitungen:      408,   24,448KiB
 Wiederholte Lesevorgänge:         0               Wiederholte Schreibvorgänge:         0
 Abgeschlossene Lesevorgänge:        0,        0KiB  Abgeschlossene Schreibvorgänge:        0,        0KiB
 Lesezusammenführungen:            0,        0KiB  Schreibzusammenführungen:            2,      272KiB
 Lese-Tiefe:             0               Schreib-Tiefe:           177
 IO-Unterbrechungen:             0               Timer-Unterbrechungen:           0

Gesamt (8,16):
 Warteschlangen für Lesevorgänge:           0,        0KiB  Warteschlangen für Schreibvorgänge:       1,562,  117,112KiB
 Leseverarbeitungen:        0,        0KiB  Schreibverarbeitungen:    1,521,  117,112KiB
 Wiederholte Lesevorgänge:         0               Wiederholte Schreibvorgänge:         0
 Abgeschlossene Lesevorgänge:        0,        0KiB  Abgeschlossene Schreibvorgänge:    1,597,  117,112KiB
 Lesezusammenführungen:            0,        0KiB  Schreibzusammenführungen:            3,      288KiB
 IO-Unterbrechungen:             0               Timer-Unterbrechungen:           0

Durchsatz (L/W): 0KiB/s / 2,338KiB/s
Ereignisse (8,16): 9,287 Einträge
Überspringungen: 0 vorwärts (0 -   0,0%)

btrace Er ermöglicht einen anschaulichen Blick auf die tatsächliche Menge an aufgezeichneten Daten, es ist jedoch schwierig zu verstehen, welche Programme tatsächlich schreiben, aus ihrer Ausgabe.

Identifizierung der Programme, die auf das Speichermedium schreiben

Programm iotop wird die Prozesse zeigen, die auf die Festplatte schreiben, und die Größe der geschriebenen Daten.
Die bequemsten Ausgaben werden durch die folgenden Parameter gewährleistet:

# iotop -obPat

Beispielausgabe des Programms

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

Besonders auffällig ist Firefox, das in wenigen Minuten 283 Megabyte aufgenommen hat.

Identifizierung der Dateien, in die geschrieben wird

Informationen über den Prozess, der die Festplatte beansprucht – das ist gut, noch besser sind die Pfade, auf denen geschrieben wird.

Wir verwenden das Programm fatrace, das Änderungen im Dateisystem überwacht.

# 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 aufgrund der Verwendung einer recht einfachen Überwachung des Zugriffs auf Dateien über inotify nicht die Menge der geschriebenen Daten anzeigen.

Aus der Ausgabe ist zu erkennen, wie Habr meinen Artikel im lokalen Speicher des Browsers speichert, während ich ihn schreibe, sowie das Erweiterung Group Speed Dial, das, wie ich dank fatrace herausgefunden habe, alle 30 Sekunden auf seine Daten zugreift. Es liest die Daten, nicht schreibt. CW Vor der Datei wird gesagt, dass die Datei zum Lesen und Schreiben geöffnet wird, wobei gleichzeitig eine Datei erstellt wird, falls sie nicht vorhanden ist (aufgerufen mit openat mit dem Flag O_RDWR|O_CREAT), aber es wird nichts darüber gesagt, 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

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 einzigen Aufruf write(), was darauf hinweist, dass keine Daten in die Datei geschrieben wurden.

Bestimmung der Overheadkosten des Dateisystems

Eine große Diskrepanz in den Angaben iotop und btrace veranlasste mich, das Dateisystem zu testen, indem ich Daten manuell in eine Datei schreibe und die Werte mit btrace verfolge.

Wenn das Schreiben auf die Festplatte vollständig ausgeschlossen wird, indem ich im Emergency-Modus von systemd boote und manuell ein paar Bytes Daten in eine vorhandene Datei schreibe, gibt btrace auf SSD mit btrfs eine Schreiboperation von 3 Megabyte Echte Daten. Das neu erstellte Dateisystem auf einem 8-GB-USB-Stick schreibt mindestens 264 KiB, wenn ein Byte geschrieben wird.
Zum Vergleich endet das Schreiben eines Paars von Bytes in eine Datei auf ext4 mit dem Schreiben von 24 Kilobyte Daten auf die Festplatte.

Im Jahr 2017 führten Jayashree Mohan, Rohan Kadekodi und Vijay Chidambaram eine Untersuchung zur Verstärkung des Schreibvorgangs verschiedener Dateisysteme, deren Ergebnisse für btrfs und ext4 beim Schreiben von 4 KB mit meinen übereinstimmen.

Wir identifizieren Prozesse mit Festplattenaktivität in Linux

Schlussfolgerung und Fazit

Durch die beschriebenen Manipulationen wurde festgestellt:

  1. Häufige Speicherung von Statusinformationen von Druckaufträgen durch den CUPS-Druckdaemon in /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Die Tatsache, dass alle 30 Sekunden eine Datenbank durch die Erweiterung Group Speed Dial für Firefox gelesen wird;
  3. Periodisches Schreiben von Protokollen durch verschiedene Leistungsüberwachungsdienste in Fedora, was zu mehreren Megabyte an Daten auf btrfs führte: pmcd.service, pmie.service, pmlogger.service;
  4. Eine enorme Verstärkung beim Schreiben einer kleinen Datenmenge unter Verwendung von btrfs.

Fazit: Es ist nicht ratsam, btrfs zu verwenden, wenn Programme häufig kleine Datenmengen (einige Kilobyte) schreiben, da dies in Megabyte an geschriebenen Daten resultiert. Besonders relevant für Einplatinencomputer mit einem Betriebssystem auf MicroSD.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster