학습자료(~2017)/리눅스

[Linux] bcache (설치, 사용법), dm-cache, flushcache (블럭 디바이스 cache 로 성능을 높이자) - 너저분함 정리 필요

단세포소년 2013. 7. 8. 19:15
반응형

참고 : 

http://www.linux-mag.com/id/7839/ - bcache 와 flashcache 에 대한 이론 설명

http://download.synology.com/download/ds/userguide/Synology_SSD_Cache_White_Paper.pdf - synology ssd 활용



1.bache (kernel 3.10 부터 포함이란다.)
기본 사이트에서 받은 kernel 모듈은 커널 3.2 기반이라 3.8을 사용하는 나로써는 왠지 문제가 될것 같았다.

https://gist.github.com/terrorobe/4128237 - Build bcache debian kernel (데비안 커널에서 bcache 설치)

http://bcache.evilpiepirate.org/ - bcache 공식 사이트

http://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/ - Linux flashcache and bcache performance testing

http://pommi.nethuis.nl/ssd-caching-using-linux-and-bcache/ - SSD caching using Linux and bcache, 하드웨어 구성(harddisk 용량속도에 따른 ssd 용량) ,  Benchmark 정리도 있음, attach deattch 설명도 잘 되어 있음

https://wiki.archlinux.org/index.php/Bcache - bcache archlinux wiki 사용법

https://gist.github.com/TheAnonymous/5787963 - bcache tutorial (bcache 가 포함된 리눅스 커널 3.10 을 컴파일함 - redhat 계열) , 추가로 실행 스크립트 도 작성되어 있다.

http://habrahabr.ru/post/182372/ - bcache 커널 모듈 컴파일 방법

http://www.spinics.net/lists/linux-bcache/msg00581.html - bcache 제어 방법 (예를 들어 stop, 상태보기)

http://www.linux-mag.com/id/7847/ - bache 벤치마킹 자료 (bcache 스케줄 방식에 따른 자료)


2. dm-cache

http://blog.kylemanna.com/linux/2013/06/30/ssd-caching-using-dmcache-tutorial/ - ssd caching using dm-cache tutorial


3. Flashcache 

http://www.sebastien-han.fr/blog/2012/11/15/make-your-rbd-fly-with-flashcache/ - MAKE YOUR RBD FLY WITH FLASHCACHE


4. 커널 컴파일

http://mojolog.com/385




 block cache 종류

 dm-cache (by Redhat - in the 3.9 Kernel, so it should be in ubuntu 13.10)

 Flashcache (developed and used by facebook)

 Bcache (developed and used by Google )

 EnhanceIO (by STEC; based on Flashcache)





BCACHE

특징 :sequential I/O 에 대해서는 캐시가 적용되지 않는다. random I/O 에서만 캐시가 적용된다.


BCACHE 설치 - Ubuntu (커널 3.10에 bcache 포함됨)
redhat 계열은 https://gist.github.com/TheAnonymous/5787963 참고하세요

 # 커널 3.10 에 bcache 가 포함되어있다. 커널 3.10을 받아 컴파일한다.

$ apt-get install build-essential libncurses5-dev
필요 패키지

$ cd /usr/src

$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.tar.xz

$ tar xvf linux-3.10.tar.xz

$ cp /boot/config-`uname -r` .config

$ make oldconfig  
# 이때 CONFIG_BCACHE 를 y 로 만들어야 합니다. 만약 지났쳤다면 vim .config 를 통해 CONFIG_BCACHE=y 를 추가해주세요

$ make-kpkg clean

$ make-kpkg --initrd kernel_image kernel_headers kernel_source modules_image
# 상위 폴더에 .deb 를 만든다.

$ cd ..

$ dpkg -i * .deb 
# linux-image-XXXXX.deb , linux-headers-XXXXX.deb 가 생겨있다. 이걸 설치하면된다.

$ reboot




# ubuntu kernel 을 패키지로 설치하는 방법도 있다.

http://kernel.ubuntu.com/~kernel-ppa/mainline/  여기가서 원하는 커널 버전을 받는다.

linux-header-..._all.deb

linux-headers-..._i386(amd64).deb

linux-image-..._i386(amd64).deb

32bit면 i386, 64bit면 amd 64 받으면 된다. 위의 3개의 패키지를 다 받아야 한다.


$ sudo dpkg -i linux-header-..._all.deb

$ sudo dpkg -i linux-headers-..._amd64.deb

$ sudo dpkg -i linux-image-..._amd64.dev


3개의 패키지를 다 설치한다. 귀찮으면 sudo dpkg -i linux* 

설치후 재부팅한다.

$ sudo reboot 


재부팅후 kernel 버전 확인 한다.

$ uname -a




BCACHE-TOOL 설치 

 # bcache-tools 는 bcache 유틸이다.

# bcache-tools 다운로드
# git 에서 받을 꺼니까 apt-get install git 으로 git 패키지를 우선 설치하자.

$ git clone http://evilpiepirate.org/git/bcache-tools.git

$ cd bcache-tools

# bcache-tools 를 컴파일하기 위해서는 uuid.h 가 필요하다. libuuid , uuid-dev 설치하자.
$ apt-get install uuid-dev libuuid

$ make

$ make install



BCACHE 사용하기 

자세한 사항은 공식문서 참조
http://evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt?h=bcache-dev

# 가정한다.
# /dev/sdc 를 ssd 로 cache 로 사용할것이다.
# /dev/sdb 를 내가 사용할 블럭디바이스이다.


#backing device 포맷
$ make-bcache -B /dev/sdb

#cache device 포맷 (옵션으로 -w4k -b1M --writeback 을 주어도 된다.)
$ make-bcache -C /dev/sdc
#혹은
$ make-bcache -w4k -b1M --writeback -C /dev/sdc


#하나의 cache 블럭디바이스에 여러개의 backing 디바이스로 구성하고 싶다면
$ make-bcache -B /dev/sda /dev/sdb -C /dev/sdc 


#backing/cache device 등록 - udev 없이 수동 등록하는 것이다. 패스해도됨
#중간에 bcache를 중단했을 시 이걸로 등록해도 된다.
$ echo /dev/sdb > /sys/fs/bcache/register
$ echo /dev/sdc > /sys/fs/bcache/register


#위의 결과 /dev/bcache<N> 디바이스가 생성된다. (예를들어 /dev/bcache0)
#udev 룰에 따른 디바이스는 /dev/bcache/by-uuid/<uuid> 혹은 /dev/bcache/by-label/<label> 로 더 잘 구분할 수 있다.


#backing device 상태보기
# no cache : 캐시를 사용중이지 않다. (attach 시켜야함)
# clean : 캐시 세트에 부분이고(캐시중) dirty data가 없다
# dirty : 캐시 세트에 부분이고(캐시중) dirty data 가 있다.
$ cat /sys/block/sdb/bcache/state


#attach , 만약 상태가 no cache 라면 cache set과 attach 시켜야한다.
$ echo /dev/sdc | /sys/fs/bcache/register
$ ls /sys/fs/bcache
34abebd9-eb8a-4556-8d6c-6166d2850379  register  register_quiet
$ echo 34abebd9-eb8a-4556-8d6c-6166d2850379 > /sys/block/sdb/bcache/attach
# 뜻은 34abeb... cache 세트에 sdb 장치를 추가하겟다는 의미이다.


#bcache 세트 보기
#ls -al /sys/fs/bcache/<uuid>
$ ls -al /sys/fs/bcache/03248efas654e
...(생략)
bdev0 -> ../../../sdb
cache0 -> ../../../sdc
...(생략)

# 정확하게는 아니지만 이런식으로 현재 세트의 Block deivce 와 cache device를 알수 있다.


#cache mode를 변경할때, 기본값은 write through 이다. 하지만 속도 측면에서 write back 이 빠르다.
#cache mode를 write back 으로 변경
$ echo writeback > /sys/block/sdb/bcache/cache_mode


#scheduler 변경 (벤치마킹 자료를 보면 random I/O 시 cfq 가 좋고, sequntial I/O noop 가 좋았다.)
#스케줄관련 IOPS 벤치마크는  
http://www.linux-mag.com/id/7847/ 참고하라.
$ cat /sys/block/sdb/queue/scheduler
noop [deadline] cfq
$ echo cfg > /sys/block/sdb/queue/scheduler


#cache device block_size 변경(하드웨어 섹터 크기와 똑같이 하는 것이 좋다고 한다.)
# /sys/block/<cdev>/bcache/block_size
$ echo 4k > /sys/block/sdc/bcache/block_size


#cache device bucket size 변경 (기본값은 512k)
# /sys/block/<cdev>/bcache/bucket_size
$ echo 1M > /sys/block/sdc/bcache/bucket_size

#cache


#bache 디바이스를 포맷하고 mount 하여 사용할 수 있다.
$ mkfs.ext4 /dev/bcache0
$ mount /dev/bache0 /mnt


#재부팅후 bcache 디바이스가 등로만 되어있고 backing 디바이스가 활성화되지 않는다면 bcache 디바이스를 생성되지 않는다. backing 디바이스가 활성화 중인지 확인하고 활성화 되지 않고 있다면 강제로 활성화 시키면 된다. backing 디바이스가 활성화 되는 순간 bcache 디바이스는 생성된다.
$ cat /sys/block/sdb/bcache/running
0
$ echo 1 > /sys/block/sdb/bcache/running


#bcache 는 sequential I/O에 대해서는 캐시하지 않는다. 하지만 만약 벤치마킹이나 sequential I/O 에 대해서도 캐시하고 싶다면 이 기능을 끄면된다.
$ echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

# 다시 기본값(4 MB)으로 돌리고 싶다면
$ echo 4M > /sys/block/bcache0/bcache/sequential_cutoff



## backing device 제어, 모니터링
## /sys/block/<bdev>/bcache , /sys/block/bcache*/bcache , (만약 attached 되어있다면) /sys/fs/bcache/<cset-uuid>/bdev*  디렉토리에서 제어나 모니터링을 할 수 있다.


#cache mode 확인
$ cat /sys/block/sdb/bcache/cache_mode
writethrough [writeback] writearound none

#cache mode 변경(예는 writeback 으로 변경)
$ echo writeback > /sys/block/sdb/bcache/cache_mode


#bacache 동작중인지 확인(결과가 1이면 동작중, 0이면 정지중, /sys/block/bcache0 폴더 자체가 없다면 backing, caching device 가 등록자체가 안된것이다.)
$ cat /sys/block/bcache0/bcache/running
$ cat /sys/block/sdb/bcache/running  # backing device 에서 동작확인


#bcache 일시 중지
$ echo 0 > /sys/block/bcache0/bcache/running 
#혹은 backing device 에 직접 명령
$ echo 0 > /sys/block/sdb/bcache/runnig


#bcache 완전 중지 (중지시 /dev/bcache 디바이스가 사라진다.) 완전 중지보다는 detach 후 정지 시키는 것이 좋다.
$ echo 1 > /sys/block/bcache0/bcache/stop
#혹은 backing device 에 직접 명령
$ echo 1 > /sys/block/sdb/bcache/stop


#bcache 중지 시킨후(/dev/bcache 사라진후) 다시 구동시킬때 (cache device 인지 backing device 인지는 make-bcache 명령으로 포맷팅시 구별되므로 문제 없다.)
$ echo /dev/sdb > /sys/fs/bcache/register
# 혹은
$ make-bcache -B /dev/sdb


# dirty data(backing device 에 동기화 되지 않은 데이터) 확인
$ cat /sys/block/bcache0/bcache/dirty_data


#bcache 에 등록한 블럭 디바이스의 uuid 확인
#이 uuid 는 bcache 로 포맷팅된 블럭 디바이스에 대해서만 확인가능하다.(bcache 용 uuid이다.) 
$ probe-bcache /dev/sdb
611410d2-0d0f-4c9c-b775-2b5a16385495: UUID="" TYPE="bcache"



## Backing device stats
## /sys/block/<backing dev>/bcache/stats_total/ 아래에 backing device 의 상태가 있다. 예를들어 cache_hit
# 예를들어 cache hit 률을 알고 싶을때
$ cat /sys/block/sdb/bcache/stats_total/cache_hits



반응형