Exibir estatísticas de E / S para um processo

2

Existe uma maneira de visualizar as estatísticas de IO com base no processo no Ubuntu. Eu tenho um servidor Ubuntu 10,10 que de vez em quando vai moer no disco rígido por 30 segundos, eu estou tentando descobrir o que está causando isso. Desde já, obrigado. Tudo o que estou executando nele é o mysql, no entanto, isso acontece mesmo quando o mysql não está sob nenhuma carga (sem conexões apenas inativas).

    
por dko 17.02.2011 / 15:14

2 respostas

3

Eu uso iotop (ferramenta de linha de comando).

sudo apt-get install iotop
    
por shellholic 17.02.2011 / 15:19
1

A iotop está fazendo o trabalho a maior parte do tempo. No entanto, achei o seguinte script python mais útil:

(mostra apenas os processos atualmente ativos)

#!/usr/bin/python
from glob import *
from time import *
from os.path import *
import sys, os
memory = {}
sleep_time = 5;
unit = 1024.0;
unit_name = "KiB"

for argument in sys.argv:
    if argument.find( "=" ) >= 0:
        field, value = argument.split( "=" );
        if field == "s":
            sleep_time = int( value );
    if argument == "KB": #fake Kilobyte
        unit = 1000.0;
        unit_name = "KB"
    if argument == "KiB": #real Kilobyte
        unit = float(2**10)
        unit_name = "KiB"
    if argument == "MB": #fake Megabyte
        unit = 1e6;
        unit_name = "MB"
    if argument == "MiB": #real Megabyte
        unit = float(2**20)
        unit_name = "MiB"
    if argument == "GB": #fake Gigabyte
        unit = 1e9;
        unit_name = "GB"
    if argument == "GiB": #real Gigabyte
        unit = float(2**30)
        unit_name = "GiB"

while True:
    os.system( "clear" );
    table = [];
    for item in memory.items():
        item[1]["to_delete"] = 1;

    process_list = glob( "/proc/*/status" );
    for process in process_list:
        name = ""
        pid  = ""
        rb   = 0
        wb   = 0
        try:
            f = open( process, "r" );
            for line in f:
                field, value = line.split( ":" );
                if field == "Name":
                    name = value.strip();
                if field == "Pid":
                    pid = value.strip();
                    break;  
            f.close();  
            io_file = dirname( process ) + "/io"
            f = open( io_file, "r" )
            for line in f:
                field, value = line.split( ":" );
                if field == "read_bytes":
                    rb = int(value);
                if field == "write_bytes":
                    wb = int(value);
                    break;  
            f.close();              
        except:
            pass
        item = memory.get( pid, { "PID":pid, "NAME":name, "READ":rb, "WRITE":wb } );
        item["to_delete"] = 0;  
        if ( rb - item["READ"] > 0 or wb - item["WRITE"] > 0 ):
            table += [[ pid, name, rb - item["READ"], wb - item["WRITE"] ]]
        item["READ"] = rb;
        item["WRITE"] = wb;
        memory[pid] = item;
    for item in memory.items():
        if item[1]["to_delete"]:
            memory.pop( item[0] )

    print "PID".rjust(7) + "  " + "PROCESS".ljust(30)+"READ".rjust(20) + "WRITE".rjust(20)
    for row in table:
        print row[0].rjust(7) + "  " + str(row[1]).ljust(30) + ("%5.2f"%(row[2]/(sleep_time*unit)) + unit_name+"/s").rjust(20) \
                                                      + ("%5.2f"%( row[3]/(sleep_time*unit) ) + unit_name+"/s").rjust(20) 
    print "\n* ", unit_name, "=", int(unit), "Bytes"

    sleep( sleep_time );
    
por Aleksander L. 29.05.2012 / 22:20