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
1. blktrace 를 수행한다.
blktrace -d /dev/sdb -o - | blkparse -i - -o ./blktrace.sdb.ext4.iozone |
: 현재 dev는 /dev/sbd 이고 분석결과가 저장된 output file은 임의로 blktrace.sdb.ext4.iozone 로 하였다.
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 에서 M event 가 수행된다. M은 Merge의 약어로, 앞선 bio request 와 통합되었음(plugged)을 나타낸다.
c. Q->M 동작이 128 sector (64KB) 까지 반복된다. 이는 현재 iozone이 sequential write를 수행하기 때문에 모든 bio request들이 하나로 통합(merge)됨을 알 수 있다.
d. seq_num=83 에서 U 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 에서 C event 가 수행된다. C는 complete의 약어로, dispatch된 request의 I/O동작이 완료되었음을 나타낸다.
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.
'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 |