Идентифицираме процесите с дискова активност в Linux

TL;DR: статията разказва за удобен, бърз и надежден начин за определяне на Linux програми, които записват данни на диска, което помага за идентифициране на голямо или аномално натоварване на дисковата подсистема и също така позволява оценка на разходите на файловата система. Това е особено актуално за SSD в PC, EMMC и Flash памет в едноплаткови компютри.
В хода на написването на статията беше открито, че записването на няколко килобайта данни в файловата система BTRFS води до запис на 3 мегабайта реални данни на диска.

Въведение

„Ой, глупости, паметните клетки на съвременните SSD ще се повредят след десетилетия обикновена употреба, не си струва да се тревожите за това, а камо ли да прехвърляте swap, виртуални машини и папката за профил на браузъра на HDD” — типичен отговор на въпрос относно надеждността на твърдотелните устройства с гарантирани ≈150 TBW. Ако се опитате да изчислите колко данни може да запише типичен софтуер, изглежда, че 10-20 ГБ на ден е вече голямо число; нека бъде максимум 40 ГБ, къде повече от това. При такива цифри отговорът е напълно разумен — нужно е 10 години, за да се достигне гарантирани стойности по количество презаписвания на клетки, при 40 ГБ записани данни ежедневно.
Но през последните 6 години ползвам вече третия SSD: при първия се повреди контролерът, а вторият започна да прехвърля данни между клетките няколко пъти на ден, което доведе до 30-секундни забавяния при обслужването на записите.

След 7 месеца употреба на новия SSD реших да проверя количеството записани данни, както ги съобщава самият диск чрез SMART.
19.7 ТБ.
Общо за 7 месеца съм използвал 13% от гарантираното количество записани данни, при условие че е настроен съгласно препоръките за изравняване на разделите и настройване на ФС, swap почти не се използва, дисковете виртуални машини са разположени на HDD!
Това е аномално висока цифра; при тези темпове гаранционният TBW ще бъде надвишен преди достигането на 5-годишния гаранционен срок на диска. А и не може моят компютър да записва по 93 гигабайта на ден! Трябва да проверя колко данни се записват на диска за 10 минути…

Общо:
Изпратени записи: 24 712, 2 237MiB
Завършени записи: 25 507, 2 237MiB
Обединения на записи: 58, 5 472KiB

2.2 ГиБ, о-го-го!

Определяне на количеството записани данни на дисковото устройство

Ако вашето устройство поддържа S.M.A.R.T. (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] (местна компилация)
Авторски права (C) 2002-18, Брус Алън, Кристиан Франке, www.smartmontools.org

=== НАЧАЛО НА СЕКЦИЯТА ЗА ИНФОРМАЦИЯ ===
Семейство модел:     SSD на базата на Samsung
Модел устройство:     Samsung SSD 860 EVO mSATA 250GB
Сериен номер:        S41MNC0KA13477K
LU WWN Идентификатор на устройството: 5 002538 e700fa64b
Версия на фърмуера: RVT41B6Q
Потребителска капацитет: 250 059 350 016 байта [250 GB]
Размер на сектора:      512 байта логически/физически
Скорост на ротация:    Устройство с твърд диск
Формат:               mSATA
Устройството е:        В базата данни на smartctl [за подробности използвайте: -P show]
ATA Версия:         ACS-4 T13/BSR INCITS 529 ревизия 5
SATA Версия:        SATA 3.1, 6.0 Gb/s (текущ: 3.0 Gb/s)
Местно време:        Вт Ное 19 01:48:50 2019 MSK
Поддръжка на SMART:  Налична - устройството има SMART възможности.
Поддръжка на SMART:  Включена

=== НАЧАЛО НА СЕКЦИЯТА ЗА ЧЕТЕНЕ НА SMART ДАННИ ===
Резултат от теста за самооценка на общото здравословно състояние на SMART: ПРИЕТ

Общи SMART стойности:
Статус на събиране на офлайн данни:  (0x00) Дейността по събиране на офлайн данни
                                        никога не е започвана.
                                        Авто събиране на офлайн данни: Деактивирано.
Статус на изпълнение на само-теста:      (   0) Предишната рутина на само-теста е завършила
                                        без грешки или никога не е
                                        била изпълнявана.
Общо време за завършване на offline
събиране на данни:                (    0) секунди.
Възможности за събиране на офлайн данни:
                                (0x53) SMART изпълнява офлайн веднага.
                                        Поддръжка за авто събиране на офлайн данни.
                                        Спиране на офлайн събиране при нова
                                        команда.
                                        Няма поддръжка за офлайн повърхностен скан.
                                        Поддържа само-тест.
                                        Няма поддръжка за само-тест с пренос.
                                        Поддържа селективен само-тест.
Възможности на SMART:            (0x0003) Записва SMART данни преди да влезе
                                        в режим на пестене на енергия.
                                        Поддържа таймер за авто запазване на SMART.
Възможност за запис на грешки:        (0x01) Поддържа запис на грешки.
                                        Поддържа общо логване.
Препоръчително време за опит на краткия само-тест:        (   2) минути.
Препоръчително време за опит на разширения само-тест:        (  85) минути.
Възможности SCT:              (0x003d) Поддържа статус на SCT.
                                        Поддържа контрол на възстановяване на грешки SCT.
                                        Поддържа контрол на функции SCT.
                                        Поддържа таблица данни SCT.

Структурата на данни на атрибутите SMART ревизия номер: 1
Специфични за производителя атрибути SMART с прагове:
ID# ИМЕ_АТРИБУТ          ФЛАГ     СТОЙНОСТ НАЙ-ЛОШО ПРАГ ТИП      АКТУАЛИЗИРАН  КОГАТО_НЕУСПЕЕ  СУРОВА_СТОЙНОСТ
  5 Пренасочени_сектори   0x0033   100   100   010    Прекратена-неуспешна  Винаги       -       0
  9 Часове_електрическа_захранване          0x0032   098   098   000    Стари   Винаги       -       5171
 12 Брой_цикли_захранване       0x0032   099   099   000    Стари   Винаги       -       459
177 Брой_равнища_износ          0x0013   096   096   000    Прекратена-неуспешна  Винаги       -       62
179 Използвани_резервни_сектори   0x0013   100   100   010    Прекратена-неуспешна  Винаги       -       0
181 Брой_грешки_при_програмиране  0x0032   100   100   010    Стари   Винаги       -       0
182 Брой_грешки_при_изтриване  0x0032   100   100   010    Стари   Винаги       -       0
183 Лош_сектор_време       0x0013   100   100   010    Прекратена-неуспешна  Винаги       -       0
187 Брой_некоригируеми_грешки 0x0032   100   100   000    Стари   Винаги       -       0
190 Температура на въздуха_Cel 0x0032   058   039   000    Стари   Винаги       -       42
195 Степен на грешки_ECC          0x001a   200   200   000    Стари   Винаги       -       0
199 Брой_грешки_CRC         0x003e   100   100   000    Стари   Винаги       -       0
235 Брой_възстановявания_POR      0x0012   099   099   000    Стари   Винаги       -       29
241 Общо_написани_LBA      0x0032   099   099   000    Стари   Винаги       -       38615215765

Версия на лог файла на ошибки SMART: 1
Няма записани грешки

Структурата на лог файла на само-тест SMART ревизия номер 1
Не са записвани само-тестове. [За да стартирате само-тестове, използвайте: smartctl -t]

Структурата на лог данните на селективния само-тест SMART ревизия номер 1
 СПАН  МИНИМАЛЕН_LBA  МАКСИМАЛЕН_LBA  СТАТУС_НА_ТЕСТА_В_МOMЕНТА
    1        0        0  Не тества
    2        0        0  Не тества
    3        0        0  Не тества
    4        0        0  Не тества
    5        0        0  Не тества
Флагове на селективния само-тест (0x0):
  След сканиране на избраните спорове, НЕ четете-сканирайте оставащата част от диска.
Ако селективното само-тестиране е в чакане при включване на захранването, възобновете след 0 минути закъснение.

Моят SSD съхранява количеството записани данни в параметъра 241 Total_LBAs_Written, в логически блокове (LBA), а не в байтове. Размерът на логическия блок в моя случай е 512 байта (може да се види в изхода на smartctl, в Sector Size). За да получим байтове, трябва да умножим стойността на параметъра по 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 Общ прочит на диска :       0.00 B/s | Общ запис на диска :      30.65 K/s
02:55:47 Актуален прочит на диска:       0.00 B/s | Актуален запис на диска:       0.00 B/s
    ВРЕМЕ  PID  ПРИОРИТЕТ  ПОТРЕБИТЕЛ  ЧЕТЕНЕ НА ДИСК  ЗАПИС НА ДИСК  SWAPIN      IO    КОМАНДА
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.

От изхода е видно как Хабр запазва моята статия в локалното хранилище на браузъра, докато я пиша, както и разширението 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
[pid 20352] read(153, "SQLite формат 3 20 22 @   d 23"..., 100) = 100
[pid 20352] read(153, "SQLite формат 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

Няма нито едно повикване write(), което говори за отсъствие на запис в файла.

Определяне на разходите на файловата система

Голямата разлика в показанията iotop и btrace вдъхнови идеята да тествам файловата система, като ръчно запиша данни в файл и проследя показанията на btrace.

Ако напълно изключим записването на диск, зареждайки се в режим на спешност на systemd, и запишем ръчно няколко байта данни в съществуващ файл, btrace на SSD с btrfs показва запис 3 мегабайта реални данни. Новосъздадената файлова система на флаш памет с размер 8 ГБ записва минимум 264 КиБ при запис на един байт.
За сравнение, записването на чифт байтове в файл на ext4 завършва с запис на 24 килобайта данни на диска.

През 2017 г. Джаяшри Мохан, Рохан Кадекоди и Виджай Чидамбарам извършиха проучване на усилването на записите на различни файлови системи, а резултатите им за btrfs и ext4 при запис на 4 КБ съвпадат с моите.

Идентифицираме процесите с дискова активност в Linux

Заключение и извод

С помощта на описаните манипулации беше открито:

  1. Често записване на състояния на задания за печат от демона за печат CUPS в /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. Фактът за четене на базата данни на всеки 30 секунди чрез разширението Group Speed Dial за Firefox;
  3. Периодично записване на журнали от различни услуги за мониторинг на производителността в Fedora, което водеше до запис на няколко мегабайта данни на btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Огромно усилване при запис на малко количество данни при използване на btrfs.

Извод: не е целесъобразно да се използва btrfs, ако програмите често записват малки количества данни (няколко килобайта), иначе това ще доведе до мегабайти записани данни. Особено актуално е за едноплаткови компютри с ОС на MicroSD.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster