이번 글에서는 CPU Bound Application의 개념과 함께, 실제로 CPU를 많이 사용하는 애플리케이션을 만드는 방법을 설명하겠습니다.
목차 CPU Bound Application이란? CPU Bound Application 만들기 두 개의 엔드포인트 비교 |
CPU Bound Application이란?
애플리케이션은 일반적으로 두 가지 유형으로 나뉩니다: CPU Bound Application과 I/O Bound Application입니다. CPU Bound Application은 대부분의 시간을 CPU 연산에 사용하며, I/O 작업은 최소화하는 애플리케이션입니다. 반면, I/O Bound Application은 주로 데이터 입출력 작업에 시간을 많이 소비합니다.
컴퓨터 시스템의 기본 구조
애플리케이션은 하드디스크에 저장되어 있습니다. 이를 프로그램이라고 부릅니다. 프로그램을 실행하면 그 내용이 메모리에 올라가게 되는데, 이를 프로세스라고 합니다.
스케줄링
여러 프로세스가 동시에 실행될 수 있지만, CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 어떤 프로세스를 CPU에 올릴지 결정하는 과정을 스케줄링이라고 합니다.
메모리와 캐시
메모리는 CPU와 하드디스크 사이의 속도 차이를 줄여주는 역할을 합니다. 또한, 메모리와 CPU 사이의 속도 차이를 줄이기 위해 캐시 메모리가 존재합니다.
CPU와 I/O 작업
CPU는 하드디스크와 상호작용하는 동안 다른 프로세스를 실행시켜 효율적으로 사용됩니다. 이때의 읽고 쓰는 작업을 I/O(Input/Output) 작업이라고 합니다. 프로세스가 I/O 작업을 수행하는 동안 다른 프로세스가 CPU를 사용할 수 있습니다.
I/O Burst와 CPU Burst
- I/O Burst: 프로세스 실행 도중 I/O 작업을 하는 시간
- CPU Burst: 프로세스가 CPU에서 실행되는 시간
프로세스가 전체적으로 I/O를 많이 사용하는 경우를 I/O Bound Application이라고 하며, CPU를 많이 사용하는 경우를 CPU Bound Application이라고 합니다.
CPU Bound Application 만들기
CPU를 많이 사용하는 애플리케이션을 만들기 위한 여러 방법이 있지만, 이번에는 해시 연산을 많이 반복하는 애플리케이션을 만들어 보겠습니다. 특히, MD5 해시 연산을 10만 번 수행하는 애플리케이션을 만들어보겠습니다.
MD5 해시 연산 애플리케이션
MD5 해시 연산을 반복하여 CPU 사용을 극대화하는 간단한 Java 애플리케이션 예제입니다.
출처: https://github.com/lleellee0/cpu-bound-application
GitHub - lleellee0/cpu-bound-application
Contribute to lleellee0/cpu-bound-application development by creating an account on GitHub.
github.com
@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;
}
}
이 클래스는 두 개의 엔드포인트를 제공합니다:
- /hash/{input}: 입력 문자열에 대해 MD5 해시 연산을 10만 번 수행한 결과를 반환합니다.
- /hello: 단순히 "hello" 문자열을 반환합니다.
JAR 파일 생성
애플리케이션을 배포하기 위해 애플리케이션을 JAR파일로 만들겠습니다.
IDE에서 maven -> cpu -> lifecycle -> deploy를 클릭하여 JAR 파일을 생성할 수 있습니다. 생성된 JAR 파일은 target 디렉토리에 있습니다.
GCP 인스턴스 설정 및 애플리케이션 배포
애플리케이션을 GCP 인스턴스에 배포하여 실행해보겠습니다.
1. GCP 인스턴스에 접속
2. 필요한 패키지 설치 및 환경 설정
sudo apt update
sudo apt install wget
sudo apt install openjdk-8-jdk
3. 애플리케이션 다운로드 및 실행
wget https://github.com/lleellee0/class101-files/raw/main/cpu-0.0.1-SNAPSHOT.jar
sudo java -jar cpu-0.0.1-SNAPSHOT.jar
두 개의 엔드포인트 비교
이제 만든 애플리케이션을 실행해보겠습니다.
입력 문자열에 대해 MD5 해시 연산을 10만 번 수행한 결과를 반환하는 ' /hash/{input}'와 단순히 "hello" 문자열을 반환하는 '/hello' 두 엔드포인트를 비교해보겠습니다.
1. /hash/{input}
2. /hello
'/hello' 가 ' /hash/{input}' 보다 속도가 빠르다는 것을 확인할 수 있습니다.
이 글은 https://class101.net/ko/products/5fc4a3b4fc231b000d85661b 강의를 정리한 내용입니다.