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 TiBDas 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/sdbTypische 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 -obPatBeispielausgabe 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 WBeispielausgabe 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.sqliteFatrace 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 extensionDie 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 , ihre Ergebnisse für btrfs und ext4 beim Schreiben von 4 KB stimmen mit meinen überein.

Fazit und Zusammenfassung
Durch die beschriebenen Manipulationen wurde festgestellt:
- Häufiges Schreiben von Statusinformationen der Druckaufträge durch den Druckdaemon CUPS in /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- Das Lesen der Datenbank alle 30 Sekunden durch die Erweiterung Group Speed Dial für Firefox;
- Periodische Protokollierung durch verschiedene Leistungsüberwachungsdienste in Fedora, was zu mehreren Megabyte an Daten auf btrfs führte: pmcd.service, pmie.service, pmlogger.service;
- 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
