[VM] Azure 디스크를 퍼포먼스를 위해서 파헤쳐보자 Empower Azure Disk Performance

VM
작성자
Roronoa
작성일
2019-06-22 10:47
조회
6598
Azure에서 디스크 종류

Azure 에서는 현재 4가지를 지원합니다

  1. 울트라디스크 

  2. 프리미엄SSD

  3. 표준SSD

  4. 표준HDD


울트라디스크 

현재는 GA 상태이며 가장 파워풀한 Azure 디스크이며가장 빠른 디스크입니다.

-기존과 다른점은 디스크 크기가 낮은 상태에서도 높은 IOPS를 선택 가능

-강력한 IOPS가 필요한 데이터베이스에 적합 - SAP HANA, SQL 데이터베이스, Mongo DB, Cassandra

-미주 지역과 동남 아시아 등 몇개 지역 가능

-가용성 영역에서만 울트라 디스크 가능

-ESv3, DSv3, FSv2, M, Mv2  만 가능

-4K 기본 물리적 섹터 크기만 지원

-스냅샷 X이미지 X가용성 집합 X 디스크 암호화 X Azure 백업 X  이 기능 전부 미 구현되있음

 

-160000 IOPS는 요청 시 가능

- 울트라리스트 VM 예약 요금이 존재함 (히든 비용) - 울트라디스크는 네트워크 대역폭이 높은 블록 스토리지에 연결되므로

돈이 더 들며 이 기능은 울트라디스크를 VM 에 미연결시 비용이 나옴 -> VM에 연결하면 이 비용은 안나옴
Azure NIC Flow

울트라 디스크는 위에 그림처럼 비교적 Azure 안에서 디스크 크기가 작은경우에도 많은  IOPS 쓸 수 있는 디스크입니다
프리미엄SSD

P10 보다 낮은 단계의 크기 디스크는  IOPS가 120이므로 주의 해야합니다.

디스크 크기를 낮추면 IOPS가 낮아지므로 주의가 필요합니다

일반 HDD는 기본이 500IOPS(32GiB) 입니다.

현재 디스크 버스팅 기능은 미리보기 이며 P30 이하에서만 3500IOPS까지만 제공됩니다.
Azure NIC Flow
표준SSD

표준SSD는 가장 중요한점은 웹서버, 낮은 IOPS 애플리케이션, 개발/테스트 엔터프라이즈에 적합입니다.

SSD라고 무조건 빠른것이 아니며 IOPS도 일정구간 정해져있기 때문에 잘보고 골라야 합니다.
Azure NIC Flow
표준HDD

표준하드는 오브젝트 스토리지를 제외한 가장 저렴한 디스크 입니다

느립니다. 그러나 500IOPS가 S50까지는 고정입니다.

이부분이 일정하지 않은 이유는 일정하지 않은 부분이 나중에 나온 옵션이라 통일성이 맞지 않습니다.
Azure NIC Flow
디스크의 최대 퍼포먼스와 가상머신의크기에 따른 상관관계를 고려해야 속도가 잘나옵니다.

가상머신의 크기별로 IOPS와 Network Bandwidth 링크

https://docs.microsoft.com/ko-kr/azure/virtual-machines/av2-series?toc=/azure/virtual-machines/linux/toc.json&bc=/azure/virtual-machines/linux/breadcrumb/toc.json

AWS와 Azure 디스크 비교

이는 이미 잘 나와있는 Microsoft의 공식문서를 잘 활용하면 알수 있으며 AWS와 비교한다면 완전하게 일치 하지는 않습니다. 예를들어

Azure Ultra Disk 와 프리미엄 SSD는 AWS provisioned iops와 GP2의 일부분과 비슷하며 Azure 표준 SSD는 AWS의 gp2와 일치하지 않기

때문에 비교하기 어렵습니다. 당연하게 가격비교도 무의미 합니다. 거의 다르기 때문에 최대 최소 IOPS도 완전 비교하기 어렵습니다. 그냥

쉽게 생각하면 BMW와 벤츠 차이라고 봐도 무방합니다. 그중에서 차에서는 가장 중요한 부분은 연비와 기능 그리고 가격일듯합니다.

Disk도 마찬가지로 IOPS와 가격 과 기능 입니다. 모든 것이 완전히 일치하지 않으므로 머가 좋냐 무식하게 평가하는것은 잘못된 평가 방법입니다.

경쟁적으로 구글 AWS Azure가 스펙과 다양한 부분을 경쟁하지만 서로의 세계관과 철학이 다르므로 완전 비교하긴 어렵습니다.

또한 Azure에서는 표준HDD는 기본 최대500 IOPS를 지원하나 더 비싼 표준 SSD는 최대 120 부터 시작하는 어처구니 없는 세팅이 되어 있으므로

조심해야합니다. 프리미엄SSD는 32GiB가 120IOPS가 최대 이므로 이 또한 잘 선택해야 바보 되지 않습니다. 

Azure Disk의 구성

https://docs.microsoft.com/en-us/azure/virtual-machines/windows/managed-disks-overview#disk-allocation-and-performance

Azure 의 가상머신은 OS디스크 + 임시디스크 + 데이터디스크로 일반적으로 구성합니다

 

OS 디스크

운영체제가 있는 디스크 입니다 일반적으로 VM이름_OsDisk_2308432o485u309845 이런 이름으로 자동만들어지며 OS가 설치되어

있으며 부팅 볼륨이 포함되어 있고 2TiB가 최대 입니다. 기본적으로 클라우드에서는 OS 디스크를 일반적으로 필요에 의해 만들지만 리눅스는

32GiB 윈도우는 128GiB가 디폴트 이며 용량을 올릴 수 있습니다. 

현재는 Deallocated 가상머신이 호스트에 할당이 되지 않을때만 크기 변경이 가능하며 올리는것은 되지만 내리는것은 안되니 잘 선택해야합니다.

물론 내리는것은 새로 만들어서 다시 붙이면 됩니다.

 

데이터 디스크

SAP, ERP나 Cassandra 등등 데이터베이스 용량이 큰 저장 공간이 필요할 때 데이터 저장을 위해서 사용되며 IOPS나 퍼포먼스가 필요하지 않는다면

Blob과 같은 Object Storage가 더 효과적입니다

 

IOPS를 위한 임시디스크

자 OS영역에 일반적으로 IOPS를 많이 사용하지 않도록 설계가 되어 있는것이 Cloud에서 일반적이지만 세상은 그렇지 않습니다. 예전에 만들어진

Monolithic 구조는 OS 영역에서 disk를 Read Write를 많이 하는 구조로 되어 있는 수많은 프로그램들이 넘쳐납니다. 일반적인 멋진 디벨로퍼들은

인프라 구조를 고려하지 않고 코드만 잘짜면되라는 생각때문에 이부분을 쉽게 놓치는 경우가 많습니다. 클라우드에서는 일반적으로 IOPS를 올리려면

큰 디스크를 사용해야하므로 이부분에서 비용이 비효율적인 옛날 방식이 될수 있습니다. 그러므로 비용효율적이며 극강의 퍼포먼스를 올리려면

/dev/sdb1 과 같은 temporary disk 가 빠르므로 계산을 위해서 잠시 사용하고 데이터디스크로 넘어가는 구조로 바뀌어야 가장 이상적인 인프라 구조라

할수 있습니다 .그러나 당연하게 sdb1과같은 temporary disk는 재부팅시 데이터가 휘발됨을 꼭 인지해야합니다. 

Azure NIC Flow

 

Temporary disk 란

Azure에서 리눅스던 윈도우던 위에 Microsoft 공식문서처럼 Temporary storage가 자동 생성됩니다. 일반으로 이 Temp storage는 비영구적

으로 hypervisor에 있습니다. 추가 추가된 데이터 디스크는 영구적이며 Azure Storage Account에 있습니다. Virtual Machine을 껐다 키면 현재

호스트에서 재할당됩니다. 그러므로 Temp Storage는 새로운 호스트로 제할당되므로 데이터가 이동되지 않는 비영구적이며 휘발성을 가지게 됩니다. 

 

Azure에서 Linux 또는 Windows에 관계없이 모든 VM은 임시 디스크가 자동으로 할당됩니다. 이 임시 디스크는 Azure VM이 호스팅되고 비 영구적 인

물리적 서버 (하이퍼 바이저)에 있습니다. 운영 체제 또는 추가로 추가 된 데이터 디스크에서 사용하는 디스크는 영구 디스크이며 Azure 저장소에 저장됩니다.

 

유지 관리, 하드웨어 오류 또는 기타 이유로 인해 언제든지 Azure VM을 현재 호스트에서 새 호스트로 옮길 수 있습니다. 이러한 경우 임시 저장소의

데이터는 새 호스트로 유지되거나 이동되지 않습니다. 하드웨어 오류 외에도 임시 디스크의 데이터가 손실되는 다른 많은 이유가 있습니다.

가상머신의 크기조정  CPU 나 Ram을 올릴때 디스크크기를 조정할때 등등 다양한 이유로 호스트가 재할당되면 이 디스크는 날아가버립니다.

그럼? 왜 존재하는가? 당연하게 VM에서 가장 가까운 위치에 저장되므로 빠릅니다. 그러나 일반적으로 디벨로퍼들이 이런 방법을 잘 알지못하거나

귀차니즘에 의해 사용하지 않습니다. 일반적으로 속도를 위해서 퍼포먼스를 위해서 그래서 이 방법을 사용하면 극강의 속도를 낼수 있습니다. 

그러나 일반적으로 1프로 이하의 유저가 사용합니다….안타까운 현실..이며 /mnt에 저장하여 쓰다 호스트 변경시 데이터를 날리는 경우도 많으므로

주의해야합니다. 

우분투에서 디스크 추가하기 

우분투이므로 리눅스 기반으로 이야기 하겠습니다. 윈도우 기반은 Azure에서는 너무 많은 좋은 자료들이 있어서 "리눅스"로 시작했으며

다른 많은 블로그와 글과는 다르게 Azure와 클라우드 관점에서 포커스를 맞춘체 진행하겠습니다. 

1번 : 일반적으로 Azure 에서 Virtual Machine을 만듭니다. (생략)

2번 : Virtual Machine에 4개의 데이터디스크를 CLI나 포털에서 만든후 Attached 시킵니다 (생략)

3번 : 자 리눅스 우분투에 ssh로 접속합니다.(생략)

4번 : 접속하자 마자 df -h 는 명령어로 디스크 공간을 확인합니다 

Azure NIC Flow

Azure NIC Flow

5번 : 위에 그림의 df -h 의 명령어를 사용하면 디스크 공간을 확인할수 있으며 %로 보여줍니다.

 또한 마운트된 위치도 보여줍니다..-- udev 는 리눅스 커널 2.6부터 나온 기능이 있는 폴더로 디바이스 연결시 

자동연결 즉 /dev/369 를 생성 이나 제거 를 하는 기능이다. 또한 boot 후에 각 rule들에 따라 규칙사항은 저장됩니다. 

우분투의 기본 rule Path는 /dev/udev/rules.d이다

-- tmpfs  이름부터 temporary 를 줄여쓴 느낌이 올것입니다 temporary file storage로 휘발성 임시 파일 스토리지다.

/run 에 마운트되어서 있는것 처럼 보이지만 메모리에 저장된다.다른 정보페이지에 이것에 대해서 잘나와있으므로 생략합니다.

-- /dev/sda15 는 boot/efi 파티션 입니다

새 Virtual machine 만들고 OS영역을 512GiB로 잡으면 우분투에서 저 모습으로 나옵니다. OS 영역은 Virtual Machine 이 생성되면

리눅스는 30GiB 윈도우는 128GiB로 Azure는 생성됩니다. 자 512GiB로 VM의 OS영역을 늘린 이유는 OS도 IOPS가 더 늘어나며 가성비가

512GiB가 좋아서 올렸습니다.  

-- /dev/sda1이 / 로 마운트 되어 있으며 497GiB로 되어있다고 생각하시면 됩니다. 

6번 : fdisk -l 로 현재 디스크와 파티션을 봅시다

7번 : sudo fdisk /dev/sdc 로 파티션을 만듭니다 

P n 1 2048 p w 이 순서로 커멘드를 치면 만들어집니다. 

8번 : 포멧을 위한 커맨드를 칩니다.

mkfs -t ext4 /dev/sdc1

cd home 

9번 : 파티션을 마운트할 디렉토리를 만듭니다.

sudo mkdir /datadrivesdc1

10번 : 마운트를 합니다. 

sudo mount /dev/sdc1 /datadrivesdc1

11번 : 다시 부팅되었을때 자동으로  마운트되게 하기 위해서 UUID 찾기위해서 커맨드를 입력합니다.

sudo -i blkid

/dev/sda1: UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4"

/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4"

/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="ext4"

12번 : 다시 부팅되었을때 자동으로  마운트되게 하기 위해서 설정을 세팅합니다.

sudo nano /etc/fstab

파일 끝에 추가 

UUID=2easdfasdfasdfasdfasdfasdfasdf5   /datadrivesdc1   ext4 defaults,nofail   1 2

control +o 

Control +x

13번 : 재부팅합니다.

14번 : D 드라이브를 위해 7번 부터 13번까지 반복합니다 

sudo fdisk /dev/sdd

N P n 1 2048 p w 

Sudo mkfs -t ext4 /dev/sdd1

sudo mkdir /datadrivesdd1

sudo mount /dev/sdd1 /datadrivesdd1

sudo -i blkid

/dev/sda1: UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4"

/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4"

/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="ext4"

/dev/sdc1: UUID="2e0a37f2-ef82-4a6e-ba2c-7b45febb1d35" TYPE="ext4" PARTUUID="0bf0df0b-01"

/dev/sdd1: UUID="172fdbc6-f732-47cb-ab1a-5e81edd2e5c1" TYPE="ext4" PARTUUID="32c2bbf8-01"

sudo nano /etc/fstab

파일 끝에 추가 

UUID=172fdbc6-f732-47cb-ab1a-5e81edd2e5c1  /datadrivesdd1   ext4 defaults,nofail   1 2

control +o 

Control +x

재부팅 합니다. 

15번 : E 드라이브를 위해 7번 부터 13번까지 반복합니다 

 

sudo fdisk /dev/sde 

N P n 1 2048 p w 

mkfs -t ext4 /dev/sde1

sudo mkdir /datadrivesde1

sudo -i blkid

/dev/sda1: UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4"

/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4"

/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="ext4"

/dev/sdc1: UUID="2e0a37f2-ef82-4a6e-ba2c-7b45febb1d35" TYPE="ext4" PARTUUID="0bf0df0b-01"

/dev/sdd1: UUID="172fdbc6-f732-47cb-ab1a-5e81edd2e5c1" TYPE="ext4" PARTUUID="32c2bbf8-01"

sudo nano /etc/fstab

파일 끝에 추가 

UUID=172fdbc6-f732-47cb-ab1a-5e81edd2e5c1  /datadrivesdd1   ext4 defaults,nofail   1 2

control +o 

Control +x

재부팅 합니다. 

 

 

고성능을 위한 디스크의 디자인
클라우드의 IaaS 관점에서만 보면 고성능을 위한 디스크 튜닝의 기본은 무조건 비싼 가상머신을 쓰면 기본적으로 고성능이며 무조건

용량이 큰 디스크를 붙이고 많은 디스크를 붙일수 있는 비싼 VM에서 성능이 좋습니다.

그러나 이것 이외에도 여러가지 변수가 있으며 버스팅도 제공이 되며 다양한 변수가 많이 있습니다. 이부분은 Microsoft 공식문서에 아주

잘나와있으므로 이부분을 대체 합니다.

https://docs.microsoft.com/ko-kr/azure/virtual-machines/windows/premium-storage-performance