본문 바로가기
CS

CPU를 극단적으로 사용하기

by sangyunpark99 2024. 8. 28.

📍 해당 글은 현직 대기업 개발자 푸와 함께하는 진짜 백엔드 시스템 실무! 강의를 수강하고 내용을 요약한 글입니다.

 

🔎 코드 작성

CPU를 극단적으로 사용하기 위해 아래와 같은 코드를 작성하였다.

package class101.foo.cpu;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

@RestController
public class HashController {

    @RequestMapping("/hash/{input}")
    public String getDigest(@PathVariable("input") String input) throws NoSuchAlgorithmException {
        for(int i = 0; i < 100_000; i++) {
            input = getMD5Digest(input);
        }
        return input;
    }

    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }

    private String getMD5Digest(String input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(input.getBytes());
        byte[] digest = md.digest();
        String myHash = DatatypeConverter
                .printHexBinary(digest).toUpperCase();

        return myHash;
    }
}

 

API를 요청시에 들어온 input값을 10만번 MD5 해시화를 해주고 반환해준다.

 

🔎 서버 실행

 

application.propertise

server.port = 80

 

 

🔎 GCP에 배포하려다가 AWS에 배포하기

.jar 파일로 빌드한 후, GCP에 배포해준다.

 

💥 wget을 다운 받는데 다운이 안되는 이슈로, AWS EC2로 플랫폼을 옮겨주었다.

 

AWS EC2를 생성하고, github과 ssh를 연동해준 뒤, ssh를 이용해서 빌드해준 cpu-0.0.1-SNAPSHOT.jar 파일을 다운로드 해주었다.

서버를 실행하고, 접속이 정상적으로 잘 되는지 확인해 주었다.

 

 

🔎 실행 속도 확인

약 66ms가 걸렸다.

 

🔎 Artillery 테스트 툴로 성능 측정하기

node.js 기반의 Artillery를 다운받아 주었다.

 

사용 방법은 공식문서에 나와있는 Run Your First Test 목차를 참고했다.

https://www.artillery.io/docs/get-started/core-concepts

 

Welcome – Artillery Docs

Learn how to get up and running with Artillery with reference docs, guides, tutorials and other resources

www.artillery.io

config:
  target: http://[aws 인스턴스 주소 입력]
  phases:
    - duration: 60
      arrivalRate: 1
      name: warm up
scenarios:
  - flow:
      - get:
          url: "/hash/123"

 

공식문서에 의하면 duration과 arrivalRate가 의미하는 것은 다음과 같다. 

300초 동안 지속되는 로드 단계로 매초마다 10명의 새로운 가상 사용자가 실행됩니다.

 

내가 적용한 json은 다음과 같다.

60초 동안 지속되는 로드 단계로 매초마다 1명의 새로운 가상 사용자가 실행된다.

 

 

실행해서 나온 json기반의 결과를 html 기반의 결과롤 변환해주었다.

https://www.artillery.io/docs/reference/cli/report

 

Welcome – Artillery Docs

Learn how to get up and running with Artillery with reference docs, guides, tutorials and other resources

www.artillery.io

 

Json으로 성능테스트를 기록하고, 기록한 성능 테스트 json을 html로 변경해주는 흐름을 가진다.

 

🔎 HTML로 보기 쉽게 변경한 그래프

arrivalRate: 1

응답 최대 시간이 101ms가 된다.

 

🔎 Arrival Rate를 조절하면서 부하주기

제일 중요한 지표는 응답시간이라고 생각해서, 응답 시간의 지표를 비교해보았다.

간단하게 max 지표만 비교해 보자

 

⭐️ arrival Rate가 1인 경우, 테스트 해보기

 

 

⭐️ arrival Rate를 4인 경우, 테스트 해보기

응답 최대 시간이 180ms가 된다.

 

⭐️ arrival Rate를 10으로 늘린 후, 테스트 해보기

응답 최대 시간이 190ms가 된다.

 

 

arrival Rate수를 늘릴 수록 응답 시간의 최댓값이 증가하는 것을 확인할 수 있다.

 

🔎 실무에서 성능 테스트를 하는 방법

- 예상 TPS보다 여유롭게

- 기대 Latency를 만족할 때까지

- Scale-out을 해도 성능이 늘지 않으면 병목현상 의심

 

🔎 용어 정리

❓TPS : Transaction Per Second의 약자, 1초당 처리할 수 있는 트랜잭션

계산 방법 : 구간 내의 트랜잭션 수(transaction) / 구간 초(sec)

Latency : 하나의 데이터 패킷이 출발지에서 도착지까지 가는 데 걸리는 시간

병목 현상 : 시스템의 CPU나 메모리, 디스크 등의 자원 중 하나가 다른 자원들에 비해 처리 속도가 느려서, 전체적인 성능을 제한하는 경우

 

'CS' 카테고리의 다른 글

[DB] 트랜잭션  (0) 2025.02.09
[네트워크]TCP/IP & HandShaking  (0) 2025.02.01
[네트워크] OSI 7계층  (2) 2025.01.27
[운영체제] 스케줄링  (0) 2024.11.26
데이터베이스 이상 현상의 원인, 속성 간 종속  (0) 2024.09.25