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 스토리지를 사용하려면 이러한 운영 체제(OS) 중 하나를 실행해야 합니다.
- Amazon Linux Amazon Machine Image(AMI) 이상 및 커널 4.12 이상
- CentOS - 7.0 이상 및 커널 3.10 이상
- Red Hat - 7.0 이상 및 커널 3.10 이상
- 커널 5.0이 포함된 Ubuntu 19.10 또는 커널 5.0 이상이 포함된 Ubuntu 18.04.03
**참고:**이러한 Ubuntu 버전에서는 기본적으로 다중 대기열이 켜져 있습니다.
- Ubuntu - 16.04 또는 16.10
참고: 이러한 Ubuntu 버전의 경우 다중 대기열 스케줄러가 커널 컴파일되지 않으며 별도의 모듈 로딩이 필요합니다.
- SUSE 12 또는 SUSE 11(SP3 이상 포함)
- Windows Server 2008 R2, 2012 R2 및 2016 이상
또는 커널 버전이 다중 대기열 기능이 있는 I/O 스케줄러를 지원하는지 확인하세요. 가장 일반적인 다중 대기열 I/O 스케줄러는 kyber, mq-deadline 및 BFQ(Budget Fair Queueing)입니다.
**참고:**Oracle, Linux 또는 Debian과 같은 OS의 경우 다중 대기열 I/O 스케줄러를 포함하거나 지원하는 커널 버전을 사용하세요. CentOS 및 해당 커널 버전은 다중 대기열 I/O 스케줄러를 지원합니다.
이전 버전의 OS를 사용하는 경우 Nitro 기반 인스턴스가 호스트 수준에서 다중 대기열 처리를 수행하므로 I/O 성능이 저하될 수 있습니다. 이로 인해 OS 및 호스트 수준에서 스케줄러 간에 비호환성이 발생합니다.
EBS 볼륨에 제출된 I/O 읽기 또는 쓰기 요청을 볼륨이 가로채기 전에 요청은 여러 계층을 거칩니다. Nitro 기반 인스턴스에서 다중 대기열 스케줄러가 아닌 이전 커널 버전의 경우, I/O 스케줄러(I2D) 계층에서 지연이 발생하는 경우가 있습니다. 이 지연은 blktrace, blkparse 및 btt 도구를 사용하는 테스트 및 벤치 마크 결과에서 발생합니다. 이러한 도구에 대한 자세한 내용을 보려면 die.net 웹사이트에서 blktrace, blkparse 및 btt를 참조하세요.
Nitro 기반 인스턴스의 I/O 성능을 개선하기 위해 CentOS 7에는 디바이스 드라이버가 I/O 요청을 여러 하드웨어 또는 소프트웨어 대기열에 매핑할 수 있는 다중 대기열 블록 I/O 대기열 메커니즘(blk-mq)이 있습니다. Nitro 기반 시스템에서 성능을 극대화하려면 최신 커널이 설치된 최신 OS를 사용하는 것이 좋습니다.
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를 반환하지 않습니다.
Redhat 9 및 커널 5.14 이상의 I/O 스케줄러
cat /sys/block/<EBS device name>/queue/scheduler \[none\] mq-deadline kyber bfq
스케줄러를 선택하기 전에 각 스케줄러의 세부 정보를 검토하세요. 자세한 내용을 보려면 Red Hat 웹 사이트에서 사용 가능한 디스크 스케줄러를 참조하세요.
EC2 인스턴스의 실행 시간 동안 OS 수준에서 스케줄러를 업데이트하려면 다음 명령을 실행합니다.
#sudo echo 'kyber'> /sys/block/<EBS device name>/queue/scheduler
I/O 스케줄러를 영구적으로 변경하려면 grub 구성을 수정하고 elevator 매개변수를 업데이트하세요. 다음 단계는 CentOS 및 Red Hat Enterprise Linux(RHEL)에 해당하는 내용입니다.
1. 다음 명령을 실행합니다.
#sudo vim /etc/default/grubGRUB\_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
인스턴스가 재부팅되더라도 I/O 스케줄러는 설정된 상태로 유지됩니다.