BLOG

[Tech blog] 스토리지 성능을 우리는 아직 다 알지 못할 수도 있습니다
작성일: 2024-03-13

알고 계시나요? 인스턴스 스토어

 

AWS에서 EC2 인스턴스를 이용할 때 EC2 인스턴스에 연결하는 Disk(블록 스토리지)의 경우 EBS를 이용하는 경우가 많을 듯 합니다. 그러나 AWS 문서를 보면 EC2 스토리지 항목에인스턴스 스토어가 있는 것을 볼 수 있는데요, 인스턴스 스토어 이건 과연 무엇인지 알아보도록 하겠습니다.

고성능 스토리지입니다!

 

 

한마디로 ‘EBS보다 고성능’이지만 ‘데이터의 장기 보존에는 적합하지 않은’ 스토리지입니다.
※본 게시글에서는 NVMe SSD의 인스턴스 스토어를 전제로 합니다. (HDD도 있습니다)

 

 

EC2 인스턴스에 로그인하여 EBS 볼륨을 확인하면 물리적 디스크가 연결되어 있는 것처럼 보입니다만, 실제로 EC2 인스턴스와 EBS는 네트워크로 연결됩니다.

 

 

반대로 인스턴스 스토어는 EC2의 호스트 컴퓨터에 물리적으로 부착된 Disk를 사용할 수 있으므로 비교해서 보면 매우 고성능입니다.

 

 

물리 서버를 다루고 있던 사람들에게는 ‘오, 네가 필요했어!’라고 느낄 수도 있습니다.

하지만 약점이 있습니다

 

 

EC2를 오랫동안 사용하고 있는 분들이라면 호스트 컴퓨터의 문제로 EC2 인스턴스를 정상적으로 이용할 수 없게 되는 일에 부딪힌 적이 있을 거라 생각합니다. 그런 경우에는 EC2 인스턴스를 일단 중지하고 다시 시작하면 정상적인 호스트로 이용하게 되고, 당연히 EBS 볼륨도 지금까지와 같은 것이 첨부되므로 정지 전의 EC2 인스턴스 환경과 같은 상태에서 사용할 수 있습니다.

 

 

그러면 인스턴스 스토어는 어떻습니까?

 

 

호스트 컴퓨터에 물리적으로 연결되어 있는 Disk이므로, 호스트 컴퓨터가 바뀌면 다른 Disk가 되어 버리기 때문에, 지금까지 이용하고 있던 인스턴스 스토어 볼륨은 사용할 수 없게 됩니다.

 

 

인스턴스 스토어에 관한 문서에 ‘일시적인 스토리지’나 ‘일시 데이터 저장’이라는 장기 보존을 전제로 하지 않는다는 기재가 있는 것은 이 때문인 듯 합니다.

어떤 용도로 사용할 수 있습니까?

 

 

인스턴스 스토어에 관한 문서에는 아래와 같이 쓰여있습니다.

 

 

인스턴스 스토어는 버퍼, 캐시, 스크래치 데이터, 기타 임시 콘텐츠와 같이 자주 변경되는 정보의 임시 저장에 적합합니다. 또한 로드 밸런싱된 웹 서버 풀과 같은 인스턴스 플릿 전체에 복제하는 임시 데이터를 저장하는 데 사용할 수도 있습니다.

 

 

보다 높은 IOPS나 스루풋을 필요로 하는 경우이군요. 계산 처리 등으로 방대한 파일을 취급해야 할 경우에도 성능을 발휘합니다.

실제로 사용해 봅시다

 

 

인스턴스 스토어는 일부 EC2 인스턴스만 사용할 수 있습니다.

 

 

인스턴스 유형 목록의 ‘인스턴스 스토리지’ 항목에 ‘NVMe SSD’ 및 ‘HDD’와 같은 물리적 디스크의 이름이 나열된 EC2 인스턴스를 선택해야 합니다.

 

 

이번에는 스토리지 최적화 인스턴스에서 ‘i3.8xlarge’+ ‘EBS 500GB(gp3)’ + ‘Amazon Linux 2023’의 EC2 인스턴스를 활용합니다. ‘NVMe SSD 1900GB’가 4개 붙어 있습니다.

 

 

i3.8xlarge의 인스턴스 스토어는 EC2 인스턴스를 생성하는 것만으로는 사용할 수 없으며 파일 시스템을 만들고 마운트 해야 합니다.AWS 문서를 참고 하여 진행 해 보겠습니다.

[1] EC2 인스턴스에 로그인

 

 

SSH, Instance Connect 등을 이용하여 EC2 인스턴스에 로그인합니다.

[2] 마운트 확인

 

 

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           120G     0  120G   0% /dev/shm
tmpfs            48G  8.6M   48G   1% /run
/dev/xvda1      500G  5.0G  496G   1% /
tmpfs           120G     0  120G   0% /tmp
/dev/xvda128     10M  1.3M  8.7M  13% /boot/efi
tmpfs            24G     0   24G   0% /run/user/1000

 

 

인스턴스 스토어인 1900GB 스토리지는 표시되지 않습니다.

[3] 블록 장치 표시

 

 

$ lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0  500G  0 disk 
├─xvda1   202:1    0  500G  0 part /
├─xvda127 259:0    0    1M  0 part 
└─xvda128 259:1    0   10M  0 part /boot/efi
nvme1n1   259:2    0  1.7T  0 disk 
nvme0n1   259:3    0  1.7T  0 disk 
nvme2n1   259:4    0  1.7T  0 disk 
nvme3n1   259:5    0  1.7T  0 disk

 

 

nvme0n1~nvme3n1의 4개가 1.7T라고 표시되어 있으므로, 이들이 인스턴스 스토어라는 것을 알 수 있습니다.

[4] 파일 시스템 생성

 

 

 

$ sudo mkfs -t xfs /dev/nvme0n1
meta-data=/dev/nvme0n1           isize=512    agcount=4, agsize=115966797 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=463867187, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=226497, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.

 

 

nvme0n1만 xfs 파일 시스템을 만듭니다.

[5] 마운트 디렉토리 만들기

 

 

$ sudo mkdir /data

 

 

인스턴스 스토어 볼륨을 /data에 마운트하므로 마운트 디렉토리를 생성합니다.

[6] 인스턴스 스토어 볼륨 마운트

 

 

 

$ sudo mount /dev/nvme0n1 /data

[7] 마운트 확인

 

 

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           120G     0  120G   0% /dev/shm
tmpfs            48G  8.6M   48G   1% /run
/dev/xvda1      500G  5.0G  496G   1% /
tmpfs           120G     0  120G   0% /tmp
/dev/xvda128     10M  1.3M  8.7M  13% /boot/efi
tmpfs            24G     0   24G   0% /run/user/1000
/dev/nvme0n1    1.8T   13G  1.8T   1% /data

 

 

‘/dev/nvme0n1’의 행이 마운트된 인스턴스 스토어 볼륨이네요.

[8] 소유자 변경

 

 

 

$ sudo chown ec2-user:ec2-user /data

 

 

Amazon Linux 2023의 기본 Linux User(ec2-user)에서 읽고 쓸 수 있도록 /data 소유자를 변경합니다.
이제 인스턴스 저장소 볼륨을 /data로 사용할 수 있습니다.

 

 

EBS와의 비교

 

 

EBS와 인스턴스 스토어에서 얼마나 차이가 있는지에 대해 벤치마크 소프트웨어 등으로 측정하는 것도 좋지만 이번에는 대량의 더미 파일 생성 명령을 실행하여 완료까지의 시간을 비교해 보겠습니다.

 

  • start.txt 만들기
  • 1MB 파일을 10만 파일 생성
  • complete.txt 만들기

 

 

이런 식으로 진행 하고자 합니다.

EBS 볼륨에 더미 파일 만들기

 

 

 

$ mkdir ~/ebs-data
$ cd ~/ebs-data/
$ touch start.txt && for i in {1..100000}; do dd if=/dev/zero of="dummy_file_$i" bs=1M count=1; done && touch complete.txt

 

 

홈 디렉토리에 더미 파일 생성을 위한 ‘ebs-data’ 디렉토리를 생성합니다.

해당 디렉토리로 이동하여 더미 파일 생성 명령을 실행합니다.

 

 

$ stat ~/ebs-data/start.txt |grep "Birth"
 Birth: 2023-12-01 20:15:22.346223031 +0000

$ stat ~/ebs-data/complete.txt |grep "Birth"
 Birth: 2023-12-01 20:23:30.909140621 +0000

 

 

처리가 완료되면 start.txt와 complete.txt의 타임 스탬프를 확인합니다. 8분 8초군요.

인스턴스 스토어 볼륨으로 더미 파일 만들기

 

 

$ cd /data/
$ touch start.txt && for i in {1..100000}; do dd if=/dev/zero of="dummy_file_$i" bs=1M count=1; done && touch complete.txt

 

 

인스턴스 저장소 볼륨인 /data로 이동하여 더미 파일 생성 명령을 실행합니다.

 

 

$ stat /data/start.txt |grep "Birth"
 Birth: 2023-12-01 20:25:48.039948920 +0000

$ stat /data/complete.txt |grep "Birth"
 Birth: 2023-12-01 20:30:40.611511271 +0000

 

 

4분 52초이므로 인스턴스 스토어가 분 단위로 빨리 완료되는 것을 알 수 있습니다.

 

 

이번에는 10만 파일이었지만, 이것이 100만, 1000만으로 파일이 늘어날 경우, 완료까지의 시간차도 점점 늘어납니다.

 

 

특정의 상황에서 Disk I/O의 성능이 필요한 경우에는 인스턴스 스토어를 가진 EC2 인스턴스의 이용을 검토하는 것도 좋을 것이라 생각 됩니다.

결론

 

 

인스턴스 스토어는 ‘i3.large’ 및 ‘m6id.large’와 같은 large 유형에서 제공됩니다.

 

만약 Disk I/O의 성능이 필요하면 인스턴스 스토어를 기억 해 주시기 바랍니다.

원본: https://qiita.com/ryokawana/items/e856bbd957466491503c

작성자 : 메가존재팬 Kawana Ryo

번역 : 메가존클라우드 CTC 박지은 매니저