Досліджуйте диск пише далі, щоб дізнатися, який процес записує на мій 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.