๐ ํด๋น ๊ธ์ ํ์ง ๋๊ธฐ์ ๊ฐ๋ฐ์ ํธ์ ํจ๊ปํ๋ ์ง์ง ๋ฐฑ์๋ ์์คํ ์ค๋ฌด! ๊ฐ์๋ฅผ ์๊ฐํ๊ณ ๋ด์ฉ์ ์์ฝํ ๊ธ์ ๋๋ค.
๐ ์ฝ๋ ์์ฑ
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
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
Json์ผ๋ก ์ฑ๋ฅํ ์คํธ๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ธฐ๋กํ ์ฑ๋ฅ ํ ์คํธ json์ html๋ก ๋ณ๊ฒฝํด์ฃผ๋ ํ๋ฆ์ ๊ฐ์ง๋ค.
๐ HTML๋ก ๋ณด๊ธฐ ์ฝ๊ฒ ๋ณ๊ฒฝํ ๊ทธ๋ํ
์๋ต ์ต๋ ์๊ฐ์ด 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' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์์ฒด์ ] ์ค์ผ์ค๋ง (0) | 2024.11.26 |
---|---|
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์ ํ์์ ์์ธ, ์์ฑ ๊ฐ ์ข ์ (0) | 2024.09.25 |