Performance Test

๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๊ฐ•์˜๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Intro

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ํˆด์„ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ์ž ์ˆ˜์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์š”์ฒญ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ๊ณ„์‚ฐ์„ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ˆ˜์˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ์ง€ ํ…Œ์ŠคํŠธ

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

  • ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ๊ฐœ์„  (GC ..)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๊ฐœ์„  (Index, DeadLock ..)

  • ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ฐœ์„  (๋น„๋™๊ธฐ์ ์ธ ๊ตฌ์กฐ, Circuit Breaker ..)

์ฐธ๊ณ .

  • ํŠธ๋ž˜ํ”ฝ: ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ๋ฅด๋Š” ๋ฐ์ดํ„ฐ

  • ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ๊ณ  ์ ์Œ์˜ ๊ธฐ์ค€์€ ์ƒ๋Œ€์ 

  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ = ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ = ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

๋ฐฐ๊ฒฝ์ง€์‹

์ง€์—ฐ์‹œ๊ฐ„๊ณผ ์ฒ˜๋ฆฌ๋Ÿ‰

์ง€์—ฐ์‹œ๊ฐ„(Latency)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๋ฐ›๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„

  • ์ฃผ๋กœ ms, s ๋‹จ์œ„

์–ด๋–ค ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์–ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์ด ๋˜๊ธฐ๊นŒ์ง€ 1์ดˆ๊ฐ€ ๊ฑธ๋ ธ๋‹ค๋ฉด ์ด ์š”์ฒญ์˜ ์ง€์—ฐ์‹œ๊ฐ„์€ 1์ดˆ

์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)

  • ๋‹จ์œ„ ์‹œ๊ฐ„๋™์•ˆ ๋ช‡๊ฑด์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ (๋ฐ์ดํ„ฐ์˜ ์ „์†ก๋Ÿ‰)

  • ์ฃผ๋กœ TPS(Transaction Per Second) ๋‹จ์œ„

์–ด๋–ค API๊ฐ€ 1์ดˆ ๋™์•ˆ 1,000๊ฐœ์˜ API ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ 1,000์˜ ์š”์ฒญ์„ ๋ฌธ์ œ์—†์ด ์ฒ˜๋ฆฌํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด
์ด API์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์€ 1,000 TPS

์ฐธ๊ณ . ๋Œ€์—ญํญ(Bandwidth)

  • ๋„คํŠธ์›Œํฌ์—์„œ ์œ ์˜๋ฏธํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…

    • ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์˜ ๊ฐ„์„ญ์œผ๋กœ ์ •ํ™•ํ•œ ๋Œ€์—ญํญ ์ธก์ •์ด ์–ด๋ ค์›€

  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹จ์œ„์‹œ๊ฐ„ ๋™์•ˆ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ํ•œ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰

  • ํ•ด๋‹น ๋„คํŠธ์›Œํฌ๋ฅผ ์ตœ๋Œ€ํ•œ์œผ๋กœ ํ™œ์šฉํ–ˆ์„ ๋•Œ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ ์†๋„๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€

  • ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ณ„์† ์˜ฌ๋ฆฌ๋ฉด์„œ ํ…Œ์ŠคํŠธํ•˜๋‹ค ๋ณด๋ฉด ๋Œ€์—ญํญ์— ๊ฐ€๊นŒ์›Œ์งˆ ์ˆ˜ ์žˆ์Œ

.

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋ชฉํ‘œ

  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋ชฉํ‘œ๋Š” ์˜ˆ์ƒ๋˜๋Š” ์„œ๋น„์Šค ์ด์šฉ์ž์˜ ์ˆซ์ž์™€ ์‚ฌ์šฉ์ž๋“ค์ด ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ฐ์‹œ๊ฐ„

  • ์„ฑ๋Šฅ์„ ์ธก์ • ์‹œ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ์ง€์—ฐ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์ธก์ •

  • ์‚ฌ์šฉ์ž๋“ค์ด ๋ถˆํŽธํ•จ์„ ๋Š๋ผ์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋Š ์ •๋„์˜ ์ง€์—ฐ์‹œ๊ฐ„ ๋ฏธ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์˜ ์‹

  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—๋Š” ๋งŽ์€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 95~99% ์ˆ˜์ค€์˜ ๋ชฉํ‘œ๋ฅผ ์ ์šฉ

์ดˆ๋‹น 3000๊ฐœ์˜ ์š”์ฒญ(์ฒ˜๋ฆฌ๋Ÿ‰)์ด ๋“ค์–ด์˜ฌ ๋•Œ 99%์˜ ์š”์ฒญ์ด
100ms ๋ฏธ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ(์ง€์—ฐ์‹œ๊ฐ„)๋˜์–ด์•ผ ํ•จ

์š”์ฒญ์„ ์ดˆ๋‹น 1๊ฐœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ง€์—ฐ์‹œ๊ฐ„์ด ๋‚ฎ๊ฒŒ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ,

์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๋ฉด ์ง€์—ฐ์‹œ๊ฐ„๋„ ํ•จ๊ป˜ ๋Š˜์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

์šด์˜์ฒด์ œ์™€ ์„œ๋ฒ„ ์ž์›

์šด์˜์ฒด์ œ(OS, Operating System)

  • ์„œ๋ฒ„์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ž์›์„ ๊ด€๋ฆฌํ•˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ๋‹จ์œ„๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰

์ž์›
๋‚ด์šฉ
์‚ฌ์šฉ

CPU

ํ”„๋กœ์„ธ์Šค ์‹คํ–‰

๊ณ„์‚ฐ ์ž‘์—…, ์ด๋ฏธ์ง€, ์˜์ƒ ์ธ์ฝ”๋”ฉ

์•”ํ˜ธํ™”, ํ•ด์‹œํ™”

RAM

ํ”„๋กœ์„ธ์Šค = ๋ฉ”๋ชจ๋ฆฌ(Stack, Heap..) + ์ฝ”๋“œ

CPU์™€ ํ•จ๊ป˜ ๋งŽ์ด ์‚ฌ์šฉ

์ธ์Šคํ„ด์Šค ๋Œ€๋Ÿ‰ ์ƒ์„ฑ, ์บ์‹ฑ, ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด ๋“ฑ

DISK

Program

ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋กœ๊ทธ ๋Œ€๋Ÿ‰ ๋ฐœ์ƒ

DB ๋ฐ์ดํ„ฐ ๋Œ€๋Ÿ‰ ์ž…์ถœ๋ ฅ

CPU

  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง„ ์ฝ”๋“œ์— ๋”ฐ๋ผ ์‹คํ–‰์‹œํ‚ค๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ

RAM

  • ํ”„๋กœ์„ธ์Šค: ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ (๋ฉ”๋ชจ๋ฆฌ + ์ฝ”๋“œ)

    • ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฝ”๋“œ์— ๋”ฐ๋ผ ์ˆ˜๋™์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ˜•ํƒœ

  • ํŽ˜์ด์ง•: ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ ์ค‘ ์ผ๋ถ€๋ฅผ ๋””์Šคํฌ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •

DISK

  • ํ”„๋กœ๊ทธ๋žจ: ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด ์ง‘ํ•ฉ(exe, jar ..)

  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ๋ฉ”๋ชจ๋ฆฌ ์œ„๋กœ ์˜ฌ๋ผ์™€์„œ ์‹คํ–‰(=ํ”„๋กœ์„ธ์Šค)

์ง€์—ฐ์‹œ๊ฐ„, ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ์˜ ๊ด€๊ณ„

  • (1) ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฆ๊ฐ€

  • (2) ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€

  • (3) ์„œ๋ฒ„ ์ž์› ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

  • (4) ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ ๊ฐ„ ์ž์› ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ฆ๊ฐ€

    • ๊ฒฝ์Ÿ์ ์ธ ์ƒํƒœ -> ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ธฐ๋Œ€ ์ด์ƒ์œผ๋กœ ๊ฐ์†Œ

  • (5) ์ง€์—ฐ ์‹œ๊ฐ„ ์ฆ๊ฐ€

  • (6) ๋ฏธ์ฒ˜๋ฆฌ ์š”์ฒญ ์ฆ๊ฐ€

  • (7) ์š”์ฒญ ์ค‘ ์ผ๋ถ€ ์‹คํŒจ

ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ์œ„ํ•ด CPU, Memoery, Disk๊ฐ€ ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹œ ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž์› ์ค‘ ์‚ฌ์šฉ๋ฅ ์ด ๋†’์•„์ง€๋Š” ์ž์›์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ž์›์˜ ์‚ฌ์šฉ๋ฅ ์„ ๋‚ฎ์ถ”๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ณด์ž.

ํšจ๊ณผ์ ์œผ๋กœ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ์„œ๋ฒ„ ์ž์›์— ๋Œ€ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง๋„ ์ค‘์š”.

๋„คํŠธ์›Œํฌ

๋„คํŠธ์›Œํฌ๋Š” ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ ์ค‘์š”ํ•œ ์š”์†Œ

  • ๋„คํŠธ์›Œํฌ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๊ฑฐ๋ฆฌ์˜ ์ œ์•ฝ์„ ๋งŽ์ด ๋ฐ›์Œ(๋ผ์šฐํ„ฐ์—์„œ์˜ ์—ฐ์‚ฐ๋„ ํ•„์š”)

API ๋‚ด์—์„œ ์™ธ๋ถ€ ์„œ๋ฒ„(๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค, ์™ธ๋ถ€ API) ํ˜ธ์ถœ ์‹œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ๋ฐœ์ƒ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ DB ์‘๋‹ต์ด ๋นจ๋ผ์ง€๋„๋ก ๊ฐœ์„  ๊ฐ€๋Šฅ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์ž์›
์‚ฌ์šฉ

CPU

์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ธ์ง€ ํ™•์ธ

RAM

๋ฐ์ดํ„ฐ๋ฅผ CPU๊ฐ€ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ ํ˜น์€ ์บ์‹œ

DISK

๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์—ฐ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ์ƒํ™ฉ

  • ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ (์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€)

  • ๋งŽ์€ ๋ฐ์ดํ„ฐ ์ค‘ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๊ฒฝ์šฐ

    • ์ธ๋ฑ์Šค๋กœ ๊ฐœ์„  ๊ฐ€๋Šฅ

  • ํ•œ๋ฒˆ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต์œผ๋กœ ์ค˜์•ผ ํ•  ๊ฒฝ์šฐ

  • ๋ฝ์ด ๋„ˆ๋ฌด ์ž์ฃผ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ

์Šค๋ ˆ๋“œ ํ’€๊ณผ ์ปค๋„ฅ์…˜ ํ’€

๊ธฐ๋ณธ ์„ค์ •๊ฐ’์ด ์žˆ๋‹ค๋ณด๋‹ˆ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ ํŠœ๋‹์ด ํ•„์š”ํ•œ ์ž์›

  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์š”์†Œ

Thread Pool

  • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž์›

  • ํ†ฐ์บฃ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ 200๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ

  • ์Šค๋ ˆ๋“œ๋“ค์€ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋ฐ˜๋‚ฉ

  • ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ

    • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์‚ฌ์šฉ์ค‘์ธ ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์ผ๋ถ€ ์š”์ฒญ์€ ํ์— ์ €์žฅ๋˜์ง€๋งŒ ํ๋„ ๋ชจ๋‘ ์ฐฐ ๊ฒฝ์šฐ ์ดํ›„ ์š”์ฒญ์€ ๋ฒ„๋ ค์ง€๊ฒŒ ๋œ๋‹ค.

    • ์Šค๋ ˆ๋“œ ์–‘์„ ๋ฌด์ž‘์ • ๋Š˜๋ฆฌ๊ฒŒ ๋˜๋ฉด ์ ์€ ์–‘์˜ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

    • ์ด ๊ฒฝ์šฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐœ์„ ์ด ํ•„์š”

Connectino Pool

  • ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ์ž์›

  • ์Šค๋ ˆ๋“œ ํ’€๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ ์กด์žฌ

์Šค๋ ˆ๋“œ ํ’€๊ณผ ์ปค๋„ฅ์…˜ ํ’€์€ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•œ ์ˆซ์ž๋ฅผ ์ฐพ์•„ ์„ค์ •ํ•˜์ž.

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์˜ ๋ฐฉํ–ฅ์„ฑ

(1) ํ•œ ๊ฑด์”ฉ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์ง€์—ฐ์‹œ๊ฐ„์ด ์–ด๋Š์ •๋„ ๋‚˜์˜ค๋Š”์ง€ ํ…Œ์ŠคํŠธ

(2) ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๋ฉด์„œ ํ˜„์žฌ ์ธํ”„๋ผ ๊ตฌ์„ฑ์—์„œ ์ง€์—ฐ์‹œ๊ฐ„์ด ์น˜์†Ÿ๋Š” ์ง€์  ์ฐพ๊ธฐ

(3) ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ณ‘๋ชฉ์ด ๋˜๋Š”๊ฑด์ง€ ๊ฐ€์„ค์„ ์„ธ์›Œ๋ณด๊ณ  ์„œ๋ฒ„ ์ž์› ๋ชจ๋‹ˆํ„ฐ๋ง, ๋กœ๊ทธ ๋“ฑ์„ ํ†ตํ•ด ๋ณ‘๋ชฉ ์ง€์  ํƒ์ƒ‰

(4) ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ ์šฉ

Artillery

Get Started > Get Artillery

# install node
$ brew install node

# check node version
$ node -v

# install artillery
$ npm install -g artillery@1.7.6

# check artillery version
$ artillery --version

First Artillery Test

Create an Artillery test script

๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

config:
  target: 'http://localhost:8080'
  phases:
    # 60์ดˆ๋™์•ˆ ๋งค ์ดˆ๋งˆ๋‹ค 5๊ฐœ ์š”์ฒญ(Throughput: 5)
    - duration: 60
      arrivalRate: 5
scenarios:
  - flow:
    - get:
        url: "/hello"

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰

$ artillery run --output report.json test-config.yaml 
  • test-config.yaml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋กœ report.json ํŒŒ์ผ ์ƒ์„ฑ

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋กœ๊ทธ

...

Report @ 00:00:00(+0000) 2024-00-00
Elapsed time: 1 minute, 0 seconds
  Scenarios launched:  50
  Scenarios completed: 50
  Requests completed:  50
  Mean response/sec: 5
  Response time (msec):
    min: 0
    max: 4
    median: 2
    p95: 3
    p99: 4
  Codes:
    200: 50

...

All virtual users finished
Summary report @ 00:00:00(+0000) 2024-00-00
  Scenarios launched:  300
  Scenarios completed: 300
  Requests completed:  300
  Mean response/sec: 4.98
  Response time (msec):
    min: 0
    max: 100
    median: 2
    p95: 3
    p99: 5
  Scenario counts:
    0: 300 (100%)
  Codes:
    200: 300
  • min, max, median์€ latency๋ฅผ ์˜๋ฏธ

  • p95, p99๋Š” ๊ฐ๊ฐ 95%, 99% ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋Š ์ •๋„๋ฅด latency๋ฅผ ๋Š๋ผ๊ณ  ์žˆ๋Š”์ง€

  • 200 Codes๋Š” 1์ดˆ๋งˆ๋‹ค 5๊ฐœ์˜ ์š”์ฒญ์„ ํ•˜๋ฏ€๋กœ 10์ดˆ๋‹น 50๊ฐœ

  • ์ตœ๊ณต ๊ฒฐ๊ณผ์—๋Š” 1์ดˆ * 5๊ฐœ * 60์ดˆ = 300๊ฐœ์˜ ๊ฒฐ๊ณผ

๊ฒฐ๊ณผ ํŒŒ์ผ(report.json) html ํŒŒ์ผ๋กœ ๋ณ€ํ™˜

$ artillery report report.json --output report.html

Scenario Test

Reference > Test Scripts

์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

config:
  target: 'http://localhost:8080'
  phases: # ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์˜ ์š”์ฒญ ์„ค์ •
    # 30์ดˆ ๋™์•ˆ ์ดˆ๋‹น 3๊ฐœ์˜ ์š”์ฒญ
    - duration: 30
      arrivalRate: 3 # ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฐœ์ˆ˜๋งŒํผ ์š”์ฒญ
      name: Warm up # ํŽ˜์ด์ง€ ์ด๋ฆ„
    - duration: 30
      arrivalRate: 3
      rampTo: 30 # ์ ์  ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ ค์„œ ์ตœ์ข… ์ดˆ๋‹น 30๊ฐœ์˜ ์š”์ฒญ
      name: Ramp up load
    - duration: 60
      arrivalRate: 30
      name: Sustained load
    - duration: 30
      arrivalRate: 30
      rampTo: 10 # ์ ์  ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ์ตœ์ข… ์ดˆ๋‹น 10๊ฐœ์˜ ์š”์ฒญ
      name: End of load
scenarios: # ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ์š”์ฒญ์„ ํ• ์ง€ ์„ค์ •
  - name: "login and use some functions" # 1๋ฒˆ ์‹œ๋‚˜๋ฆฌ์˜ค ์ด๋ฆ„
    flow:
      - post:
          url: "/login"
      - get:
          url: "/some-function-one"
      - get:
          url: "/some-function-two"
  - name: "just login" # 2๋ฒˆ ์‹œ๋‚˜๋ฆฌ์˜ค ์ด๋ฆ„
    flow:
      - post:
          url: "/login"

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋กœ๊ทธ

# ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰
$ artillery run --output secario-report.json scenario-test-config.yaml

...

All virtual users finished
Summary report @ 00:00:00(+0000) 2024-00-00
  Scenarios launched:  3025
  Scenarios completed: 3025
  Requests completed:  6115
  Mean response/sec: 40.47
  Response time (msec):
    min: 15
    max: 64
    median: 24
    p95: 36
    p99: 39
  Scenario counts:
    login and use some functions: 1545 (51.074%)
    just login: 1480 (48.926%)
  Codes:
    200: 6115


# ๊ฒฐ๊ณผ๋ฅผ html ํŒŒ์ผ๋กœ ๋ณ€ํ™˜
$ artillery report secario-report.json --output secario-report.html

Parameter Test

payload - loading data from CSV files

ํŒŒ๋ผ๋ฏธํ„ฐ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

config:
  target: 'http://localhost:8080'
  phases:
    - duration: 30
      arrivalRate: 3
      name: Warm up
  payload:
    path: "id-password.csv" # ํŒŒ์ผ ๊ฒฝ๋กœ
    fields: # ํ•„๋“œ ๊ตฌ๋ถ„
      - "id"
      - "password"
scenarios:
  - name: "just login"
    flow:
      - post: # json ํŒŒ๋ผ๋ฏธํ„ฐ
          url: "/login-with-id-password"
          json:
            id: "{{ id }}"
            password: "{{ password }}"
  - name: "find user"
    flow:
      - get: # url ํŒŒ๋ผ๋ฏธํ„ฐ
          url: "/search?query={{ id }}"

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋กœ๊ทธ

# ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰
$ artillery run --output parameter-report.json parameter-test-config.yaml

...

All virtual users finished
Summary report @ 00:00:00(+0900) 2024-00-00
  Scenarios launched:  90
  Scenarios completed: 90
  Requests completed:  90
  Mean response/sec: 2.98
  Response time (msec):
    min: 1
    max: 56
    median: 3
    p95: 4
    p99: 36
  Scenario counts:
    just login: 46 (51.111%)
    find user: 44 (48.889%)
  Codes:
    200: 90


# ๊ฒฐ๊ณผ๋ฅผ html ํŒŒ์ผ๋กœ ๋ณ€ํ™˜
$ artillery report parameter-report.json --output parameter-report.html

High Load Test

ํŒŒ๋ผ๋ฏธํ„ฐ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

config:
  target: 'http://localhost:8080'
  phases:
    - duration: 30
      arrivalRate: 20
      name: Warm up
    - duration: 10
      arrivalRate: 20
      rampTo: 200
      name: Ramp up load
    - duration: 10
      arrivalRate: 200
      name: Sustained load
    - duration: 30
      arrivalRate: 200
      rampTo: 20
      name: End of load
scenarios:
  - name: "high load cpu"
    flow:
      - get:
          url: "/high-load-cpu"
 - name: "high load memory"
   flow:
     - get:
         url: "/high-load-memory"

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋กœ๊ทธ

# ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰
$ artillery run --output high-load-report.json high-load-test-config.yaml

...

All virtual users finished
Summary report @ 00:00:00(+0900) 2024-00-00
  Scenarios launched:  7214
  Scenarios completed: 6767
  Requests completed:  6767
  Mean response/sec: 87.59
  Response time (msec):
    min: 2
    max: 7781
    median: 1823
    p95: 4456
    p99: 5369
  Scenario counts:
    high load cpu: 3669 (50.859%)
    high load memory: 3545 (49.141%)
  Codes:
    200: 6767
  Errors:
    ECONNRESET: 14
    ETIMEDOUT: 433



# ๊ฒฐ๊ณผ๋ฅผ html ํŒŒ์ผ๋กœ ๋ณ€ํ™˜
$ artillery report high-load-report.json --output high-load-report.html

์ฐธ๊ณ 

๋‹ค๋ฅธ ์„œ๋Šฅ ํ…Œ์ŠคํŠธ ํˆด

์ •์ƒ์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ๋œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ๊ถŒ์žฅ

Last updated