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
'IT 기술 > 개발환경_유틸 관련 팁' 카테고리의 다른 글
[vi] cscope update db (0) | 2013.08.01 |
---|---|
git 명령어 모음 (0) | 2013.04.09 |
git clone 의 두가지 옵션 --bare / --mirror 의 차이점 (0) | 2012.12.03 |
repo 를 사용하여 프로젝트 관리하기 (5) | 2012.12.03 |
[Make] PHONY / FORCE (0) | 2012.11.12 |