首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >blktrace是如何工作的?

blktrace是如何工作的?
EN

Unix & Linux用户
提问于 2013-12-17 18:54:37
回答 2查看 2.2K关注 0票数 5

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

代码语言:javascript
复制
blktrace -d /dev/sdg -o - | blkparse -i -

我看到了输出

代码语言:javascript
复制
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]

我不明白这是甚麽意思。根据blkparse的手册页,有一个RWBS字段(其中R表示读,W表示写,B表示屏障,D表示丢弃,S表示同步)。经过一些实验,我发现这是第七列。但是它含有N,这意味着什么?我在哪里能找到它的意思?

EN

回答 2

Unix & Linux用户

发布于 2014-10-27 11:57:37

在RWBS字段中似乎有额外的无文档标记,并且取消了“B”表示“屏障”。N表示没有丢弃、读或写的任何东西。

代码语言:javascript
复制
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';
}
票数 9
EN

Unix & Linux用户

发布于 2013-12-18 02:04:11

blkparse文档看起来过时了,没有记录此标志。

但是,它的源代码缺乏注释,从这个函数看来,N意味着操作既不是readwritediscard,也不是代码所期望的任何东西,也许N只是用于None

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/105610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档