Medindo o IO do disco programaticamente

4

Eu quero medir alguns números relacionados ao disco io em um determinado período de tempo, de forma programática. Isso significa que não quero gerar um processo como o iostat para obter meus números, preferindo ler algo de proc ou algo semelhante.

Eu preciso saber:

  • O número de blocos gravados no disco
  • O número de blocos lidos do disco
  • O número de blocos lidos do disco, mas encontrados no cache de disco
  • O número de blocos prestes a serem gravados no disco, mas ainda não escritos, para saber quanto sucesso eu devo esperar.

Se eu só obtiver essa informação por disco ou partição ... isso é ainda melhor, já que não preciso saber quanta informação eu li de proc.

Se eu também souber quanto tempo o processo esperou para que o IO seja feito ... ainda melhor.

Isso é possível com algumas chamadas de E / S ou lendo e analisando os arquivos / proc?

    
por Daniel 09.03.2011 / 18:20

1 resposta

5

iostat lê a partir de /proc/diskstats - Eu não posso dizer a você qual coluna corresponde a qual. Isso levaria um pouco de investigação. Além disso, se você quiser obter mais informações sobre um processo específico, /proc/[processID] contém informações relativas ao processo, como io e mem

Uma linha no arquivo se parece com:

8    0 sda 1576985 366566 29817737 8671588 4847477 21489330 210704848 14116392 0 14120880 22772188

Em /usr/src/linux-*/Documentation/iostats.txt :

Field  1 -- # of reads completed
    This is the total number of reads completed successfully.
Field  2 -- # of reads merged, field 6 -- # of writes merged
    Reads and writes which are adjacent to each other may be merged for
    efficiency.  Thus two 4K reads may become one 8K read before it is
    ultimately handed to the disk, and so it will be counted (and queued)
    as only one I/O.  This field lets you know how often this was done.
Field  3 -- # of sectors read
    This is the total number of sectors read successfully.
Field  4 -- # of milliseconds spent reading
    This is the total number of milliseconds spent by all reads (as
    measured from __make_request() to end_that_request_last()).
Field  5 -- # of writes completed
    This is the total number of writes completed successfully.
Field  6 -- # of writes merged
    See the description of field 2.
Field  7 -- # of sectors written
    This is the total number of sectors written successfully.
Field  8 -- # of milliseconds spent writing
    This is the total number of milliseconds spent by all writes (as
    measured from __make_request() to end_that_request_last()).
Field  9 -- # of I/Os currently in progress
    The only field that should go to zero. Incremented as requests are
    given to appropriate struct request_queue and decremented as they finish.
Field 10 -- # of milliseconds spent doing I/Os
    This field increases so long as field 9 is nonzero.
Field 11 -- weighted # of milliseconds spent doing I/Os
    This field is incremented at each I/O start, I/O completion, I/O
    merge, or read of these stats by the number of I/Os in progress
    (field 9) times the number of milliseconds spent doing I/O since the
    last update of this field.  This can provide an easy measure of both
    I/O completion time and the backlog that may be accumulating.
    
por 09.03.2011 / 18:29