como funciona o blktrace?

3

Estou tentando entender a camada de blocos do Linux, então estou escrevendo um blog sobre isso: link . Ao chamar blktrace assim:

blktrace -d /dev/sdg -o - | blkparse -i -

Eu vejo por exemplo a saída

8,96   4      695   430.080106382  2356  I   N 0 (00 ..) [kworker/4:2]
8,96   3       29   430.082179440    53  D   N 0 (00 ..) [ksoftirqd/3]

Eu não entendo o que isso significa. De acordo com a página man do blkparse, há um campo RWBS (contendo R para leitura, W para gravação, B para barreira, D para descartar ou S para sincronização). Com algumas experiências, descobri que é a sétima coluna. No entanto, contém N. O que isso significa? Onde posso encontrar as informações que significam?

    
por Thorsten Staerk 17.12.2013 / 19:54

2 respostas

4

Parece que há sinalizadores não documentados adicionais no campo RWBS e que o 'B' para barreira está obsoleto. N denota qualquer coisa que não seja descartada, lida ou escrita.

D - discard
W - write
R - read
N - None of the above 

F - FUA
A - readahead
S - sync
M - metadata



static inline void fill_rwbs(char *rwbs, struct blk_io_trace *t)
{
    int w = t->action & BLK_TC_ACT(BLK_TC_WRITE);
    int a = t->action & BLK_TC_ACT(BLK_TC_AHEAD);
    int s = t->action & BLK_TC_ACT(BLK_TC_SYNC);
    int m = t->action & BLK_TC_ACT(BLK_TC_META);
    int d = t->action & BLK_TC_ACT(BLK_TC_DISCARD);
    int f = t->action & BLK_TC_ACT(BLK_TC_FLUSH);
    int u = t->action & BLK_TC_ACT(BLK_TC_FUA);
    int i = 0;

    if (f)
            rwbs[i++] = 'F'; /* flush */

    if (d)
            rwbs[i++] = 'D';
    else if (w)
            rwbs[i++] = 'W';
    else if (t->bytes)
            rwbs[i++] = 'R';
    else
            rwbs[i++] = 'N';

    if (u)
            rwbs[i++] = 'F'; /* fua */
    if (a)
            rwbs[i++] = 'A';
    if (s)
            rwbs[i++] = 'S';
    if (m)
            rwbs[i++] = 'M';

    rwbs[i] = '
D - discard
W - write
R - read
N - None of the above 

F - FUA
A - readahead
S - sync
M - metadata



static inline void fill_rwbs(char *rwbs, struct blk_io_trace *t)
{
    int w = t->action & BLK_TC_ACT(BLK_TC_WRITE);
    int a = t->action & BLK_TC_ACT(BLK_TC_AHEAD);
    int s = t->action & BLK_TC_ACT(BLK_TC_SYNC);
    int m = t->action & BLK_TC_ACT(BLK_TC_META);
    int d = t->action & BLK_TC_ACT(BLK_TC_DISCARD);
    int f = t->action & BLK_TC_ACT(BLK_TC_FLUSH);
    int u = t->action & BLK_TC_ACT(BLK_TC_FUA);
    int i = 0;

    if (f)
            rwbs[i++] = 'F'; /* flush */

    if (d)
            rwbs[i++] = 'D';
    else if (w)
            rwbs[i++] = 'W';
    else if (t->bytes)
            rwbs[i++] = 'R';
    else
            rwbs[i++] = 'N';

    if (u)
            rwbs[i++] = 'F'; /* fua */
    if (a)
            rwbs[i++] = 'A';
    if (s)
            rwbs[i++] = 'S';
    if (m)
            rwbs[i++] = 'M';

    rwbs[i] = '%pre%';
}
'; }
    
por 27.10.2014 / 12:57
1
A documentação de

blkparse parece desatualizada e está ausente para documentar esse sinalizador.

No entanto, seu código-fonte não tem comentários, por isso função parece que N significa que a operação não é read , write , discard ou qualquer coisa esperada pelo código, talvez N seja usado simplesmente para None .

    
por 18.12.2013 / 03:04