Selidiki disk menulis lebih lanjut untuk mengetahui proses menulis ke SSD saya

11

Saya mencoba meminimalkan penulisan disk ke drive sistem SSD baru saya. Saya terjebak dengan output 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

Seperti yang saya lihat ada menulis ke sdb. Bagaimana saya bisa menyelesaikan proses penulisan mana?

Saya tahu tentang iotop , tetapi tidak menunjukkan sistem file mana yang sedang diakses.

zuba
sumber

Jawaban:

7

Berikut ini menggunakan mekanisme dump blok memori virtual kernel. Pertama-tama dapatkan skrip perl:

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

Kemudian nyalakan blok dump:

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

Dan jalankan yang berikut ini:

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

..dan tekan Controlcuntuk menyelesaikan, Anda akan melihat sesuatu seperti berikut:

^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

Dan matikan dump block ketika Anda selesai:

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

Terima kasih kepada http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ untuk info bermanfaat ini.

Colin Ian King
sumber
10

Setidaknya Anda bisa mulai dengan iotop. Itu tidak akan memberi tahu Anda sistem file mana yang sedang ditulis tetapi itu akan memberi Anda beberapa proses untuk diselidiki.

sudo apt-get install iotop
sudo iotop

Ini menunjukkan disk membaca dan menulis seketika dan nama perintah membaca atau menulis.

Jika Anda mencoba untuk menangkap proses yang jarang menulis, Anda dapat menggunakan --accumulateopsi atau mencatat output ke file:

sudo -i
iotop --batch > iotop_log_file

Jelas penulisan file log akan muncul di hasil, tetapi Anda juga harus dapat melihat proses lain menulis ke disk.

Pada titik ini Anda harus dapat menemukan beberapa proses kandidat yang dicurigai. Kolom kiri di iotop menunjukkan pid. Selanjutnya, cari tahu file deskriptor yang prosesnya menulis:

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

Anda akan melihat output seperti ini ketika proses menulis:

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

Argumen pertama yang ditulis adalah deskriptor file. Kami mungkin mencari nilai lebih dari 2, karena 0, 1 dan 2 hanya stdin, stdout dan stderr. Deskriptor file 4 terlihat menarik.

Anda sekarang dapat mengetahui file apa yang ditunjuk oleh deskriptor file:

lsof -p <pid>

Yang seharusnya menghasilkan output seperti:

...
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

Lihatlah kolom ke-4. 4wberarti file descriptor 4 terbuka untuk penulisan dan file tersebut another_test_file.

Dimungkinkan untuk proses membuka, menulis, dan kemudian menutup file, dalam hal ini lsof tidak akan memperlihatkannya. Anda mungkin mengetahui hal ini terjadi dengan:

strace -p <pid> 2>&1 | grep open
Rob Fisher
sumber
Saya tidak tahu --accumulte Itu fitur yang sangat keren! Terima kasih banyak untuk itu !!! pengalihan keluaran iotop --batch gagal dengan UnicodeEncodeError: codec 'ascii' tidak dapat menyandikan karakter di posisi 92-99: ordinal tidak dalam jangkauan (128) dalam File "/usr/lib/pymodules/python2.6/iotop/ui. py ", baris 405, di refresh_display
zuba
Saya senang jawaban saya setidaknya berguna. Pengalihan berfungsi untuk saya; tidak yakin saya bisa menjelaskannya.
Rob Fisher
Ok, saya bermain-main sedikit dan menemukan saya bisa menggunakan lsof dan strace untuk setidaknya melakukan pekerjaan detektif yang cukup untuk menangkap proses menulis ke SSD. Semoga ini akhirnya menjawab pertanyaan seperti yang ditanyakan, meskipun sepertinya jawaban Colin Ian King lebih mudah!
Rob Fisher
1
Maaf atas tanggapan yang terlambat, saya tidak bisa mengatakan apa-apa sampai saya bermain dengan strace. Terima kasih atas pendekatan cerdas yang lain, saya memilih. Saya merasa cukup sulit untuk menulis skrip untuk mengimplementasikannya, karena sedikit pengalaman dalam menulis skrip shell. Itu sebabnya saya memilih solusi lain. Terima kasih telah berbagi pengetahuan Anda!
zuba
Seharusnya --accumulated, tetapi pertukaran stack membutuhkan 6 karakter untuk menerima pengeditan pos.
h__