## ⭐️ M 범용
- 컴퓨팅, 메모리 및 네트워크 리소스를 균형 있게 제공
- 적용사례 : 중소형 DB, 기타 엔터프라이즈 애플리케이션
## ⭐️ C 컴퓨팅 최적화
- 가장 높은 수준의 컴퓨팅 성능을 제공
- 적용사례 : 고성능 프론트 엔드, 웹서버, 배치(일괄처리), 게임
## ⁉️ M5 vs C5
| 인스턴스 크기 | vCPU | 메모리(GiB) | 인스턴스 스토리지(GB) |네트워크 대역폭(Gbps)** | EBS 대역폭(Mbps) | 시간 당 요금 | CPU 아키텍처 |
|---|---|---|---|---|---|---|---|
|m5.large|2|8|EBS 전용|최대 10|최대 4,750|USD 0.096| x86(64bit) |
|c5.large|2|4|EBS 전용|최대 10|최대 4,750|USD 0.085| x86(64bit) |
## ✨ M5
- Amazon EC2 M5 인스턴스는 인텔 제온® 플래티넘 8175M 또는 8259CL 프로세서로 구동되는 최신 세대 범용 인스턴스입니다. 이 인스턴스는 컴퓨팅, 메모리 및 네트워크 리소스를 균형 있게 제공하며 다양한 애플리케이션에 적합합니다.
### 기능:
- 메모리 최적화를 중점으로 한 인스턴스
- 일반적으로 메모리 접근이 더 빠르고 메모리 사용량에 더 많은 리소스를 할당하므로 메모리 집약적인 작업을 수행할 때 더 빠른 실행 시간을 보임
- 데이터베이스, 캐시 서버, 대규모 데이터 처리 등의 작업을 수행할 때 더 효과적
### 예시:
- 대규모 데이터베이스: 시스템에서 데이터를 메모리에 적재하고 빠르게 액세스할 수 있어야 함.
- 메모리 캐싱: 캐싱 서버는 많은 양의 데이터를 메모리에 저장하여 빠른 응답 시간을 제공해야 함.
- 대규모 데이터 처리: 데이터를 메모리에 로드하여 빠르게 처리해야 함.
## ✨ C5
- Amazon EC2 C5 인스턴스는 컴퓨팅 집약적 워크로드에 최적화되었으며 컴퓨팅 비율당 저렴한 가격으로 비용 효율적이며 뛰어난 성능을 제공합니다.
### 기능:
- 컴퓨팅 최적화를 중점으로 한 인스턴스
- CPU 연산에 더 많은 리소스를 할당하고 CPU 성능이 뛰어남
- 고성능 컴퓨팅, 컴파일 작업, 웹 서버 등의 작업을 수행할 때 더 효과적
### 예시:
- 고성능 컴퓨팅 (HPC): 고성능 컴퓨팅 작업은 대규모 데이터를 처리하고 병렬 컴퓨팅을 수행해야 함.
- 컴파일 작업: CPU 연산이 많이 필요한 작업, 소프트웨어 개발 및 빌드 시스템에서는 코드를 컴파일하는 데 많은 CPU 자원이 필요.
- 웹 서버: 웹 서버는 동시 요청을 처리하고 빠른 응답을 제공해야 함.
## 1️⃣ cpu 연산 처리 속도 측정
- 확인 코드
```python
import time
# 실행할 작업
def task_instance_1():
start_time = time.time()
result = 0
for i in range(1000000000): # 10억 번 반복해서 정수 덧셈 수행
result += i
end_time = time.time()
execution_time = end_time - start_time
return execution_time
print(task_instance_1())
```
- M5
<Img src = "https://hackmd.io/_uploads/r133OiXk0.png" width="700"/>
- C5
<Img src = "https://hackmd.io/_uploads/rJCsOiXJC.png" width="1200"/>
#### 🤔 결론
- cpu 연산 처리 속도: `M5` < `C5`
## 2️⃣ 네트워크 요청 처리 속도
### ☝🏻 동기 코드
```python3
import requests
import time
def send_request(url):
response = requests.get(url)
return response.text
if __name__ == "__main__":
num_requests = 1000
url = "http://서버의_IP_또는_도메인:포트번호/"
start_time = time.time()
for _ in range(num_requests):
response_text = send_request(url)
# 응답을 받은 후의 처리 작업
print("응답:", response_text)
end_time = time.time()
total_time = end_time - start_time
print(f"총 소요 시간: {total_time:.2f} 초")
```
- M5
<Img src = "https://hackmd.io/_uploads/r1PcUiX1C.png" width="1200"/>
- C5
<Img src = "https://hackmd.io/_uploads/SyWsIomy0.png" width="450"/>
#### 🤔 문제점
- 동기적으로 요청을 보낼 시 네트워크 `request` 처리 속도를 비교하기가 까다로웠음
### ✌🏻 비동기 코드
```python
import asyncio
import aiohttp
import time
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main(num_requests):
url = "http://43.203.217.70:5000/" # 요청을 보낼 URL
start_time = time.time() # 시작 시간 기록
tasks = [fetch(url) for _ in range(num_requests)]
await asyncio.gather(*tasks)
end_time = time.time() # 종료 시간 기록
total_time = end_time - start_time # 총 소요 시간 계산
print(f"총 소요 시간: {total_time:.2f} 초")
if __name__ == "__main__":
num_requests = 240 # 보낼 요청의 수
asyncio.run(main(num_requests))
```
- M5
<Img src = "https://hackmd.io/_uploads/rkQfFs71C.png" width="600"/>
`10번 평균 시간: 45.9 초`
- C5
<Img src = "https://hackmd.io/_uploads/SyPWYomkC.png" width="600"/>
`10번 평균 시간: 29.2 초`
#### 🤔 결론
- 비동기처리로 한번에 240개의 요청을 처리해주는 시간을 비교했을때 네트워크 요청 처리 속도는 C5 인스턴스가 M5 인스턴스 보다 `36.37%` 정도 시간을 줄일 수 있었습니다.