4

这是 blktrace 的输出。我不明白什么是“N 0 (00 ..) [multipathd]”。我正在测试 FS 的写入 IO 性能。

我有2个疑问,

  1. N - 是一个动作,但我在 blktrace.pdf 中找不到它的用法。
  2. IOSTAT 和 BLKTRACE 有什么区别。

blktrace o/p:

  8,128  7       11    85.638053443  4009  I   N 0 (00 ..) [multipathd]   
  8,128  7       12    85.638054275  4009  D   N 0 (00 ..) [multipathd]   
  8,128  2       88    89.861199377  5210  A   W 384 + 8 <- (253,0) 384   
  8,128  2       89    89.861199876  5210  Q   W 384 + 8 [i_worker_0]   
  8,128  2       90    89.861202645  5210  G   W 384 + 8 [i_worker_0]   
  8,128  2       91    89.861204604  5210  P   N [i_worker_0]   
  8,128  2       92    89.861205587  5210  I  WA 384 + 8 [i_worker_0]   
  8,128  2       93    89.861210869  5210  D  WA 384 + 8 [i_worker_0]   
  8,128  2       94    89.861499857     0  C  WA 384 + 8 [0]   
  8,128  2       95    99.845910681  5230  A   W 384 + 8 <- (253,0) 384   
  8,128  2       96    99.845911148  5230  Q   W 384 + 8 [i_worker_20]   
  8,128  2       97    99.845913846  5230  G   W 384 + 8 [i_worker_20]   
  8,128  2       98    99.845915910  5230  P   N [i_worker_20]   
  8,128  2       99    99.845917081  5230  I  WA 384 + 8 [i_worker_20]   
  8,128  2      100    99.845922597  5230  D  WA 384 + 8 [i_worker_20]
4

1 回答 1

9

blktrace 有介绍http://duch.mimuw.edu.pl/~lichota/09-10/Optymalizacja-open-source/Materialy/10%20-%20Dysk/gelato_ICE06apr_blktrace_brunelle_hp.pdf

IOSTAT 和 BLKTRACE 之间的区别。

检查幻灯片 5 和 6:

iostat 实用程序确实提供与特定设备关联的请求队列相关的信息

  • – 队列上的平均 I/O 时间、合并次数、读/写的块数,...
  • – 但是,它没有提供基于每个 I/O 的详细信息

块跟踪。低开销、可配置的内核组件,它为每个进入块 I/O 层的 I/O 上执行的特定操作发出事件

因此,iostat 是输出统计信息的通用工具;blktrace 是用于捕获和输出有关在工具处于活动状态时服务的所有 I/O 请求的更多信息的工具。

幻灯片 11 有一些解码介绍

 8,128  7       11    85.638053443  4009  I   N 0 (00 ..) [multipathd]   
 maj/min cpu  seq#   timestamp_s.ns  pid  ACT RWBS blocks    process

multipathd 是内核守护进程,因为它的名称包含在[]大括号中。

默认格式在 blktrace.pdf 中描述(这里是 pdf 的来源:http: //git.kernel.org/cgit/linux/kernel/git/axboe/blktrace.git/tree/doc/blktrace.tex

"%D %2c %8s %5T.%9t %5p %2a %3d "

%D 将事件的主要/次要设备显示为:\%3d,\%-3d。%2c CPU ID(2 个字符的字段)。%8s 序列号 %5T.%9t 5 个字符的字段表示时间戳的秒部分,一个 9 个字符的字段表示时间戳中的纳秒。%5p 进程 ID 的 5 个字符字段。%2a 用于其中一项操作的 2 字符字段。%3d RWBS 数据的 3 个字符字段。

行动

C -- complete
D -- issued
I -- inserted
Q -- queued
B -- bounced
M -- back merge
F -- front merge
G -- get request
S -- sleep
P -- plug
U -- unplug
T -- unplug due to timer
X -- split
A -- remap
m -- message

RWBS

'R' - read,
'W' - write 
'D' - block discard operation
'B' for barrier operation or 
'S' for synchronous operation.

因此,对于 multipathd,我们有“I” action =“inserted”,对于 RWBS 有 N,而 N 很奇怪。文档中甚至源中都没有 N:blkparse_fmt.c - fill_rwbs()。为什么?因为它是旧文档和旧来源。

例如,在现代内核中,3.12 的 fill_rwbs 中有 N:http: //sources.debian.net/src/linux/3.12.6-2/kernel/trace/blktrace.c ?hl=1038#L1038

if (t->action == BLK_TN_MESSAGE) {
    rwbs[i++] = 'N';
    goto out;
}

blktrace_api.h将BLK_TN_MESSAGE 声明为

#define BLK_TN_MESSAGE        (__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY))

 * Trace categories
    BLK_TC_NOTIFY   = 1 << 10,  /* special message */

 * Notify events.
    __BLK_TN_MESSAGE,       /* Character string message */

因此,'N' 是带有字符串消息的通知操作。我认为看到的是消息而不是“块”字段。我能够找到添加了 TN_MESSAGE 的补丁,但没有更新文档(就像 linux 之类的bazaar -model 中计划的那样)http://lkml.org/lkml/2009/3/27/31 “[ PATCH v2 6/7] blktrace:正确打印出 BLK_TN_MESSAGE" 2009

于 2014-02-05T21:52:39.683 回答