EC2 Nitro 기반 인스턴스에서 호스팅되는 EBS 볼륨에서 최대 I/O 성능을 얻으려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 6월 14일

Amazon Elastic Compute Cloud(Amazon EC2) Nitro 기반 인스턴스에서 워크로드를 실행하고 있습니다. 내 인스턴스에서 호스팅되는 Amazon Elastic Block Store(Amazon EBS) 볼륨에서 최대 I/O 성능을 얻을 수 있도록 하려면 어떻게 해야 합니까?

해결 방법

1.    EBS 볼륨이 IOPS 한도에 도달하지 않았는지 확인합니다. 볼륨이 IOPS 한도에 도달하면 지연 시간이 늘어납니다. 지연 시간이 늘어나면 성능에 부정적인 영향을 미칩니다. 볼륨 성능 최적화에 대한 자세한 내용은 Amazon EBS 프로비저닝된 IOPS 볼륨의 성능은 어떻게 최적화하나요?를 참조하세요.

GP2 볼륨을 사용하는 경우 볼륨이 버스트 크레딧을 모두 사용하지 않았는지 확인합니다.

2.    NVMe 스토리지가 제공하는 성능을 활용하려면 다음 운영 체제 중 하나를 실행해야 합니다. 또는 커널 버전이 다중 대기열 기능이 있는 I/O 스케줄러를 지원하는지 확인합니다. 가장 일반적으로 사용되는 다중 대기열 I/O 스케줄러는 kyber, mq-deadline 및 bfq(budget fair queue)입니다.

  • Amazon Linux AMI 이상 및 커널 4.12 이상
  • CentOS – 7.0 이상 및 커널 3.10 이상
  • Red Hat - 7.0 이상 및 커널 3.10 이상
  • Ubuntu 19.10 커널 5.0 또는 Ubuntu 18.04.03 커널 5.0 이후 다중 대기열이 기본적으로 활성화되어 있습니다.
  • Ubuntu – 16.04 또는 16.10 다중 대기열 스케줄러가 커널을 컴파일하지 않고 별도의 모듈 로딩이 필요합니다.
  • SUSE 12 또는 SUSE 11(SP3 이상 포함)
  • Windows Server 2008 R2, 2012 R2 및 2016 이상

참고: Oracle, Linux, Debian 등과 같은 운영 체제의 경우 다중 대기열 I/O 스케줄러를 포함하거나 지원하는 커널 버전을 사용해야 합니다. CentOS 운영 체제 및 해당 커널 버전은 다중 대기열 I/O 스케줄러를 지원합니다.

나열된 운영 체제보다 이전 운영 체제를 사용하는 경우 I/O 성능이 약간 저하될 수 있습니다. CentOS 6의 I/O 스케줄러가 여러 대기열을 지원하지 않는 간단한 스케줄러이기 때문입니다. Nitro 기반 인스턴스는 호스트 수준에서 다중 대기열 처리를 수행합니다. 이렇게 하면 운영 체제와 호스트 수준에서 스케줄러 간에 호환되지 않으며 성능이 저하될 수 있습니다.

EBS 볼륨에 제출된 I/O(읽기 또는 쓰기) 요청은 볼륨이 가로채기 전에 여러 계층을 통과합니다. 이러한 계층에는 사용자 공간, 가상 파일 시스템, 페이지 캐시, 블록 계층, 스케줄러 및 장치 드라이버가 포함됩니다. blktrace, blkparsebtt 도구를 사용한 테스트 및 벤치마킹 결과는 Nitro 기반 인스턴스에서 다중 대기열 스케줄러가 아닌 이전 커널 버전을 사용할 때 I/O 스케줄러(I2D) 계층에서 약간의 지연이 발생합니다.

I/O 스케줄러는 I/O 병합, 처리 및 대기열에 중요한 역할을 합니다. Nitro 기반 시스템에서 EBS 볼륨은 NVMe 블록 디바이스로 노출됩니다. NVME는 기본적으로 여러 하드웨어 제출 및 완료 대기열을 지원합니다. CentOS 7에는 장치 드라이버가 I/O 요청을 여러 하드웨어 또는 소프트웨어 대기열에 매핑할 수 있는 다중 대기열 블록 I/O 대기열 메커니즘(blk-mq)이 있습니다. 이렇게 하면 커널의 다중 대기열 기능 때문에 Nitro 기반 인스턴스의 I/O 성능이 향상됩니다. 이전 커널 버전에는 이 기능이 없습니다. 따라서 Nitro 기반 시스템에서 최대한의 성능을 위해 최신 커널과 함께 최신 운영 체제를 사용하는 것이 가장 좋습니다.

CentOS 6의 I/O 스케줄러

$cat /sys/block/xvdf/queue/scheduler noop anticipatory deadline [cfq]
$cat config-2.6.32-754.30.2.el6.x86_64 | grep -i blk_mq

참고: CentOS 6 커널의 구성 파일은 noop 스케줄러를 사용하므로 blk_mq를 반환하지 않습니다.

CentOS 7의 I/O 스케줄러, 커널 3.10 이상

$cat /sys/block/nvme1n1/queue/scheduler [none] mq-deadline kyber

참고: Kybermq-deadline은 상위 커널 버전에서만 존재하는 다중 대기열 스케줄러입니다(CentOS 7의 경우 3.10 이상).

EC2 인스턴스의 실행 시간 동안 운영 체제 수준에서 스케줄러를 업데이트하려면 다음 명령을 사용합니다.

#sudo echo 'kyber'> /sys/block/xvdf/queue/scheduler

I/O 스케줄러를 영구적으로 변경하려면 grub 구성을 수정하고 elevator 파라미터를 다음 형식으로 업데이트합니다.

참고: 다음 단계는 CentOS와 RHEL용입니다.

1.    다음 명령을 실행합니다.

#sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet elevator=kyber"

2.    다음 명령을 실행합니다.

#sudo grub2-mkconfig -o /boot/grub2/grub.cfg

EC2 인스턴스가 재부팅되더라도 I/O 스케줄러는 설정된 상태로 유지됩니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?