๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ/Java & Spring

๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ Caching ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ (with Jmeter)

by hossii 2024. 2. 25.

์ด์ „์— Ngrinder๋ฅผ ์ด์šฉํ•ด ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณธ ์ ์ด ์žˆ๋‹ค. Naver์—์„œ ์ œ์ž‘ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํˆด์ด๋ผ์„œ ๋น„๊ต์  ์•„์‹œ์•„๊ถŒ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋А๋‚Œ์ด์—ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ฐธ๊ณ ํ•  ๋ฌธ์„œ๊ฐ€ ๋งŽ์€ ํŽธ์€ ์•„๋‹ˆ์—ˆ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์— ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ–ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Ngrinder๋Š” ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋“ค์„ `.csv`ํŒŒ์ผ๋กœ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋งค๋ฒˆ ์—ด๊ณ , ๋‹ซ์œผ๋ฉฐ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์กฐ๊ธˆ ๊ท€์ฐฎ์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” Jmeter๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. Jmeter๋Š” Apache์—์„œ ์ œ์ž‘ํ•œ Java ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ ์†Œ์Šค ํˆด์ด๋‹ค.

๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ํŠธ๋ Œ๋“œ๋งŒ ๋ณด๋”๋ผ๋„ Ngrinder์™€ ๋น„๊ต๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ๋ง์€ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ›จ์”ฌ ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Jmeter๋Š” swing์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ GUI ํˆด ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

 

Jmeter ์„ค์น˜ ๋ฐ ์‹คํ–‰

์„ค์น˜

ํ•˜๋‹จ์˜ ๋งํฌ์— ๋“ค์–ด๊ฐ€๋ฉด Binaries ํŒŒ์ผ๊ณผ Source ํŒŒ์ผ์ด ์ œ๊ณต๋˜๋Š”๋ฐ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด Binaries ํŒŒ์ผ์„ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

 

Apache JMeter - Download Apache JMeter

Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava

jmeter.apache.org

 

Jmeter๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Java 8๋ฒ„์ „ ์ด์ƒ์ด ํ•„์š”ํ•œ๋ฐ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์‹คํ–‰

์‹คํ–‰์€ Mac์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด jmeter.sh ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

$ sh apache-jmeter-{VERSION}/bin/jmeter.sh

ํ…Œ์ŠคํŠธ ์„ธํŒ…

  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ: Mac M1 Max / RAM 64GB / SSD 1TB 
  • ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค: 10๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ 10์ดˆ๊ฐ„ ํ™ˆํŽ˜์ด์ง€`localhost:8080`์กฐํšŒ
  • ํ…Œ์ŠคํŠธ ๋ชฉ์ : ํ™ˆํŽ˜์ด์ง€์— ๊ฑธ๋ ค์žˆ๋Š” Cache ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๊ฒ€์ฆ

1๋‹จ๊ณ„. Thread Group ๊ตฌ์„ฑ

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ€์ƒ ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ์„ฑํ•ด ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ Thread๊ฐ€ ๊ฐ€์ƒ ์‚ฌ์šฉ์ž ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด Thread Group์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๊ณ  Jmeter์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์€ ์ด 4๊ฐ€์ง€์ด๋‹ค.

 

  • Open Model Thread Group: ํŠน์ • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ์‹คํ–‰๋  ์‚ฌ์šฉ์ž ํ’€๊ณผ ์Šค์ผ€์ค„(ํŒจํ„ด)์„ ์ •์˜ํ•˜๋ฉด ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. (์•„์ง ์‹คํ—˜์ ์ธ ์˜ต์…˜์œผ๋กœ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.)
  • Setup Thread Group: ๋ณธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์‚ฌ์šฉ์ž ํ’€์„ ์ •์˜ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
  • Thread Group: ํŠน์ • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ์‹คํ–‰๋  ์‚ฌ์šฉ์ž ํ’€, (๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์— ๊ฑธ๋ฆฌ๋Š”) ๋žจํ”„์—… ์‹œ๊ฐ„, ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ•ดํ•  ํšŸ์ˆ˜ ํ˜น์€ ์‹œ๊ฐ„์„ ์ •์˜ํ•ด ํ…Œ์ŠคํŠธํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
  • Teardown Thread Group: ๋ณธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ ์ดํ›„์— ํด๋ฆฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์‚ฌ์šฉ์ž ํ’€์„ ์ •์˜ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

๋‹จ์ˆœํžˆ ํŽ˜์ด์ง€๋ฅผ ์กฐํšŒํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— Thread Local ์˜ต์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธํŒ…ํ•ด์คฌ๋‹ค.

 

  • Numbers of Threads: 10๋ช…์˜ ์‚ฌ์šฉ์ž
  • Duration: 10์ดˆ๋™์•ˆ
  • Action ... Sampler error Continue: ์—๋Ÿฌ๊ฐ€ ๋ฐœํ–‰ํ•ด๋„ ๊ณ„์† ์š”์ฒญ

2๋‹จ๊ณ„. Sampler ๊ตฌ์„ฑ

์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ์„ฑํ–ˆ์œผ๋‹ˆ๊นŒ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์ •์˜ํ•  ์ฐจ๋ก€์ด๋‹ค. Jmeter์—์„œ๋Š” Sampler ์„ธํŒ…์œผ๋กœ ํ–‰๋™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์„ ์ง€์›ํ•˜๋Š”๋ฐ ์›น ์š”์ฒญ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” Http Request๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

3๋‹จ๊ณ„. Listener ๊ตฌ์„ฑ

Sampler์— ์ •์˜ํ•œ ํŒจํ„ด๋Œ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ํ•˜๋ฉด ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•œ๋‹ค. Listener๊ฐ€ ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Listener๋„ ์ข…๋ฅ˜๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์œผ๋‹ˆ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 

4๋‹จ๊ณ„. Assertions ๊ตฌ์„ฑ

์ถ”๊ฐ€์ ์œผ๋กœ Sampler๊ฐ€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ›์€ ์‘๋‹ต ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ๋Š”๋ฐ, ์˜๋„์น˜ ์•Š๊ฒŒ ๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š์•„์„œ 3XX ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์ƒํƒœ ์ฝ”๋“œ๋Š” ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์ง€๋งŒ ์„œ๋ฒ„ ๋กœ์ง์ƒ ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„์˜ ๊ฒ€์ฆ์„ ํ†ตํ•ด ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋•Œ Assertions๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ ์ ˆ์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ™ˆํŽ˜์ด์ง€์— ์กฐํšŒ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.)

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋ชฉ์ ๋Œ€๋กœ "์บ์‹ฑ์„ ๋ฏธ์ ์šฉํ•œ ์ƒํ™ฉ"๊ณผ "์บ์‹ฑ์„ ์ ์šฉํ•œ ์ƒํ™ฉ"์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค, ๋™์ผํ•œ ์กฐ๊ฑด์œผ๋กœ ๊ฐ๊ฐ 10๋ฒˆ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋ชจ๋“  ํ…Œ์ŠคํŠธ์—์„œ ๋น„์Šทํ•œ ์–‘์ƒ์„ ๋„์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 10๊ฐœ์˜ ํ‘œ๋ณธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ๋‹ค.

์บ์‹ฑ ๋ฏธ์ ์šฉ

์บ์‹ฑ ์ ์šฉ

๊ฒฐ๊ณผ ๋ถ„์„

๊ฐ€์žฅ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ๋ถ€๋ถ„์€ "ํ‘œ๋ณธ ์ˆ˜"์™€ "์ฒ˜๋ฆฌ๋Ÿ‰"์ด๋‹ค. ์บ์‹ฑ์„ ๋ฏธ์ ์šฉํ•œ ๊ฒฝ์šฐ 4316๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ–ˆ๊ณ , ์ดˆ๋‹น 431.1์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋ณด์˜€๋‹ค. ๋ฐ˜๋ฉด, ์บ์‹ฑ์„ ์ ์šฉํ•œ ๊ฒฝ์šฐ 7060๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ–ˆ๊ณ , ์ดˆ๋‹น 708.8์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋ณด์˜€๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์บ์‹ฑ์„ ์ ์šฉํ–ˆ์„ ๋•Œ ์•ฝ 70ํผ์„ผํŠธ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด์ž„์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ฐธ๊ณ ๋กœ ์บ์‹ฑ์„ ์ ์šฉ๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ 10๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜์Œ ์š”์ฒญํ•  ๋•Œ์˜ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ์œ ๋… ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” Ramp-up ์‹œ๊ฐ„์„ 1์ดˆ๋กœ ์„ค์ •ํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Ramp-up ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋Š” ์ด์œ ๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋ฐฉํ•˜๊ณ , ๋ถ€ํ•˜๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.


์•„๋ž˜ ๋‚ด์šฉ์€ Jmeter ์‚ฌ์šฉ๊ณผ ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ์Šคํ‚ตํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

์ด์Šˆ. CodeCache is full

ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

 

๋จผ์ € CodeCache๋ž€ ๋ฌด์—‡์ผ๊นŒ? JVM์˜ ๊ฒฝ์šฐ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•ด ์บ์‹ฑํ•˜๋Š”๋ฐ, ์ด๋ฅผ CodeCache๋ผ๊ณ  ํ•œ๋‹ค. ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋ฉด CodeCache์˜ ํฌ๊ธฐ๋Š” ์•ฝ 48MB๋กœ ์„ค์ •๋ผ ์žˆ๋Š”๋ฐ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์ด ํ•œ๋ฒˆ์— ๋ชฐ๋ฆฌ๋ฉด์„œ CodeCache๊ฐ€ 3KB๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ€๋“์ฐฌ ์ƒํƒœ์ด๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ CodeCache๋Š” JVM ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ReservedCodeCacheSize ์˜ต์…˜์„ ํ†ตํ•ด CodeCache ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์ค˜์•ผ ํ•œ๋‹ค.