Amazon Web Services 한국 블로그

Elastic Network Adapter를 활용한 고성능 네트워크 구성하기

많은 고객 분들은 네트워크 성능을 최대한 활용하기를 원합니다. Amazon EC2는 다양하고 새로운 인스턴스 타입을 지속적으로 추가하고 있습니다. AWS는 CC1 instance를 시작으로 10Gbps 네트워크를 채택하고 Enhanced Networking 기능을 소개했습니다. Enhanced Networking은 Intel 82599 VF Interface와 SR-IOV 기술을 활용합니다. I/O 성능은 높이고, CPU자원 소모는 줄일 수 있습니다. 더 넓은 네트워크 대역폭을 지원하며, PPS(Packet per second) 성능이 뛰어나고 인스턴스간의 통신 시 Latency도 낮습니다.

최근 고객 분들의 여러 의견을 듣고 새로운 기술을 활용해 Elastic Network Adapter(ENA)를 채택한 새로운 인스턴스 타입들을 추가했습니다. vCPU가 점점 많아지면서 vCPU의 리소스를 보다 효과적으로 분산하여 사용하여 성능을 높일 수 있는 기술입니다. ENA를 활용하기 위해서는 몇가지 설정이 필요합니다. 쉽게 설정 하실 수 있도록 구성하는 방법을 소개해 드립니다.

Elastic Network Adapter(ENA)를 지원하는 EC2 인스턴스
2016년 12월 현재 ENA는 최대 20Gbps 네트워크 성능을 지원하며, P2, R4, X1, 그리고 m4.16xlarge에서 ENA를 지원하고 있습니다. 또한 최신 Amazon Linux HVM AMI(Amazon Machine Image)는 기본적으로 ENA를 사용할 수 있도록 구성되어 있습니다.

Elastic Network Adapter(ENA) 활성화 하기
Amazon Linux의 이전 버젼 또는 다른 Linux 배포판의 경우 ENA를 사용하기 위해서는 아래와 같이 설정이 필요합니다. 이 블로그에서는 RedHat Enterprise Linux Server 7.3 AMI를 를 사용해 x1.16xlarge 인스턴스를 구동했습니다. Public IP와 Key file을 이용하여 인스턴스에 SSH 접속합니다.

$ ssh -i {$key_file} ec2-user@54.161.110.6
[ec2-user@ip-10-10-10-10 ~]$
[ec2-user@ip-10-10-10-10 ~]$ uname -na
Linux ip-10-10-10-10.localdomain 3.10.0-514.el7.x86_64 #1 SMP Wed Oct 19 11:24:13 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-10-10-10-10 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
launching_x1_instance

X1 인스턴스 구동

1. ENA 드라이버 확인하기
아래 명령으로 현재 ENA 드라이버가 설정되어 있는지 확인합니다. Vif라고 이름이 나온다면 현재는 기본 Driver로 ENA를 사용할 수 없는 상태입니다.

[ec2-user@ip-10-10-10-10 ~]$ ethtool -i eth0
driver: vif
version:
firmware-version:
expansion-rom-version:
bus-info: vif-0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

2. Linux 최신 업데이트 하기
아래 명령으로 Linux의 설치된 패키지들을 최신으로 업데이트합니다. 업데이트 완료 후 intstance를 reboot 합니다.

[ec2-user@ip-10-10-10-10 ~]$ sudo yum update -y
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Resolving Dependencies
--> Running transaction check
---> Package NetworkManager.x86_64 1:1.4.0-12.el7 will be updated
---> Package NetworkManager.x86_64 1:1.4.0-13.el7_3 will be an update
---> Package NetworkManager-config-server.x86_64 1:1.4.0-12.el7 will be updated
---> Package NetworkManager-config-server.x86_64 1:1.4.0-13.el7_3 will be an update
---> Package NetworkManager-libnm.x86_64 1:1.4.0-12.el7 will be updated
---> Package NetworkManager-libnm.x86_64 1:1.4.0-13.el7_3 will be an update
---> Package NetworkManager-team.x86_64 1:1.4.0-12.el7 will be updated
---> Package NetworkManager-team.x86_64 1:1.4.0-13.el7_3 will be an update
---> Package NetworkManager-tui.x86_64 1:1.4.0-12.el7 will be updated
---> Package NetworkManager-tui.x86_64 1:1.4.0-13.el7_3 will be an update
………

3. 드라이버 다운로드
Github 에 공개되어 있는 ENA Linux driver 를 git 툴을 통해 가져옵니다. 그리고 컴파일을 위해서 gcc와 kernel-devel 패키지를 설치합니다.

[ec2-user@ip-10-10-10-10 ~]$ git clone https://github.com/amzn/amzn-drivers
Cloning into 'amzn-drivers'...
remote: Counting objects: 57, done.
remote: Total 57 (delta 0), reused 0 (delta 0), pack-reused 57
Unpacking objects: 100% (57/57), done.

드라이버를 컴파일 하기 위해 gcc 컴파일러와 Kernel-devel 패키지를 먼저 설치합니다.

[ec2-user@ip-10-10-10-10 ena]$ sudo yum install gcc -y
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Resolving Dependencies
--> Running transaction check
---> Package gcc.x86_64 0:4.8.5-11.el7 will be installed
--> Processing Dependency: cpp = 4.8.5-11.el7 for package: gcc-4.8.5-11.el7.x86_64
--> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc-4.8.5-11.el7.x86_64
--> Processing Dependency: libmpc.so.3()(64bit) for package: gcc-4.8.5-11.el7.x86_64
--> Processing Dependency: libmpfr.so.4()(64bit) for package: gcc-4.8.5-11.el7.x86_64
….
[ec2-user@ip-10-10-10-10 ena]$ sudo yum install kernel-devel -y
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Resolving Dependencies
--> Running transaction check
---> Package kernel-devel.x86_64 0:3.10.0-514.2.2.el7 will be installed
--> Finished Dependency Resolution

4. 드라이버 컴파일
드라이버 소스 코드가 있는 디렉토리로 이동합니다. 그리고 make명령을 통해서 driver를 compile합니다.

[ec2-user@ip-10-10-10-10 ena]$ make
make -C /lib/modules/3.10.0-514.2.2.el7.x86_64/build M=/home/ec2-user/amzn-drivers/kernel/linux/ena modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-514.2.2.el7.x86_64'
CC [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/ena_netdev.o
CC [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/ena_ethtool.o
CC [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/../common/ena_com//ena_com.o
CC [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/../common/ena_com//ena_eth_com.o
CC [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/ena_sysfs.o
LD [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/ena.o
Building modules, stage 2.
MODPOST 1 modules
CC      /home/ec2-user/amzn-drivers/kernel/linux/ena/ena.mod.o
LD [M]  /home/ec2-user/amzn-drivers/kernel/linux/ena/ena.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.2.2.el7.x86_64'

컴파일이 완료되면 ena.ko 드라이버 파일이 생성됩니다. Modinfo 명령으로 드라이버를 확인합니다.

[ec2-user@ip-10-10-10-10 ena]$ modinfo ena.ko
filename:       /home/ec2-user/amzn-drivers/kernel/linux/ena/ena.ko
version:        1.1.2
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
rhelversion:    7.3
srcversion:     25093B15753CC7D0357E01C
alias:          pci:v00001D0Fd0000EC21sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000EC20sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00001EC2sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00000EC2sv*sd*bc*sc*i*
depends:
vermagic:       3.10.0-514.2.2.el7.x86_64 SMP mod_unload modversions
parm:           debug:Debug level (0=none,...,16=all) (int)

5. 드라이버 설치 및 로드 설정
현재 makefile에서는 make install은 구성되어 있지 않습니다. README파일을 참조하여 아래와 같이 부팅 시 드라이버가 로드될 수 있도록 설정하고 드라이버를 리눅스의 드라이버 모듈 디렉토리 밑으로 복사합니다.

    1. sudo vi /etc/modules-load.d/ena.conf 로 ena.conf생성
    2. ena.conf 파일에 ena 입력 후 저장
    3. sudo cp ena.ko /lib/modules/`uname -r`/ 로 드라이버 복사
    4. sudo depmod 드라이버 디펜던시 체크
    5. reboot OS

6. 인스턴스 enaSupport 설정 활성화
인스턴스의 enaSupport 설정값을 변경하기 위해서는 먼저 인스턴스를 Stop합니다. Stop이 완료 된 후에, 아래와 같은 명령으로 enaSupport를 활성화합니다.

$ aws ec2 modify-instance-attribute --instance-id instance_id --ena-support

7. 인스턴스 Start
이제 인스턴스를 다시 시작하면 ENA가 활성화되어 사용할 수 있습니다. 아래 명령으로 직접 확인할 수 있습니다.

[ec2-user@ip-10-10-10-10 ~]$ ethtool -i eth0 
driver: ena 
version: 1.1.2 
firmware-version: 
expansion-rom-version: 
bus-info: 0000:00:03.0 
supports-statistics: yes 
supports-test: no 
supports-eeprom-access: no 
supports-register-dump: no 
supports-priv-flags: no

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 김일호 솔루션즈 아키텍트께서 작성해주셨습니다.
andy_kim_photo