J'ai une statistique io élevée. Écrit haut. Mais quels fichiers sont en cours d'écriture?

14
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          11.50    0.02    5.38    0.07    0.00   83.04

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               0.01    89.92    0.26   41.59     3.36   457.19    22.01     0.23    5.60   0.09   0.38
sdb               0.10    15.59    0.40   14.55     8.96   120.57    17.33     0.04    2.91   0.07   0.11
sda               0.13    45.37    0.96    8.09    20.06   213.56    51.63     0.02    2.64   0.16   0.14
sde               0.01    31.83    0.09   11.34     0.94   103.56    18.29     0.04    3.52   0.14   0.16
sdd               0.01    48.01    0.13   19.81     1.58   202.16    20.44     0.11    5.62   0.13   0.25

Existe-t-il un moyen de savoir quels fichiers sont en cours d'écriture? 457 kB / s

Cette autre machine Linux a également ce même problème.

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          20.50    0.00   46.48   20.74    0.00   12.28

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.17    11.61    0.99    3.51    36.65    59.43    42.70     0.10   23.20   3.84   1.73
sdb               0.55   224.18   24.30   97.45   246.48  1287.12    25.19     3.96   32.53   7.88  95.91
sdd               0.53   226.75   25.56   90.96   283.50  1271.69    26.69     3.43   29.44   8.22  95.75
sdc               0.00     1.76    0.28    0.06     4.73     7.26    70.41     0.00   12.00   2.12   0.07
dm-0              0.00     0.00    1.11   14.77    36.41    58.92    12.01     1.00   62.86   1.09   1.74
dm-1              0.00     0.00    0.04    0.12     0.17     0.49     8.00     0.00   21.79   2.47   0.04
dm-2              0.00     0.00    0.01    0.00     0.05     0.01     8.50     0.00    7.90   2.08   0.00

1200 requêtes d'écriture par seconde pour un serveur qui n'héberge rien

user4951
la source

Réponses:

8

Eh bien, vous pouvez essayer les commandes suivantes qui ont fonctionné pour moi dans RHEL6:

1) Quel que soit le périphérique que vous voyez dans la sortie "iostat" effectuant plus d'E / S, utilisez-le avec la fusercommande comme suit:

fuser -uvm device

2) Vous obtiendrez une liste de processus avec le nom d'utilisateur provoquant plus d'E / S. Sélectionnez ces PIDS et utilisez-les dans la lsofcommande comme suit:

lsof -p PID | more

3) Vous obtiendrez une liste de fichiers / répertoires avec l'utilisateur effectuant le maximum d'E / S.

Ravi Trivedi
la source
root @ host [~] # fuser -uv / home4 root @ host [~] # fuser -uvm / home4 COMMANDE D'ACCÈS UTILISATEUR PID / home4: newgames 18297 ..c .. (nouveaux jeux) php cuntschi 18407 ..c .. ( cuntschi) php newgames 18457 ..c .. (newgames) php
user4951
5

Il semble qu'il n'y ait aucun outil pour trouver le débit d'E / S par fichier autre que dans le processus utilisant le fichier. Mais il existe des moyens de connaître le débit d'E / S de processus.

iotop - Il s'agit d'un utilitaire de type top / iftop qui affiche le débit d'E / S de processus.

Après avoir identifié le processus qui a des E / S lourdes, utilisez ce qui suit pour savoir quel fichier est utilisé

lsof -c <process name>

Cela devrait réduire la portée et aider à localiser la source.

John Siu
la source
comment obtenir le processus? lsof ne produit également rien. Quelque chose écrit tellement de choses et je ne sais pas quoi
user4951
Désolé, j'ai mis le mauvais utilitaire io. Ça devrait l'être iotop, non iostat. J'ai corrigé ma réponse.
John Siu
(1) Pouvez-vous également mettre à jour la distribution (redhat / centos / ubuntu ...) que vous utilisez? (2) S'agit-il d'une nouvelle installation? (3) Tout partage de fichiers comme Samba fonctionne?
John Siu
3

Vous pouvez utiliser inotifywaitfrom inotify-toolspour savoir exactement dans quel fichier est écrit. Cela ne vous dira pas combien de données sont écrites, mais cela vous dira au moins sur quels fichiers sont écrits au fur et à mesure.

Par exemple, cette commande imprime le nom du fichier dès qu'il est créé, modifié ou supprimé dans /tmp:

$ sudo inotifywait -e modify -e attrib -e move -e create -e delete -m -r /tmp
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/tmp/ CREATE test
/tmp/ MODIFY test

Malheureusement, vous devrez deviner quel répertoire contient les fichiers en cours d'écriture. Cela échoue si vous essayez de l'utiliser sur le répertoire racine, bien qu'apparemment cela puisse être remplacé:

$ sudo inotifywait -e modify -e attrib -e move -e create -e delete -m -r /
Setting up watches.  Beware: since -r was given, this may take a while!
Failed to watch /; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.
adittes
la source
2

Utilisez systemtap pour surveiller chaque appel système en écriture / écriture. Vous pouvez faire un peu de comptabilité et vous verrez quel fichier / fd obtient le plus d'octets.

Erben Mo
la source