본문 바로가기
IT 기술/개발환경_유틸 관련 팁

flashbench 사용법

by 땅뚱 2013. 1. 11.


flashbench 는 flash 기반 저장장치의 특성을 측정하기 위한 유틸리티이다.

download flashbench : https://github.com/bradfa/flashbench

컴파일

Makefile 을 열어 CC 를 해당 target 에 맞게 설정해주면 cross compile 이 가능하다.


사용법

현재 최신 버전에서는 output file 을 명백하게 써주지 않으면 에러가 발생한다. 항상 -o <filename> 옵션을 사용해주어야 한다. 아니면 에러가 발생하지 않도록 직접 코드를 수정해도 된다.


Erase Block 및 Page Size 추정하기

-a 명령을 실행하면 다음과 같은 결과가 출력된다.


> /mnt/nfs # ./flashbench -o result -a /dev/sdb --blocksize=1024

align 2147483648        pre 501μs       on 692μs        post 495μs      diff 194μs

align 1073741824        pre 499μs       on 685μs        post 499μs      diff 186μs

align 536870912 pre 483μs       on 679μs        post 495μs      diff 191μs

align 268435456 pre 502μs       on 684μs        post 501μs      diff 182μs


align 134217728 pre 500μs       on 680μs        post 497μs      diff 181μs

align 67108864  pre 499μs       on 679μs        post 476μs      diff 192μs

align 33554432  pre 479μs       on 675μs        post 496μs      diff 187μs

align 16777216  pre 486μs       on 667μs        post 482μs      diff 184μs

align 8388608   pre 483μs       on 660μs        post 481μs      diff 178μs

align 4194304   pre 480μs       on 552μs        post 483μs      diff 70.4μs

align 2097152   pre 481μs       on 555μs        post 489μs      diff 70μs

align 1048576   pre 486μs       on 552μs        post 483μs      diff 67.9μs

align 524288    pre 484μs       on 556μs        post 486μs      diff 70.9μs

align 262144    pre 485μs       on 551μs        post 488μs      diff 64.8μs

align 131072    pre 484μs       on 550μs        post 485μs      diff 65.4μs

align 65536     pre 481μs       on 549μs        post 482μs      diff 67.3μs

align 32768     pre 482μs       on 547μs        post 481μs      diff 65.2μs

align 16384     pre 484μs       on 550μs        post 481μs      diff 67.3μs

align 8192      pre 482μs       on 523μs        post 480μs      diff 42.4μs

align 4096      pre 484μs       on 513μs        post 480μs      diff 30.8μs

align 2048      pre 483μs       on 510μs        post 483μs      diff 27.2μs

설명을 읽어보거나 코드를 찾아보면, 각각의 값은 align 값을 경계로 block size 만큼 읽은 시간의 평균을 표시해주는 기능이다.

예 를 들어 설명하면, align 2048 의 경우에 2048 을 경계로 한 개의 블럭(offset : 2048 - 1024, len:1024) 이전을 읽고, 다시 2048 을 더해서 4096 offset 의 이전 한 개의 블럭을 읽고(offset :4096 - 1024, len : 1024), 또 다시 2048 offset 만큼 더 한후 align 이전 한개의 블럭을 읽는다. 이를 디스크 크기 만큼 반복해서 읽은 시간의 평균을 구한다. 그 값이 pre 로 표시되는 부분의 값이다.

on 의 경우에는 2048 경계 이전 한 개의 블럭이 아니라, 블럭 크기의 1/2 만큼 offset 부터 블럭 크기만큼 읽는다. 즉 2048 을 경계로 앞뒤로 512 씩 읽게되는 것이다. 이 것도 2048 크기만큼 증가시키면서 반복하여 평균을 구하고, 이를 on 값으로 표시한다. post 는 pre 와 반대로 2048 경계 이후에 한 개의 블럭을 읽은 시간의 평균이다.

이렇게 얻어진 값을 기준으로 on 결과값과 pre 와 post 의 평균을 계산한 값의 차이가 diff 에 표시된다. 이렇게 되면, 어떤 경계를 기준으로 그 차이가 확연하게 벌어지는 부분을 확인할 수 있다.

diff 컬럼을 잘 살펴보자. align 8M 와 4M 사이에 diff 값이 크게 차이 나는 부분을 확인할 수 있다. 또한 16K 와 8K, 4K 사이에서도 약간의 차이를 확인할 수 있다.

이 diff 값을 통해서 우리는 erase block 이 8M 이고, page size 는 16K(유력) 또는 8K 라는 것을 유추할 수 있는 것이다.


접근시간에 대한 scatter plot 그래프 그리기

-s 명령을 사용하여 그래프를 그릴 수 있다.

> ./flashbench -s /dev/sdb --scatter-span=4 --blocksize=8192 --scatter-order=12 -o scatter_result

위 명령의 의미는 /dev/sdb 디바이스에 대해서 scatter plot 을 그리는데, blocksize * span 만큼 한번에 읽은 시간을 측정하고, 최대 scatter-order * blocksize 만큼 (212 * 8K = 4K * 8K = 32M) random 하게 access 한 시간 정보를 모아서 파일로 저장한다.

이 경우 결과 파일이 scatter_result 라는 파일로 생성되는 데, 이를 바로 볼 수는 없고, gnuplot 을 사용하여 그래프로 변환해야 한다.

gnuplot -p -e 'plot "scatter_result"'

아래 그래프는 서로 다른 USB에 대해서 테스트를 진행한 것인데, 결과를 확인해보면, 디스크 offset 에 따라서 read 성능이 균일하게 차이가 발생하는 것을 확인할 수 있다.

첫번째 결과의 경우 0~4M 부분의 read 성능이 다른 부분보다 느리고, 1.75와 1.65 부근에서 IO 성능이 펼쳐져 있는 것을 확인할 수 있다. 이 것은 USB 의 표준 파일시스템인 FAT 영역의 IO 를 다른 부분과 차별화 해놓았다는 것으로 추정할 수 있고, IO 가 2개의 띠를 이룬다는 것은 SLC 가 아니라 MLC 일 확률이 높다고 추정할 수 있다.

두번째 결과의 경우 다른 부분들도 비슷하지만, 이 그래프에서 5M~10M 사이 부분을 유심히 보면 read 속도가 3가지 정도 뚜렷한 줄이 생기는 것을 확인할 수 있는데, 이를 통해서 이 USB 미디어는 triple logic circuit(TLC) 일 가능성이 높다는 것을 유추할 수 있다.




open erase block 의 개수 찾기

flash 저장장치 특성에서 밝혔듯이, USB 제조업체에 따라서 특성이 모두 다른데, 그중에서도 earse block 을 한번에 open 할 수 있는 개수도 제각각 다르고, 이에 따라서 성능 차이가 발생할 수 있다. 이를 위해서 open erase block 개수를 추정하기 위한 명령은 -o 를 사용한다. 이를 위해서 -a 옵션을 통해서 유추한 erase block 과 pagesize 를 이용한다. --open-au-nr=<n> 옵션을 통해서 open-au 의 개수를 추정해본다. 이 부분은 코드를 분석하지 않았다. 단지 open-au 개수에 따라서 작은 크기의 write 가 일어날 경우에 속도가 저하되는 모습을 통해서 동시에 open 가능한 segment 의 개수를 추정한다.

아래 결과를 확인해보면, open-au-nr 이 2, 3 인 경우에 작은 write 에 대해서 성능이 빠르게 저하되는 것을 확인할 수 있다. 그런데 1 인 경우에는 성능저하가 비교적 적었다. 이 경우 open-au 의 개수가 1임을 추정할 수 있다.

이를 추정하여 이런 특성을 감안한 FS 에서 IO 요청이나 allocation 요청을 하면 성능 개선에 도움이 될 수도 있을 것 같다.

> ./flashbench -o openau -O --erasesize=8388608 --blocksize=8192 /dev/sdb --open-au-nr=1

8MiB    20.4M/s

4MiB    20.3M/s

2MiB    20.3M/s

1MiB    20M/s

512KiB  19.7M/s

256KiB  19.2M/s

128KiB  18.7M/s

64KiB   19.8M/s

32KiB   18.7M/s

16KiB   16.4M/s

8KiB    12.8M/s

> ./flashbench -o openau -O --erasesize=8388608 --blocksize=8192 -f /dev/sdb --open-au-nr=2

8MiB    20.4M/s

4MiB    20.3M/s

2MiB    20.4M/s

1MiB    19.9M/s

512KiB  19.6M/s

256KiB  18.9M/s

128KiB  18.3M/s

64KiB   16.4M/s

32KiB   13.2M/s

16KiB   8.3M/s

8KiB    3.69M/s

> ./flashbench -o openau -O --erasesize=8388608 --blocksize=8192 /dev/sdb --open-au-nr=3

8MiB    20.5M/s

4MiB    13.2M/s

2MiB    20.3M/s

1MiB    19.9M/s

512KiB  19.7M/s

256KiB  19M/s

128KiB  18.4M/s

64KiB   16.5M/s

32KiB   13.2M/s

16KiB   8.29M/s

8KiB    3.68M/s