Enquêter sur disque écrit plus loin pour savoir processus qui écrit à mon SSD

11

J'essaie de minimiser les écritures sur disque à mon nouveau disque du système SSD. Je suis coincé avec une sortie 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

Comme je vois qu'il ya écrit à salésien. Comment puis - je résoudre ce qui processus écrit?

Je sais iotop , mais il ne montre pas que le système de fichiers est accédée.

zuba
la source

Réponses:

7

Ce qui suit utilise le mécanisme de vidage de bloc de mémoire virtuelle du noyau. Obtenez d'abord le script perl:

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

Activez ensuite le vidage de bloc:

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

Et exécutez ce qui suit:

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

..et appuyez sur Controlcpour terminer, vous verrez quelque chose comme ceci:

^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

Et désactivez le vidage de bloc lorsque vous avez terminé:

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

Merci à http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ pour ces informations utiles.

Colin Ian King
la source
10

Vous pouvez au moins commencer avec iotop. Il ne vous dira pas quel système de fichiers est en cours d'écriture mais il vous donnera quelques processus à étudier.

sudo apt-get install iotop
sudo iotop

Il affiche les lectures et écritures instantanées sur disque et le nom de la commande en lecture ou en écriture.

Si vous essayez d'intercepter un processus qui écrit rarement, vous pouvez utiliser l' --accumulateoption ou consigner la sortie dans un fichier:

sudo -i
iotop --batch > iotop_log_file

De toute évidence, l'écriture du fichier journal apparaîtra dans les résultats, mais vous devriez également être en mesure de rechercher d'autres processus d'écriture sur le disque.

À ce stade, vous devriez être en mesure de trouver certains processus suspects candidats. La colonne de gauche dans iotop montre le pid. Ensuite, découvrez dans quel descripteur de fichier le processus écrit:

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

Vous devriez voir une sortie comme celle-ci lorsque le processus écrit:

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

Le premier argument à écrire est le descripteur de fichier. Nous recherchons probablement des valeurs supérieures à 2, car 0, 1 et 2 ne sont que stdin, stdout et stderr. Le descripteur de fichier 4 semble intéressant.

Vous pouvez maintenant découvrir vers quel fichier le descripteur de fichier pointe:

lsof -p <pid>

Ce qui devrait produire une sortie comme:

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

Regardez la 4e colonne. 4wsignifie que le descripteur de fichier 4 est ouvert en écriture et que le fichier l'est another_test_file.

Il est possible pour un processus d'ouvrir, d'écrire puis de fermer un fichier, auquel cas lsof ne l'afficherait pas. Vous pourriez voir cela se produire avec:

strace -p <pid> 2>&1 | grep open
Rob Fisher
la source
Je ne savais pas --accumulte qui est vraiment caractéristique cool! Merci beaucoup pour ça!!! La redirection de sortie de iotop échoue avec UnicodeEncodeError: 'ascii' codec ne peut pas Encode les caractères dans la position 92-99: ordinal dans la plage (128) dans le fichier « /usr/lib/pymodules/python2.6/iotop/ui. py », ligne 405, dans refresh_display
Zuba
Je suis heureux que ma réponse a été d' une certaine utilité au moins. La redirection fonctionne pour moi; pas sûr que je peux expliquer.
Rob Fisher
Ok, j'ai joué un peu et trouvé que je pouvais utiliser lsof et strace pour au moins faire assez de travail de détective pour les processus de capture d' écriture sur un disque SSD. Espérons que cela répond enfin à la question posée, mais il semble que la réponse de Colin Ian King est plus facile!
Rob Fisher
1
Désolé pour la réponse tardive, je n'avais rien à dire jusqu'à ce que je jouais avec strace. Merci pour cette autre approche intelligente, j'ai voté vers le haut. Je l' ai trouvé assez difficile de script écrire à mettre en œuvre, en raison de peu d' expérience dans l' écriture de scripts shell. Voilà pourquoi je l' ai choisi une autre solution. Merci de partager vos connaissances!
Zuba
Devrait être --accumulated, mais l' échange de pile nécessite 6 caractères d'accepter le poste de modifier.
H__