การระบุกระบวนการด้วยกิจกรรมของดิสก์ใน Linux

TL; DR: บทความนี้พูดถึงวิธีที่สะดวก รวดเร็ว และเชื่อถือได้ในการระบุโปรแกรม Linux ที่เขียนข้อมูลลงดิสก์ ซึ่งช่วยในการระบุโหลดขนาดใหญ่หรือบ่อยผิดปกติบนระบบย่อยของดิสก์ และยังช่วยให้คุณประมาณค่าใช้จ่ายของระบบไฟล์ได้ด้วย โดยเฉพาะอย่างยิ่งสำหรับ SSD ในพีซี, EMMC และหน่วยความจำแฟลชในคอมพิวเตอร์บอร์ดเดี่ยว
ในขณะที่เขียนบทความนี้ ฉันพบว่าการเขียนข้อมูลหลายกิโลไบต์ไปยังระบบไฟล์ BTRFS ส่งผลให้มีการเขียนข้อมูลจริง 3 เมกะไบต์ลงดิสก์

การแนะนำ

“โอ้ ไร้สาระ เซลล์หน่วยความจำบน SSD สมัยใหม่จะล้มเหลวหลังจากใช้งานปกติมานานหลายทศวรรษ ไม่ต้องกังวลกับมัน สลับการถ่ายโอน เครื่องเสมือน และโฟลเดอร์โปรไฟล์เบราว์เซอร์ไปยัง HDD น้อยลง” - คำตอบทั่วไปสำหรับคำถามเกี่ยวกับ ความน่าเชื่อถือของโซลิดสเตทไดรฟ์ที่รับประกัน 150 TBW หากคุณประมาณปริมาณข้อมูลที่ซอฟต์แวร์ทั่วไปสามารถเขียนได้ ดูเหมือนว่า 10-20 GB ต่อวันถือเป็นตัวเลขที่มากอยู่แล้ว ปล่อยให้มีได้สูงสุด 40 GB ซึ่งมากกว่านั้นมาก เมื่อพิจารณาจากตัวเลขเหล่านี้ คำตอบก็ค่อนข้างสมเหตุสมผล โดยต้องใช้เวลาถึง 10 ปีจึงจะบรรลุผล รับประกัน ค่าสำหรับจำนวนเซลล์ที่ถูกเขียนทับโดยมีข้อมูลที่บันทึกไว้ 40 GB ทุกวัน
อย่างไรก็ตาม ในรอบ 6 ปี ฉันใช้ SSD ตัวที่สามอยู่แล้ว คอนโทรลเลอร์ของอันแรกล้มเหลว และอันที่สองเริ่มย้ายข้อมูลระหว่างเซลล์หลายครั้งต่อวัน ซึ่งส่งผลให้บริการบันทึกล่าช้าไป 30 วินาที

หลังจากใช้ SSD ใหม่เป็นเวลา 7 เดือน ฉันตัดสินใจตรวจสอบปริมาณข้อมูลที่เขียน ตามที่ไดรฟ์รายงานผ่าน SMART
19.7 เทราไบต์
ในเวลาเพียง 7 เดือนฉันใช้ 13% ของจำนวนข้อมูลที่บันทึกไว้ที่รับประกันแม้ว่าจะมีการกำหนดค่าตามคำแนะนำสำหรับการจัดแนวพาร์ติชันและการตั้งค่า FS แต่ฉันแทบไม่เคยใช้ swap เลยดิสก์เครื่องเสมือนตั้งอยู่ บนฮาร์ดดิส!
ซึ่งเป็นตัวเลขที่มากผิดปกติ ในอัตรานี้ TBW การรับประกันจะเกินก่อนที่จะถึงระยะเวลาการรับประกันดิสก์ 5 ปี และคอมพิวเตอร์ของฉันไม่สามารถเขียนได้ 93 กิกะไบต์ต่อวัน! เราต้องตรวจสอบจำนวนข้อมูลที่ถูกเขียนลงดิสก์ภายใน 10 นาที...

Total:
Writes Queued: 24,712, 2,237MiB
Writes Completed: 25,507, 2,237MiB
Write Merges: 58, 5,472KiB

2.2 กิ๊บ โอ้โฮโฮ!

การกำหนดจำนวนข้อมูลที่เขียนลงในอุปกรณ์ดิสก์

หากอุปกรณ์ของคุณรองรับ SMART (SSD, EMMC, MicroSD อุตสาหกรรมบางรุ่น) สิ่งแรกที่คุณควรทำคือขอข้อมูลจากไดรฟ์โดยใช้โปรแกรม smartctl, skdump หรือ mmc (จาก mmc-utils)

ตัวอย่างเอาต์พุตจากโปรแกรม smartctl

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

=== START OF INFORMATION SECTION ===
Model Family:     Samsung based SSDs
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 logical/physical
Rotation Rate:    Solid State Device
Form Factor:      mSATA
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Tue Nov 19 01:48:50 2019 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                (    0) seconds.
Offline data collection
capabilities:                    (0x53) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        No Offline surface scan supported.
                                        Self-test supported.
                                        No Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        (  85) minutes.
SCT capabilities:              (0x003d) SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       5171
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       459
177 Wear_Leveling_Count     0x0013   096   096   000    Pre-fail  Always       -       62
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Always       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   058   039   000    Old_age   Always       -       42
195 ECC_Error_Rate          0x001a   200   200   000    Old_age   Always       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Always       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Old_age   Always       -       29
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       38615215765

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

SSD ของฉันจัดเก็บจำนวนข้อมูลที่เขียนในพารามิเตอร์ 241 Total_LBAs_Written ในรูปแบบลอจิคัลบล็อก (LBA) แทนที่จะเป็นไบต์ ขนาดของบล็อกลอจิคัลในกรณีของฉันคือ 512 ไบต์ (สามารถเห็นได้ในเอาต์พุต smartctl ในขนาดเซกเตอร์) หากต้องการรับไบต์ คุณต้องคูณค่าพารามิเตอร์ด้วย 512

38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 ТБ
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 ТиБ

โครงการ skdump บน SSD ของฉันมันพยายามตีความค่า Total_LBAs_Written ด้วยวิธีของมันเอง ซึ่งเป็นสาเหตุที่มันแสดง 1296217.695 TBซึ่งเห็นได้ชัดว่าไม่ถูกต้อง

หากต้องการทราบปริมาณข้อมูลที่บันทึกไว้ในระดับอุปกรณ์เราจะใช้โปรแกรม btrace จากแพ็คเกจ blktrace. โดยจะแสดงทั้งสถิติทั่วไปตลอดเวลาที่โปรแกรมทำงานอยู่ และแต่ละกระบวนการและเธรด (รวมถึงเคอร์เนล) ที่ทำการบันทึก

รันคำสั่งต่อไปนี้เพื่อรวบรวมข้อมูลภายใน 10 นาที โดยที่ /dev/sdb คือดิสก์ของคุณ:

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

เอาต์พุตคำสั่งทั่วไป

…
  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 ช่วยให้คุณเห็นจำนวนข้อมูลที่บันทึกจริงได้อย่างชัดเจน แต่เป็นการยากที่จะเข้าใจว่าโปรแกรมใดกำลังบันทึกจากเอาต์พุต

การกำหนดโปรแกรมที่เขียนลงไดรฟ์

โครงการ iotop จะแสดงกระบวนการเขียนลงดิสก์และขนาดของข้อมูลที่เขียน
เอาต์พุตที่สะดวกที่สุดได้มาจากพารามิเตอร์ต่อไปนี้:

# iotop -obPat

ตัวอย่างผลลัพธ์ของโปรแกรม

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

Firefox ดึงดูดสายตาคุณด้วยการบันทึก 283 เมกะไบต์ในเวลาไม่กี่นาทีของการทำงาน iotop

การกำหนดไฟล์ที่จะเขียน

ข้อมูลเกี่ยวกับกระบวนการที่ข่มขืนดิสก์นั้นดี แต่เส้นทางในการบันทึกนั้นดียิ่งขึ้น

เรามาใช้งานโปรแกรมกัน fatraceซึ่งติดตามการเปลี่ยนแปลงในระบบไฟล์

# fatrace -f W

ตัวอย่างผลลัพธ์ของโปรแกรม

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 ไม่สามารถแสดงจำนวนข้อมูลที่บันทึกไว้ได้เนื่องจากใช้การติดตามข้อเท็จจริงที่ว่ามีการเข้าถึงไฟล์ผ่าน inotify ที่ค่อนข้างง่าย

จากผลลัพธ์ คุณจะเห็นว่า Habr บันทึกบทความของฉันในที่จัดเก็บในตัวเครื่องของเบราว์เซอร์ในขณะที่ฉันเขียนได้อย่างไร รวมถึงส่วนขยาย Group Speed ​​​​Dial ซึ่งในขณะที่เราสามารถค้นพบโดยใช้ fatrace จะอ่านข้อมูลของมันทุกครั้ง 30 วินาที. มันอ่านไม่ใช่เขียน: CW ก่อนที่ไฟล์จะแจ้งว่าไฟล์นั้นถูกเปิดเพื่อการอ่านและการเขียน โดยมีการสร้างไฟล์พร้อมกันหากไฟล์นั้นหายไป (เรียกว่า openat พร้อมแฟล็ก O_RDWR|O_CREAT) แต่ไม่ได้บอกว่าข้อมูลใด ๆ ถูกเขียนลงในไฟล์จริง ๆ

ในกรณีนี้ เพื่อให้แน่ใจว่าสิ่งนี้ ลองใช้ strace พร้อมตัวกรองสำหรับการเรียกระบบไฟล์:

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

เอาต์พุตคำสั่ง

[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</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>
[pid 20352] read(153</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>, "SQLite format 3 20 22 @   d 23"..., 100) = 100
[pid 20352] read(153</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>, "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</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal>
…
[pid 20352] read(54</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>, " r4304364354354364-  4204!4'414" 250 &"..., 4096) = 4096
[pid 20352] read(54</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>, " 136Pt2262504 O24532016:"16.27 r245306>2461t1q370"..., 4096) = 4096
[pid 20352] close(77</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal>) = 0
[pid 20352] close(54</home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite>) = 0

ไม่มีการโทร write()ซึ่งแสดงว่าไม่มีรายการในไฟล์

การกำหนดโอเวอร์เฮดของระบบไฟล์

ความแตกต่างอย่างมากในการอ่าน iotop и btrace ให้แนวคิดแก่ฉันในการทดสอบระบบไฟล์โดยการเขียนข้อมูลลงในไฟล์ด้วยตนเองและตรวจสอบการอ่าน btrace

หากคุณแยกการเขียนลงดิสก์โดยสมบูรณ์โดยการบูตเข้าสู่โหมดฉุกเฉิน systemd และเขียนด้วยตนเอง สองสามไบต์ ข้อมูลไปยังไฟล์ที่มีอยู่ btrace ไปยัง SSD จาก btrfs รายงานการบันทึก 3 เมกะไบต์ ข้อมูลจริง ระบบไฟล์ที่สร้างขึ้นใหม่บนแฟลชไดรฟ์ขนาด 8 GB จะเขียนอย่างน้อย 264 KiB เมื่อเขียนหนึ่งไบต์
สำหรับการเปรียบเทียบ การเขียนสองสามไบต์ลงในไฟล์บน ext4 จะจบลงด้วยการเขียนข้อมูล 24 กิโลไบต์ลงดิสก์

ในปี 2017 Jayashree Mohan, Rohan Kadekodi และ Vijay Chidambaram ดำเนินการศึกษาการขยายการเขียนของระบบไฟล์ต่างๆผลลัพธ์สำหรับ btrfs และ ext4 ที่การเขียน 4KB นั้นสอดคล้องกับของฉัน

การระบุกระบวนการด้วยกิจกรรมของดิสก์ใน Linux

บทสรุปและการสรุป

มันถูกค้นพบจากกิจวัตรที่อธิบายไว้:

  1. การบันทึกสถานะงานเครื่องพิมพ์บ่อยครั้งโดย CUPS print daemon ไปที่ /var/แคช/ถ้วยทุกนาที ปัญหาได้รับการแก้ไขโดยการล้าง /var/ระวิง/cups (แม้ว่าจะไม่มีงานพิมพ์ก็ตาม);
  2. ความจริงที่ว่าฐานข้อมูลถูกอ่านทุก ๆ 30 วินาทีโดยส่วนขยาย Group Speed ​​​​Dial สำหรับ Firefox;
  3. การบันทึกเป็นระยะโดยบริการติดตามประสิทธิภาพต่างๆ ใน ​​Fedora ส่งผลให้มีการเขียนข้อมูลหลายเมกะไบต์ไปยัง btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. การขยายเสียงขนาดใหญ่เมื่อเขียนข้อมูลจำนวนเล็กน้อยโดยใช้ btrfs

สรุป: คุณไม่ควรใช้ btrfs หากโปรแกรมมักจะเขียนข้อมูลจำนวนเล็กน้อย (ไม่กี่กิโลไบต์) มิฉะนั้นจะส่งผลให้มีการเขียนข้อมูลเป็นเมกะไบต์ โดยเฉพาะอย่างยิ่งสำหรับคอมพิวเตอร์บอร์ดเดี่ยวที่มีระบบปฏิบัติการบน MicroSD

ที่มา: will.com

เพิ่มความคิดเห็น