NAS는 평소에는 잘 건들지 않는데, 이번에 NAS 시스템을 갈아 엎으면서 SSD도 몇개 남겠다 HDD만 있던 NAS시스템에 SSD 캐싱을 해보면 어떨까해서 SSD 캐싱에 대한 정보를 찾아봤습니다. NAS의 OS를 Ubuntu로 사용 중인데, SSD 캐싱에 대해 윈도우에서의 정보는 많았지만 리눅스에서의 정보는 굉장히 적고 제한적이였습니다.
그나마 검색해서 나온 것 중 가장 흔한 방법이 bcache라는 앱인데, 문제는 bcache는 비어있는 SSD와 비어있는 HDD를 요구했기 때문에 이미 HDD를 사용중인 저에게는 알맞지 않은 방법이였어요. 그래서 다시 다른 방법을 찾아 해맸고 국내의 한 논문을 보다가 'EnhanceIO라는 앱은 이미 사용중인 HDD에도 사용할 수 있다'라고 해서 EnhanceIO를 설치하려고했죠. 그런데 또 EnhanceIO는 지원이 종료되었다고 해서 또 열심히 찾아본 결과, 오픈소스라서 개인 개발자가 조금씩 업데이트한 버전이 있더라구요. 그래서 그걸 설치했습니다. 설치하는 것도 리눅스 초보인 저에게 너무 고된 시간이였어요.
제 이야기는 여기까지만 하고, 그래서 이번엔 리눅스에서 HDD에 SSD 캐싱(Caching)을 하는 법을 포스팅하려고합니다. 까먹을지도 모르니 기록하는 겸해서, 국내에는 정확한 정보가 단 하나도 없어 필요한 분에게 도움이 되실까해서 글을 씁니다.
먼저 캐시(Cache)에 대해 간단히 설명하자면 느린 저장장치에 빠른(+비싼) 저장장치를 넣어서 일부 정보를 불러와놓고 빠르게 사용할 수 있게 만든 저장 방식입니다. 빠른 저장장치를 사용하려면 가격이 비싸지기 때문에 느리지만 저렴한 저장장치에 아주 조금만 추가해 자주쓰는 혹은 필요한 데이터들만 미리 불러와 놓는거죠. 더 자세한 내용은 아래 위키피디아에서 확인해주세요.
SSD를 HDD에 캐시하려는 목적이 바로 느린 HDD를 보완해 조금더 나은 속도로 사용할 수 있게 만드는거죠. 여러가지 찾아본 바로는 GC가 있는 SSD를 사용하는 것이 좋다고 하는데, GC는 또 뭐냐하면 '삭제한 파일의 찌꺼기를 SSD가 스스로 제거하는 기능'이라 합니다. 마침 제게 삼성전자 830 Series 128GB(MLC, GC도 있음)가 하나 있어서 이 녀석을 선택해 캐싱을 시도했습니다.
글 처음에 말한 것처럼 캐시를 할 수 있는 여러 앱들이 있지만 오직 EnhanceIO만이 이미 사용 중인 저장장치에 캐시를 할 수 있었습니다. 그래서 SSD 캐싱을 해주려면 가장먼저 EnhanceIO를 설치해야합니다.
EnhanceIO 설치
기존의 공식 EnhanceIO는 2015년에 지원 종료되었기 때문에 가장 최근까지 업데이트가 된 lanconnected의 EnhanceIO를 사용할 것입니다. 리눅스 운영체제에서 아래 링크의 파일을 다운받습니다.
https://github.com/lanconnected/EnhanceIO
다운받은 파일의 압축을 풀어준뒤 해당 폴더로 들어갑니다.
그 폴더에는 install.txt란 텍스트 파일이 있는데 설치 방법에 대해 자세히 써놓았습니다. 읽어보시면 간단한 자동설치 방법이 나와있습니다. EnhanceIO-master 디렉토리에서 터미널을 열고 아래처럼 입력하시면 됩니다. 관리자 모드로 변경하시고 하시면 편합니다.
# ./Install-EIO |
물론 이렇게 해서 자동설치 되면 제일 좋겠지만, 저는 어떤 디렉토리에 필요한 파일이 없다고 설치를 안해주겠다네요....
그래서 방법을 찾아 헤매다가, 아래쪽에 수동설치 방법이 있다는걸 깨달았습니다. 그래서 수동설치를 시작했어요.
# cd ./Driver/enhanceio |
이렇게 해도 되고 GUI를 활용하시면 Driver 디렉토리로 들어가고 다시 enhanceio 디렉토리로 들어간다음 터미널을 켜주셔도 됩니다. 그리고 설치를 시작합니다.
# make && make install # install -o root -g root -m 700 ./CLI/eio_cli /sbin/eio_cli # install -o root -g root -m 644 ./CLI/eio_cli.8 /usr/share/man/man8/eio_cli.8 |
이렇게 하면 설치는 완료된거고 다음 단계로 넘어갑니다.
# modprobe enhanceio # modprobe enhanceio_rand # modprobe enhanceio_fifo # modprobe enhanceio_lru |
rand, fifo, lru 이것들은 캐시 교체 알고리즘이라는데, 궁금하면 알아서 찾아보시길...
여기까지하면 캐싱 시킬 준비는 완료된겁니다. 이제 명령어 한줄이면 SSD를 HDD에 캐시해줄 수 있습니다.
SSD 캐싱
캐싱을 하기 전에 먼저 HDD 경로와 SSD의 경로를 파악해야합니다.
# fdisk -l |
이렇게 하면 현재 설치되어 있는 디스크들이 나옵니다. 저의 경우엔 아래처럼 나왔습니다.
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 17BE7DCC-2A1B-4BDD-9E38-28F7FFD49B26 Device Start End Sectors Size Type /dev/sda1 2048 1050623 1048576 512M EFI System /dev/sda2 1050624 1951522815 1950472192 930.1G Linux filesystem /dev/sda3 1951522816 1953523711 2000896 977M Linux swap Disk /dev/sdb: 119.2 GiB, 128035676160 bytes, 250069680 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 75538B85-A755-41DE-9F4C-6D7EAFD766F3 |
다른걸 제외하고 제 HDD의 경로는 /dev/sda, SSD의 경로는 /dev/sdb입니다.
그럼 이제 HDD에 SSD를 캐싱해주는 명령어를 입력해줍니다. 명령어는 다음과 같습니다.
# eio_cli create -d HDD경로 -s SSD경로 -p 캐시알고리즘 -m 캐시모드 -c 캐시이름 |
그래서 저같은 경우는 이렇게 했습니다.
# eio_cli create -d /dev/sda -s /dev/sdb -p lru -m wt -c ssdcache |
캐시 알고리즘은 아까 modprobe에서 적은 것처럼 rand, fifo, lru 세가지가 있습니다.
캐시 모드도 wb, wt, ro로 세가지가 있습니다.
정리하면,
-p [rand, fifo, lru] -m [wb, wt, ro] rand : 무작위 교체 fifo : 선입선출, 가장 먼저 쓰인 캐시를 먼저 제거 lru : 가장 오래 사용되지 않은 캐시를 제거 wb = writeback (데이터 손실로 이어질 수 있으므로 권장하지 않음) wt = writethrough (데이터를 안전하게 유지하면서 성능을 향상시키는 경우 최상의 캐시 모드) ro = read only (SSD는 쓰기에 관여하지 않음, 읽기만 빨라짐) |
그리고 캐시이름은 차후에 캐시를 지우거나 변경할 때 필요한 것이기에 아무 이름이나 쓰셔도 됩니다.
캐시 알고리즘이나 모드를 변경하고 싶다면 아래 명령어를 사용하시면 됩니다.
# eio_cli edit -c 캐시이름 -p [rand, fifo, lru] -m [wb, wt, ro] |
이렇게하면 SSD 캐싱은 완료되었습니다.
만약 캐시 정보를 확인하고싶다면,
# eio_cli info |
만약 캐시한 것을 없애고싶다면,
# eio_cli delete -c 캐시이름 |
이외에도 eio_cli를 입력하시면 다양한 명령어들이 나오니 확인하시고 사용하시면 될 것 같습니다.
벤치마크
추가적으로 간단하게 벤치마크를 해봤습니다. 벤치마크에는 sysbench가 사용되었습니다.
저는 알고리즘은 lru를 택했고 모드는 wt였습니다.
SSD 캐싱을 하지 않았을 때
SSD 캐싱을 하고 난후
랜덤 쓰기/읽기로 테스트한 결과인데, 읽기/쓰기 모두 속도가 약 2배정도 빨라졌습니다.
어 근데 실제 테스트로 한 파일 복사 붙여넣기는 속도가 안변하네요.........왜지?ㅠㅠ
그래도 다른건 빨라지겠지...라는 생각을 하며 일단 글을 마칩니다.
'하드웨어 > NAS, Linux, Ubuntu' 카테고리의 다른 글
fail2ban, NAS 로그인 여러번 실패 시 ip 차단하기 (0) | 2022.10.17 |
---|
댓글