SSD'ime hangi işlemin yazıldığını bulmak için disk yazımlarını daha fazla araştır


11

Yeni SSD sistem sürücüme disk yazma işlemlerini en aza indirmeye çalışıyorum. Iostat çıktısı ile sıkıştım:

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

Gördüğüm gibi sdb yazıyor. Hangi işlemin yazıldığını nasıl çözebilirim ?

Iotop'u biliyorum , ancak hangi dosya sistemine erişildiğini göstermiyor.

Yanıtlar:


7

Aşağıda, çekirdeğin sanal bellek bloğu boşaltma mekanizması kullanılmaktadır. Önce perl betiğini alın:

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

Sonra blok dökümü açın:

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

Ve aşağıdakileri çalıştırın:

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

..ve Controlcbitirmek için basın , aşağıdaki gibi bir şey göreceksiniz:

^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

Ve işiniz bittiğinde blok dökümü kapatın:

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

Bu yararlı bilgiler için http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ için teşekkürler .


10

En azından iotop ile başlayabilirsin. Hangi dosya sisteminin yazıldığını size söylemez, ancak araştırmanız için bazı işlemler sağlar.

sudo apt-get install iotop
sudo iotop

Anlık disk okuma ve yazma ve okuma veya yazma komutunun adını gösterir.

Nadiren yazan bir işlemi yakalamaya çalışıyorsanız, --accumulateseçeneği kullanabilir veya çıktıyı bir dosyaya kaydedebilirsiniz:

sudo -i
iotop --batch > iotop_log_file

Açıkçası, günlük dosyasının yazılması sonuçlarda görünecektir, ancak diske yazılan diğer işlemler için de grep yapabilmeniz gerekir.

Bu noktada bazı aday şüpheli süreçleri bulabilmelisiniz. İotop'ta sol sütun pid'i gösterir. Ardından, işlemin hangi dosya tanımlayıcıya yazdığını bulun:

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

İşlem yazarken şöyle çıktı görmelisiniz:

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

Yazmak için ilk argüman dosya tanımlayıcıdır. Muhtemelen 2'den büyük değerler arıyoruz, çünkü 0, 1 ve 2 sadece stdin, stdout ve stderr'dir. Dosya tanımlayıcı 4 ilginç görünüyor.

Artık dosya tanımlayıcının hangi dosyaya işaret ettiğini bulabilirsiniz:

lsof -p <pid>

Hangi gibi çıktı vermelidir:

...
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. sütuna bakın. 4waracı dosya tanımlayıcı 4 yazma için açık ve dosya olduğunu another_test_file.

Bir işlemin bir dosyayı açması, yazması ve kapatması mümkündür, bu durumda lsof bunu göstermez. Bu olayı şunlarla yakalayabilirsiniz:

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

Ben bilmiyordum - akümülatör Bu gerçekten harika bir özellik! Bunun için çok teşekkür ederim !!! iotop - toplu çıkış yeniden yönlendirmesi UnicodeEncodeError ile başarısız oluyor: 'ascii' codec bileşeni, 92-99. konumdaki karakterleri kodlayamıyor: "/usr/lib/pymodules/python2.6/iotop/ui dosyasındaki sıra sayısı (128) 'de sıralanamıyor. py ", line 405, in refresh_display
zuba

Cevabımın en azından bazı yararları olduğu için memnunum. Yönlendirme benim için çalışıyor; Bunu açıklayabileceğimden emin değilim.
Rob Fisher

Tamam, biraz oynadım ve en azından bir SSD'ye yazma süreçlerini yakalamak için yeterli dedektif işi yapmak için lsof ve strace kullanabileceğimi buldum. Umarım bu nihayet sorulan soruya cevap verir, ancak Colin Ian King'in cevabı daha kolay gibi görünüyor!
Rob Fisher

1
Geç cevap verdiğim için üzgünüm, strace ile oynayana kadar söyleyecek bir şeyim yoktu. Bu akıllı yaklaşım için teşekkür ederim, oy verdim. Kabuk betikleri yazma konusunda çok az deneyim nedeniyle, bunu uygulamak için komut dosyası yazmayı oldukça zor buldum. Bu yüzden başka bir çözüm seçtim. Bilginizi paylaştığınız için teşekkür ederiz!
zuba

Olmalı --accumulated, ancak yığın değişimi gönderinin düzenlenmesini kabul etmek için 6 karakter gerektirir.
h__
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.