blktrace 是如何工作的?

Tho*_*erk 5 linux monitoring block-device

我试图了解 Linux 块层,所以我正在写一篇关于它的博客:http : //www.linuxintro.org/wiki/blktrAce。当像这样调用 blktrace 时:

blktrace -d /dev/sdg -o - | blkparse -i -
Run Code Online (Sandbox Code Playgroud)

我看到例如输出

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]
Run Code Online (Sandbox Code Playgroud)

我不明白这是什么意思。根据 blkparse 的手册页,有一个 RWBS 字段(包含 R 表示读取,W 表示写入,B 表示屏障,D 表示丢弃或 S 表示同步)。通过一些实验,我发现它是第 7 列。但是它包含 N。这是什么意思?我在哪里可以找到信息它意味着什么?

San*_*ose 8

似乎在 RWBS 字段中还有其他未记录的标志,并且不推荐使用用于屏障的“B”。N 表示任何不是丢弃、读取或写入的内容。

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] = '\0';
}
Run Code Online (Sandbox Code Playgroud)


jll*_*gre 2

blkparse文档看起来已经过时,并且缺少记录此标志的信息。

它的源代码缺乏注释,但是从这个函数看来,这N意味着该操作既不是 a read、 a 、 writeadiscard或代码期望的任何内容,也许N只是用于None