Notice
Recent Posts
Recent Comments
Today
Total
04-27 02:22
Archives
관리 메뉴

Jeongchul Kim

AWS EC2와 Lambda iPerf3 네트워크 성능 측정 본문

AWS

AWS EC2와 Lambda iPerf3 네트워크 성능 측정

김 정출 2019. 1. 9. 16:36


AWS EC2와 Lambda iPerf3 네트워크 성능 측정


연구를 하다보니 네트워크 대역폭 측정이 필요 했습니다.

iperf는 서버(server)와 클라이언트(client) 간의 네트워크 대역폭을 측정하는 벤치마크 입니다. 지금 현재 iPerf와 iPerf3가 출시되어 있습니다. iPerf3는 달성 가능한 최대 네트워크 대역폭을 측정하며, 타이밍, 버퍼(buffer), 및 프로토콜(protocol : TCP, UDP, SCTP, IPv4, IPv6)과 관련해 다양한 튜닝을 지원합니다. 각 테스트 마다 대역폭(bandwidth)과 손실(loss)를 포함해 보고를 합니다. iPerf는 다양한 OS(Linux, MacOS X, Windows)를 지원합니다.


https://iperf.fr/


코드 버전은 Github(https://github.com/esnet/iperf)에 있습니다.

다운로드는 (https://iperf.fr/iperf-download.php)에 있습니다.


저는 현재 EC2와 EC2, EC2와 Lambda의 네트워크 대역폭 측정을 목표로 하고 있습니다.

우선 동일한 VPC에 있는 AWS EC2 간의 네트워크 처리량을 벤치마크 해봅시다.


EC2 - EC2 iPerf3 측정

https://aws.amazon.com/ko/premiumsupport/knowledge-center/network-throughput-benchmark-linux-ec2/


서버와 클라이언트가 될 2개의 인스턴스를 시작합니다.


Configure Instance에서 Network와 Subnet을 동일하게 설정합니다!! Placement group도 설정해주세요!

Security Group도 설정합니다. iperf3에서는 5201을 기본적으로 사용하고 있습니다.


AMI : Amazon Linux AMi (2018.03.0)

$ sudo yum -y upgrade


$ sudo yum -y install iperf3 --enablerepo epel


$ iperf3


AMI : Amazon Linux 2 AMI

$  wget https://iperf.fr/download/fedora/iperf3-3.1.3-1.fc24.x86_64.rpm


$  sudo rpm -Uvh iperf3-3.1.3-1.fc24.x86_64.rpm


iPerf3 시작

서버로 구성하기 위해서는 다음의 명령어를 사용합니다.

$ sudo iperf3 -s [-p <port number>]

-p, --port 포트 넘버를 명시해 다른 port를 사용할 수 있습니다. iperf3는 default로 5201 포트를 사용합니다. 다른 포트를 사용한다면 security group에서 inbound에서 port에 대한 방화벽 세팅을 해야합니다.


서버 ip 주소를 확인합니다.  bash도 internal 주소가 보입니다. ec2-user@ip-172-31-90-94


자 이제 클라이언트에서 실행합시다.

$ iperf3 -c 172.31.90.94 -t 2 -i 1 -P 2 -R


서버에 찍힌 로그를 살펴봅시다.


t2 머신 기준으로 1Gbit/s 정도 측정이 됩니다.


EC2- Lambda iPerf3

Lambda는 Python 3.6 버전으로 세팅하였고, Timeout은 시간을 30초 이상 넉넉히 주면 됩니다. 메모리 설정은 측정하시려는 사이즈로 설정하시면 될 것 같습니다.

제일 중요한 것은 Lambda에 VPC 권한 설정을 해야 합니다. AWSLambdaVPCAccessExecutionRole을 부여합니다.


현재 설정된 권한입니다. AWsLambdaFullAccess랑 AWSLambdaVPCAccessExecutionRole이 필요합니다.


Lambda에서도 Network 설정을 진행합니다. EC2에서 세팅한 VPC와 Subnets과 Security groups을 동일하게 설정합니다.


AWS Lambda

자 이제 Lambda에 코드를 올려야 합니다.

Lambda가 돌아가는 환경은 AWS가 지정한 VM에서 Container로 동작하는 환경인데 기본적으로 wget이나 sudo 권한으로 설치가 불가합니다. 데이터를 저장할 수 있는 공간은 /tmp 밖에 없으며 이 또한 500MB 이내로 제약 사항이 많습니다. 즉 iPerf3를 설치하기 힘든 사항입니다. git clone으로 가져와 빌드(build) 할 수 도 없는 상황입니다.


다행히도 iPerf3를 python 코드로 구현한 repository를 발견해 client로써 실행이 가능한 부분을 확인했습니다.

github 주소는 다음과 같습니다. https://github.com/justas-/py3iperf3


핵심적인 코드는 py3iperf3 폴더에 코드들이 들어 있습니다.


필요 없는 코드들을 정리하고 lambda_function.py가 있는
저의 깃허브 주소는 https://github.com/KimJeongChul/aws-lambda 입니다.

전체적으로 파일 구성은 다음과 같습니다.

lambda_function.py와 py3iperf3 폴더 안에 위의 코드들이 필요합니다.


실제 lambda_function.py 코드를 보시면 server_address 에 본인이 실행한 EC2 internal 주소를 입력해야 합니다.


import asyncio
from py3iperf3.iperf3_client import Iperf3Client
from py3iperf3.iperf3_api import Iperf3TestProto

def lambda_handler(event, context):
   params = {}
   params['protocol'] = Iperf3TestProto.TCP
   params['server_address'] = '172.31.90.94'
   params['test_duration'] = 2
   
   loop = asyncio.get_event_loop()
   
   iperf3_client = Iperf3Client(loop=loop)
   iperf3_client.create_test(test_parameters=params)
   
   loop.call_soon(iperf3_client.run_all_tests)
   loop.run_forever()
   
   iperf3_client.stop_all_tests()
   
   loop.close()



온라인 파일 편집기로 일일이 복붙을 하기 보다는 git clone으로 가져오고, aws cli를 이용해 Lambda 코드를 업데이트 하는 것이 간단합니다. 올리는 법은 제가 작성한 블로그 글을 참고해주세요.

코드 전체를 압축으로 묶고 $ aws lambda update-function-code을 사용하면 됩니다.

$ aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:XXXXXXXXXX:function:video_processing --zip-file fileb://VideoProcessing.zip


AWS Lambda PIL 라이브러리 빌드 image data augmentation

AWS Lambda OpenCV 라이브러리 빌드 video processing


실행을 해봅시다. 테스트 이벤트를 빈 공백으로 설정하시고,  테스트 버튼을 누르시면 됩니다.

다음에 EC2 Server에서 확인을 하면 돌아온 결과를 확인할 수 있습니다. 성능치가 t2.micro에 Lambda를 연결하다보니 생각보다 네트워크 대역폭(bandwidth)이 낮네요.


코드를 좀 더 추가하여 Lambda가 동작되는 CPU 환경을 확인해야 합니다.


def get_vm_id():
   buf = open('/proc/self/cgroup').read().split('\n')[-3].split('/')
   vm_id, c_id = buf[1], buf[2]
   return vm_id, c_id

def get_cpuinfo():
   buf = "".join(open("/proc/cpuinfo").readlines())
   cpu_info = buf.replace("\n", ";").replace("\t", "")
   cpu_info = cpu_info.split(';')[4]
   return cpu_info


저의 깃허브에 있는 코드를 실행하면 Lambda 실행 시에 iPerf3 Client로 실시간 Log를 받아볼 수 있습니다.

현재 동작 중인 Lambda가 실행 중인 VM의 CPU 모델은 Intel Xeon CPU E5-2676 v3 @ 2.40GHz입니다.


마지막에 나온 Lambda(iPerf3 Client)와 Server(iPerf3 Server)의 통계치로 network bandwidth를 측정할 수 있습니다.

최대한 Lambda의 CPU 모델과 비슷한 VM을 iPerf3 Server로 실행하는 것이 fair한 실험입니다.


Lambda CPU Model : Intel(R) Xeon(R) CPU E5-2680 v2 @2.80GHz는 c3.large VM 타입과 동일합니다.


Lambda 작업에 대해 동시 실행(concurrent lambda invoke)를 통해 네트워크 대역폭의 변화를 볼 수 있습니다.

동시 실행 1번


동시 실행 4번


동시 실행 1번 실행과 4번 실행에 따라 Lambda에서 받을 수 있는 각각의 bandwidth가 선형적으로 감소합니다.


읽어주셔서 감사합니다.









Comments