blktrace는 Block I/O Layer 에서 storage (disk, flash 등)로 입출력이 일어나는 과정을 분석해주는 tracing tool 이다.

blktrace가 분석한 내용을 blkparse 가 parsing하여 결과를 눈으로 쉽게 확인할 수 있게 한다.

[그림 1. blktrace architecture]

blktrace 및 blkparse options


blktrace는 여러 옵션을 사용하여 tracing 할 수 있도록 한다. 아래는 일반적인 blktrace 및 blkparse의 사용법이다.

% blktrace -d <dev> -o - | blkparse -i - -o <trace_file>

-d : Use specified device. May also be given last after options

-o : File(s) to send output to
      (위의 사용법에서는  뒤에 '-'가 오는데 이는 stdout 인 텍스트 터미널을 뜻한다.)

-i : Input file containing trace data, or '-' for stdin 
     (위의 사용법에서 blktrace 의 trace data가 stdout으로 지정했으므로, blkparse도 stdin으로 설정한다.)

위의 명령어로 수행하면 <dev>에서의 Block I/O trace결과가 <trace_file>에 저장된다.

이 외에도 많은 옵션들이 있지만, 특별한 경우에 사용되므로 사용해보지 않았다.


iozone를 이용한 blktrace 분석


1. blktrace 를 수행한다.

 blktrace -d /dev/sdb -o - | blkparse -i - -o ./blktrace.sdb.ext4.iozone

 : 현재 dev는 /dev/sbd 이고 분석결과가 저장된 output file은 임의로 blktrace.sdb.ext4.iozone 로 하였다.

2. iozone을 이용하여 mount된 dev에 io를 수행한다.   

 iozone -w -e -s 64k -f ./mnt/iozone.dummy -i 0

 : 64KB 사이즈의 파일(iozone.dummy)을 sequential write pattern으로 write하였다.

  (iozone에 대한 설명은 생략한다.)

3. blktrace 를 종료하고 결과파일을 확인한다.

dev<mjr,mnr>   <cpu>  <seq_num> <time stamp> <pid> <event> <start blk+#of blk>      <process>
 
 8,16           1        1     1.427376394  5529    Q  WS 274432 + 8                [iozone]
  8,16           1        0     1.427383444     0    m   N cfq5529 alloced
  8,16           1        2     1.427384090  5529    G  WS 274432 + 8                [iozone]
  8,16           1        3     1.427385813  5529    P   N [iozone]
  8,16           1        4     1.427386431  5529    I   W 274432 + 8                [iozone]
  8,16           1        0     1.427387153     0    m   N cfq5529 insert_request
  8,16           1        0     1.427387804     0    m   N cfq5529 add_to_rr
  8,16           1        5     1.427390420  5529    Q  WS 274440 + 8                [iozone]
  8,16           1        6     1.427391162  5529    M  WS 274440 + 8                [iozone]
  8,16           1        7     1.427392450  5529    Q  WS 274448 + 8                [iozone]
  8,16           1        8     1.427392667  5529    M  WS 274448 + 8                [iozone]
 ...
  8,16           1       83     1.538002853  5529    U   N [iozone] 1
  8,16           1       84     1.538011856  5529    D   W 274432 + 128              [iozone]
  8,16           1       85     1.591459857     0    C   W 274432 + 128              [0]

결과파일에서 pid=5529 를 가지는 iozone process가 실제로 write 작업을 수행하고 있는 과정을 확인할 수 있다.

실제로 block i/o 동작을 간단히 살펴보자. 

a. seq_num=5 에서 Q event 가 수행된다. Q는 Queue의 약어로, make_request_fn가 수행되어 bio처리가 시작되었음을 나타낸다. 

b. seq_num=6 에서 event 가 수행된다. M은 Merge의 약어로, 앞선 bio request 와 통합되었음(plugged)을 나타낸다. 

c. Q->M 동작이 128 sector (64KB) 까지 반복된다. 이는 현재 iozone이 sequential write를 수행하기 때문에 모든 bio request들이 하나로 통합(merge)됨을 알 수 있다.

d. seq_num=83 에서 event 가 수행된다. U는 unflugged의 약어로, plugged list 내의 request를 I/O scheduler에게 전달했음을 나타낸다. 

e. seq_num=84 에서 D event 가 수행된다. D는 dispatch의 약어로, I/O scheduler가 block device driver에게 수행하라고 요청한 것이다.

f. seq_num=85 에서 event 가 수행된다. C는 complete의 약어로, dispatch된 request의 I/O동작이 완료되었음을 나타낸다.


<event> field 뒤에는 RWBS field로 다음과 같이 정리된다. 

RWBS DESCRIPTION

       This is a small string containing at least one character ('R' for read, 'W'  for  write,  or  'D'  for block discard
       operation), and optionally either  a  'B'  (for  barrier  operations)  or  'S'  (for   synchronous operations).


위 과정을 보면, iozone에서 실제 128KB의 sequential write 요청에 대한 Block I/O 동작을 확인할 수 있다. blktrace는 Block I/O뿐만 아니라 I/O scheduler의 동작까지도 확인할 수 있다. 

아래는 blkparse 결과파일에서 확인할 수 있는 모든 event에 대해 정리한 것이다.


(출처 : http://linux.die.net/man/1/blkparse)


Trace Actions

The following trace actions are recognised:
C -- complete
A previously issued request has been completed. The output will detail the sector and size of that request, as well as the success or failure of it.
D -- issued
A request that previously resided on the block layer queue or in the i/o scheduler has been sent to the driver.
I -- inserted
A request is being sent to the i/o scheduler for addition to the internal queue and later service by the driver. The request is fully formed at this time.
Q -- queued
This notes intent to queue i/o at the given location. No real requests exists yet.
B -- bounced
The data pages attached to this bio are not reachable by the hardware and must be bounced to a lower memory location. This causes a big slowdown in i/o performance, since the data must be copied to/from kernel buffers. Usually this can be fixed with using better hardware -- either a better i/o controller, or a platform with an IOMMU.
M -- back merge
A previously inserted request exists that ends on the boundary of where this i/o begins, so the i/o scheduler can merge them together.
F -- front merge
Same as the back merge, except this i/o ends where a previously inserted requests starts.
M --front or back merge

One of the above

M -- front or back merge
One of the above.
G -- get request
To send any type of request to a block device, a struct request container must be allocated first.
S -- sleep
No available request structures were available, so the issuer has to wait for one to be freed.
P -- plug
When i/o is queued to a previously empty block device queue, Linux will plug the queue in anticipation of future ios being added before this data is needed.
U -- unplug
Some request data already queued in the device, start sending requests to the driver. This may happen automatically if a timeout period has passed (see next entry) or if a number of requests have been added to the queue.
T -- unplug due to timer
If nobody requests the i/o that was queued after plugging the queue, Linux will automatically unplug it after a defined period has passed.
X -- split
On raid or device mapper setups, an incoming i/o may straddle a device or internal zone and needs to be chopped up into smaller pieces for service. This may indicate a performance problem due to a bad setup of that raid/dm device, but may also just be part of normal boundary conditions. dm is notably bad at this and will clone lots of i/o.
A -- remap
For stacked devices, incoming i/o is remapped to device below it in the i/o stack. The remap action details what exactly is being remapped to what.


출처 : http://ji007.tistory.com/archive/20120426

'Embedded Lab > linux, x86' 카테고리의 다른 글

[blktrace 사용법]  (0) 2013.04.08
[blktrace2]  (0) 2013.04.08
[printk 로그 레벨]  (0) 2013.04.08
[환경변수 삭제]  (0) 2013.04.07
[간단한 블록 디바이스 드라이버 모듈(램디스크)]  (0) 2013.04.07
Posted by cyj4369
,