Досліджуйте диск пише далі, щоб дізнатися, який процес записує на мій SSD


11

Я намагаюся мінімізувати записи диска на мій новий системний диск SSD. Я застряг з виведенням іостату:

~ > iostat -d 10 /dev/sdb
Linux 2.6.32-44-generic (Pluto)     13.11.2012  _i686_  (2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               8,60       212,67       119,45   21010156   11800488

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,00         0,00        40,00          0        400

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,70         0,00        18,40          0        184

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        28,80          0        288

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               2,20         0,00        32,80          0        328

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        23,20          0        232

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,40        19,20        42,40        192        424

Як я бачу, є записи в sdb. Як я можу вирішити, який процес пише?

Я знаю про iotop , але він не показує, до якої файлової системи можна отримати доступ.

Відповіді:


7

Далі використовується механізм скидання блоку віртуальної пам'яті ядра. Спочатку отримайте сценарій perl:

wget https://raw.githubusercontent.com/true/aspersa-mirror/master/iodump

Потім увімкніть дамп блоку:

echo 1 | sudo tee /proc/sys/vm/block_dump

І запустіть наступне:

while true; do sleep 1; sudo dmesg -c; done  | perl iodump

..і натисніть, Controlcщоб закінчити, ви побачите щось таке:

^C# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
jbd2/sda3-8            620         40          0         40          0 sda3
jbd2/sda1-8            323         21          0         21          0 sda1
#1                    4746         11          0         11          0 sda3
flush-8:0             2759          7          0          7          0 sda1, sda3
command-not-fou       9703          4          4          0          0 sda1
mpegaudioparse8       8167          2          2          0          0 sda3
bash                  9704          1          1          0          0 sda1
bash                  9489          1          0          1          0 sda3
mount.ecryptfs_       9698          1          1          0          0 sda1

І вимкніть дамп блоку, коли закінчите:

echo 0 | sudo tee /proc/sys/vm/block_dump

Дякуємо http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ за цю корисну інформацію.


10

Ви могли хоч би почати з iotop. Він не скаже вам, в яку файлову систему пишеться, але це дасть вам кілька процесів для дослідження.

sudo apt-get install iotop
sudo iotop

Він показує миттєве зчитування та запис диска та назву команди читання чи запису.

Якщо ви намагаєтеся впіймати процес, який записує нечасто, ви можете скористатися --accumulateопцією або записати висновок у файл:

sudo -i
iotop --batch > iotop_log_file

Очевидно, що запис файлу журналу відображатиметься в результатах, але ви також маєте змогу поздоровитись за іншими записами на диск.

До цього моменту ви зможете знайти деякі процеси, які підозрюються у кандидатах. У лівій колонці на iotop зображено під. Далі з’ясуйте, у який дескриптор файлу пише процес:

sudo -i
strace -p <pid> 2>&1 | grep write

Ви повинні побачити такий результат, коли процес пише:

write(1, "\n", 1)                       = 1
write(4, "test\n", 5)                   = 5
write(1, ">>> ", 4)                     = 4

Перший аргумент для написання - це дескриптор файлу. Ми, мабуть, шукаємо значення, що перевищують 2, тому що 0, 1 і 2 - це просто stdin, stdout і stderr. Дескриптор файлів 4 виглядає цікаво.

Тепер ви можете дізнатися, на який файл вказує дескриптор файлу:

lsof -p <pid>

Який повинен отримати вихід, як:

...
python  23908  rob  mem    REG    8,1    26258 8392656 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python  23908  rob    0u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    1u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    2u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    3w   REG   0,25      909 9049082 /home/rob/testfile
python  23908  rob    4w   REG   0,25       20 9049087 /home/rob/another_test_file

Подивіться на 4 колонку. 4wозначає, що дескриптор 4 файлів відкритий для запису, а файл є another_test_file.

Можливо, процес відкриє, записує, а потім закриває файл, і в цьому випадку lsof не показав би його. Ви можете наздогнати це:

strace -p <pid> 2>&1 | grep open

Я не знав про - accumulte Це дійсно класна особливість! Дуже дякую за це !!! Невдале перенаправлення виводу iotop - batch з UnicodeEncodeError: кодек "ascii" не може кодувати символи у позиції 92-99: порядковий не в діапазоні (128) у файлі "/usr/lib/pymodules/python2.6/iotop/ui. py ", рядок 405, refresh_display
— zuba

Я радий, що моя відповідь принаймні мала користь. Перенаправлення працює для мене; не впевнений, що можу це пояснити.
— Роб Фішер

Гаразд, я трохи пограв і виявив, що можу використовувати lsof та strace, щоб принаймні виконати достатньо детективної роботи, щоб зловити процеси запису на SSD. Сподіваємось, це нарешті відповідає на запитання, хоча, схоже, відповідь Коліна Іана Кінга простіше!
— Роб Фішер

1
Вибачте за пізню відповідь, я нічого не мав сказати, поки не зіграв зі страйсом. Дякую за інший розумний підхід, я проголосував. Мені було складно написати сценарій для його реалізації через невеликий досвід написання сценаріїв оболонок. Тому я обрав інше рішення. Дякуємо, що поділилися своїми знаннями!
— зуба

Має бути --accumulated, але для обміну стеками потрібно 6 символів, щоб прийняти редагування публікації.
— h__
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.