Я пытаюсь свести к минимуму количество операций записи на диск на моем новом системном диске SSD. Я застрял с выводом iostat:
~ > 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 , но он не показывает, к какой файловой системе обращаются.
Вы могли бы по крайней мере начать с iotop. Он не скажет вам, какая файловая система пишется, но даст вам некоторые процессы для исследования.
sudo apt-get install iotop
sudo iotop
Показывает мгновенное чтение и запись на диск и название команды чтения или записи.
Если вы пытаетесь перехватить процесс, который пишет редко, вы можете использовать опцию --accumulate
или записать вывод в файл:
sudo -i
iotop --batch > iotop_log_file
Очевидно, что запись файла журнала будет отображаться в результатах, но вы также должны иметь возможность grep для других процессов записи на диск.
К этому моменту вы сможете найти несколько возможных подозрительных процессов. Левый столбец в iotop показывает pid. Затем выясните, в какой файловый дескриптор записывает процесс:
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
Далее используется механизм дампа блока виртуальной памяти ядра. Сначала получите скрипт 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
.. и нажмите Управляя kbd> c kbd>, чтобы закончить, вы увидите что-то вроде следующего:
^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/ за эту полезную информацию. Информация.