๋๊ธฐ์ด ์๋น์ค 10๋ง๋ช ๋ถํํ ์คํธ ์ฌ์ ๊ธฐ(feat. AWS Support)
- #virtual waiting room
- #redis
- #load test
- #elasticache
๋๊ธฐ์ด ์๋น์ค ๋ถํํ ์คํธ๋ฅผ ์์ํ๋ฉฐ
์๋์ ๋ธ๋ก๊ทธ ์ด์ฐฝ๊ธฐ์ ๋๊ธฐ์ด ์๋น์ค์ ๋ํ ๊ธ์ ์์ฑํ ์ ์ด ์์์ต๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ ํด๋น ๋๊ธฐ์ด ์๋น์ค์ ๋ํ ๋ถํํ ์คํธ๋ฅผ ์งํํ๋ฉฐ ๊ฒช์๋ ๋ด์ฉ๋ค์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ ์ ํฉ๋๋ค.
๋๊ธฐ์ด ์๋น์ค ๊ตฌ์กฐ์ ๋ํด ์ค๋ช ํ VWR(๋๊ธฐ์ด ์๋น์ค)๋ฅผ ๋จผ์ ๋ณด๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ธํ๋ผ ๊ตฌ์กฐ ๋ณ๊ฒฝ
์ ํฌ์คํธ๋ฅผ ๋ณด๊ณ ์ค์ ๋ถ๋ค์ ์์๊ฒ ์ง๋ง, ๊ธฐ์กด์ ๋๊ธฐ์ด ์๋น์ค๋ Api Gateway + Lambda์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ด ์๋น์ค๋ ์ง๊ธ๊น์ง ๋ง์ ์ํฐ์คํธ๋ค์ ์ํ ํ๋งค์ ์ด๋ฒคํธ์ ์ฌ์ฉ๋์๊ณ 22๋ ๋์ ํ์ฐ์ค ์ค๋ธ ์๋ ์ฝ์ํธ ํฐ์ผ ํ๋งค ๋น์์๋ ์์ฒ๋ช ์ ์ ์์๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ์ต๋๋ค. ํ์ง๋ง ํ์ฌ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ํ ์ํฐ์คํธ๋ค์ด ์ ์ ํ๊ธฐ ์์ํ๊ณ , ํธ๋ํฝ์ด ๋น ๋ฅด๊ฒ ๋์ด๋๋ฉด์ ์ฝ 2๋ ์ ์ ๋ง๋ค์๋ ์ธํ๋ผ๋ก๋ ๋ ๋ง์ ์ ์์๋ฅผ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์์ก์ต๋๋ค.
๊ทธ๋์ ๋ฐฑ์๋ ํ์์๋ ์ต๋ ๋์ ์ 10๋ง๋ช ์ ๋ชฉํ๋ก ์ก๊ณ ๋ถํํ ์คํธ๋ฅผ ์งํํ๋ฉฐ ์ธํ๋ผ ๋ฐ ์ฝ๋ ๊ฐ์ ์ ํ๊ธฐ๋ก ํ์์ต๋๋ค.
๊ฐ์ฅ ๋จผ์ ๊ฐ์ ์ด ํ์ํ๋ ๊ฒ์ Api Gateway์์ต๋๋ค. Api Gateway๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ Request Per Second(RPS) limit์ 1๋งํ์ด๋ฉฐ burst ํ ๋น๋์ ๋ฐ๋ผ ๋ ๋์ด๋ ์ ์์ต๋๋ค.(burst ํ ๋น๋์ region๋ณ๋ก ์ฐจ์ด๊ฐ ์์ต๋๋ค.)
์ด๋ ์ ํฌ์ ๋ชฉํ์ธ 10๋ง์ ๋นํ๋ฉด ๋ง์ด ๋ถ์กฑํ ์์น์ ๋๋ค. ๋ํ region๋ณ๋ก limit์ด ์๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ๊ฐ์ region์ Api Gateway๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด limit๋ ๊ฐ์ด ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์๋ก ์ํฅ์ ์ค ์ ์๊ณ , RPS limit์ ๋๋ฆด ์๋ ์์ง๋ง ๋์ Api Gateway Timeout์ ์ค์ฌ์ผ ํ๋ค๋ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
๊ทธ๋์ Application Load Balancer(ALB)๋ก ๋ณ๊ฒฝํ๊ฒ ๋์๋๋ฐ ALB๋ RPS limit์ด ์๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ์ ์์๊ฐ ๋ชฐ๋ ค 10๋งํ์ ๋ถํ๊ฐ ๋ค์ด์๋ ๊ฒฌ๋ ๊ฒ์ด๋ผ ์์ํ์ต๋๋ค.
API๋ Lambda๋ก ๋ฐฐํฌ๋์ด ์์์ต๋๋ค. Lambda๋ ๋ช๊ฐ์ง ๋จ์ ์ด ์์๋๋ฐ ์ฒซ๋ฒ์งธ๋ cold start์ ๋๋ค. ๋ถํ๊ฐ ํ๋ฒ์ ๋ชฐ๋ฆฌ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ํฐ ๋ณ๋ชฉ์ด ๋ฉ๋๋ค.
๋๋ฒ์งธ๋ก๋ Lambda์ ์ฌ์ฌ์ฉ์ ๋ํ ๋ฌธ์ ์ ๋๋ค. ๋์ผํ ๋ถํ๋ฅผ ์ฃผ๊ณ ์ฌ๋ฌ๋ฒ ํ ์คํธ๋ฅผ ์งํํด๋ณด์์ ๋, latency๊ฐ ์ผ์ ํ์ง ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. Lambda ํจ์๊ฐ ์๋ฃ๋๋ค๊ณ ํด์ ๋ฐ๋ก ์ข ๋ฃ๋๋ ๊ฒ ์๋๋ผ ๋ค์ ํจ์์ ํธ์ถ์ ์์ํ์ฌ ์ผ์ ์๊ฐ๋์ ์คํ ํ๊ฒฝ์ ์ ์งํ๊ฒ ๋๋๋ฐ์, ์ด ๋๊ธฐํ๋ ์๊ฐ์ด ๋๋ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ๋ค์ด 5๋งํ์ API ์ฝ ํ ์คํธ๋ฅผ ์ผ์ ์๊ฐ์ ๋๊ณ 2๋ฒ ์งํํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ์ฒซ๋ฒ์งธ ํ ์คํธ์์๋ 5๋ง๊ฐ์ ๋๋ค๊ฐ ์ ๋ถ cold start๋ก ์ธํ ์ง์ฐ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋๋ฒ์งธ ์คํํ ์์ ์์๋ ์ด์ ์ ์คํ๋ 5๋ง๊ฐ์ Lambda์ค์์ ๋ช๊ฐ๊ฐ ์ฌ์คํ๋ ์ ์๋ ์ํ์ธ์ง, ๋ช๊ฐ๊ฐ ์ข ๋ฃ๋์ cold start๊ฐ ๋๋๊ฑด์ง์ ์ฌ๋ถ๋ ๋งค๋ฒ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์๊ฐ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ฌ์ฉ์๋ ์ด ๋๊ธฐ ์๊ฐ์ ์ค์ ํ ์ ์๊ณ AWS์ ๋ด๋ถ ์ค์ ์ ์ํด ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ๋์ผ ๋ถํ๋ฅผ ์ฃผ๋ฉฐ ์งํํ ํ ์คํธ์์๋ ๊ท ๋ฑํ latency๋ฅผ ์ป์ด๋ด๊ธฐ ์ด๋ ค์ ๊ณ ๋ถํ๊ฐ ๋ง์์ง์๋ก latency์ ํธ์ฐจ๋ ์ปค์ก์ต๋๋ค. ๊ทธ๋์ ์ด API๋ค์ ECS(Fargate) ๋ก ์ด์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ฒฐ๋ก ์ ALB + ECS ๋ก ์ธํ๋ผ๋ฅผ ์ด์ ํ๊ฒ ๋์์ต๋๋ค.
ํ ์คํธ ๋ฐฉ์๊ณผ ์๋๋ฆฌ์ค
ํ ์คํธ๋ Locust ํด์ ์ฌ์ฉํ์ฌ ์งํํ์ต๋๋ค. ํ ๋ด์์ ์ฃผ๋ก ์ฌ์ฉ๋์ด ๋ง์ ์ง์์ด ์์ธ ์ํ์ด๊ธฐ๋ ํ์๊ณ ์ด์ ์ ์ฌ์ฉํด๋ณด์๋ artillery์ ๋นํด์ ์๋๋ฆฌ์ค ์์ฑ์ด ๋งค์ฐ ์์ํ์ต๋๋ค. ํ์ด์ฌ์ผ๋ก ์์ฑ์ ํด์ผํด์ ์ฝ๊ฐ์ ์ธ์ด ๊ณต๋ถ๊ฐ ํ์ํ๊ธด ํ์ง๋ง ์๋๋ฆฌ์ค ์์ฑ๋ง ํ๋ ๊ฒ์ด๋ผ๋ฉด ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. Locust๋ฅผ ECS(Fargate) ํ๊ฒฝ์ ๋ฐฐํฌํ์ฌ ํ ์คํธ๋ฅผ ์งํํ์๋๋ฐ, ์๋๋ ํ ์คํธ ์๋๋ฆฌ์ค์ ์ผ๋ถ์ ๋๋ค.
- task1: ๋๊ธฐ์ด์ ๋ณธ์ธ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋๋ค.
- task2: ๋ด๊ฐ ๋๊ธฐ์ด์์ ๊ณ์ ๋๊ธฐํด์ผ ํ๋์ง, ์๋๋ฉด ํต๊ณผํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๋ API๋ฅผ 1์ด์ 1๋ฒ์ฉ ํธ์ถํฉ๋๋ค. task1์ ๊ฒฐ๊ณผ๋ฅผ task2์์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ SequentialTaskSet๋ฅผ ์ ์ฉํ์ฌ ์์ฐจ ์คํ์ ๋ณด์ฅํด์ค๋๋ค.
์ด ๊ฒฝ์ฐ 10๋ง๋ช ์ด ๋์์ ๋ค์ด์จ๋ค๊ณ ๊ฐ์ ํ๋ฉด Max RPS๋ 10๋งํ๊ฐ ๋ฉ๋๋ค.
class QuickstartUser(SequentialTaskSet):
message_id = None
@task()
def _vwr(self):
response = self.client.post("/test/example-send", json={"message": "Hello, World!"})
print(response)
self.message_id = response['MessageId']
@task()
def _polling(self):
while True:
self.client.post("/test/example-polling", json={"messageId": "Hello, World!"})
time.sleep(1)
class AppUser(FastHttpUser):
tasks = [QuickstartUser]
ํ ์คํธ ๋ฐฉ์์ผ๋ก๋ ์ฒซ๋ฒ์งธ๋ก ์ต๋ํ ์ค์ ์ํฉ๊ณผ ๋น์ทํ๊ฒ ํ๋ ค๊ณ ํ๋ฒ์ 5๋ง, 10๋ง์ ๋ถํ๋ฅผ ํ๋ฒ์ ์ฃผ๋ ๋ฐฉ์์ ์ ํํ์๋๋ฐ ํน์ ์์น ์ด์์ผ๋ก ๋ถํ๋ฅผ ์ฃผ๋ฉด Locust์ ๋ถํ๋ถ์ฐ๊ธฐ์์ ๊ทธ ๋ถํ๋ฅผ ๋ฐ์์ํค๋ ๊ณผ์ ์์๋ถํฐ latency๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ค์ ๋ก ๋๊ธฐ์ด ์๋น์ค๊ฐ ๋๋ฆฐ ๊ฒ์ด ์๋๋ฐ๋, ์ด๋ฐ ๋ถํ๋ถ์ฐ๊ธฐ์ ์ํ latency ๋๋ฌธ์ p99์งํ๊ฐ ๋งค์ฐ ๋๋ฆฐ ๊ฒ์ฒ๋ผ ๋์ต๋๋ค.
์์ด ๋ค, ์ด๋ฐ์ ๋ฐ์ํ๋ latency๊ฐ ์์ํ ์ค์ด๋ฆ์ ๋ฐ๋ผ(๋ถํ๋ถ์ฐ๊ธฐ์ ํ์ฑํ) p95, medium๊ณผ ๊ฐ์ ์งํ๋ ์์ ์ ์ผ๋ก ๋์ค๊ฒ ๋์ด ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ๋ฐ์ ์์ด์๋ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์์ง๋ง ์๋น์ค์ ๋ฌธ์ ๊ฐ ์๋ ํ ์คํธ ํด์ ์ด์๋ก ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋๊ฒ ์กฐ๊ธ ์์ฌ์ ์ต๋๋ค. Locust์ ์ด๋ฐ latency์ ๊ดํ ์ด์๋ ์๋ ๋งํฌ์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋์ ํ๊ฐ์ง์ ๋ฐฉ๋ฒ์ ๋ ์ฌ์ฉํด์ ํ ์คํธํ์์ต๋๋ค. ์๋๋ Locust์์ ์ง์ํ๋ ์งํ์ ๋๋ค.
์ ์ ๋ฅผ ์์ํ ์ฌ๋ ค peak๊น์ง ๋๋ฌ์ํค๊ณ ๊ทธ๊ฒ์ ๊ณ์ ์ ์งํ๋ ํ ์คํธ๋ฅผ ์งํํ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ ์ ์ผ๋ก ๋ณผ ๊ฒ์ Total Request Per Second์ Response Time 2๊ฐ์ง์ธ๋ฐ ์ด๊ฒ์ด ๊ณ์ ์์ ์ ์ผ๋ก ์ ์ง๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฌ์ง์ ๋ณด๋ฉด ์ ์ ๊ฐ ๊ธ์ฆํ ๋ Response Time์ด ์ด์ง ๋ถ์์ ํ์ง๋ง (๊ทธ๋๋ 200ms ์ดํ๋ผ ๊ด์ฐฎ์ต๋๋ค), peak๊น์ง ์ฌ๋ผ๊ฐ ์ดํ์๋ ์์ ์ ์ธ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค.
์๊ฐ์ ์ผ๋ก ๋ค์ด์ค๋ ๋ถํ๋ฅผ ๋ฐ์๋ธ๋ค๊ณ ํ๋๋ผ๋ ์ด๊ฒ์ ์ ์งํ๋ค๊ฐ ๊ฐ์๊ธฐ cpu๊ฐ ํ๋ค๊ฑฐ๋, ์ด๋๊ฐ์์ ๋ณ๋ชฉ์ด ์๊ฒจ latency๊ฐ ํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ถํ๋ฅผ ์ ์งํ๋ ๊ฒ ๋ํ ๋๊ธฐ์ด ์๋น์ค์์๋ ์ค์ํ ๋ถ๋ถ์ ๋๋ค.
์ด๋ ๊ฒ ๋๊ฐ์ง ํ ์คํธ๋ฅผ ์งํํ๋ฉฐ ํ ์คํธ์ ์ ๋ขฐ๋๋ฅผ ๋์์ต๋๋ค.
ECS ์งํ๋ ์ด๋ค ๊ฒ์ ๋ด์ผ ํ ๊น?
๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ์คํ์ ์ฐ์ ํ๋ ๊ธฐ์ค์ด ๋๋ ๊ฒ์ด ์งํ์ธ๋ฐ ์ด๋ค ์งํ๋ค์ ์ฃผ๋ก ๋ณด์๋์ง ๊ทธ๋ฆฌ๊ณ ์คํ ์ฐ์ ์ ๊ณผ์ ์ ๋ํด์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋ ์ฌ์ง์ ๋ถํํ ์คํธ๋ฅผ ์ํด ์ ๊ฐ ์์๋ก ๋ง๋ Cloudwatch Dashboard ์ค ์ผ๋ถ์ ๋๋ค.
ECS์ ๊ฒฝ์ฐ๋ cpu, memory์ max๊ฐ์ ์์ฃผ๋ก ๋ณด์์ต๋๋ค. memory์ ๊ฒฝ์ฐ ํฌ๊ฒ ํ๋ ๋ถ๋ถ์ ์์๊ณ , cpu์ ๊ฒฝ์ฐ๋ 60%๋ฅผ ์๊ณ์น๋ก ๋๊ณ ์คํ์ ์กฐ์ ํ์ต๋๋ค. ์๊ณ์น์ ๊ฒฝ์ฐ๋ ์๋น์ค์ ๋ชฉ์ ๊ณผ client์ ๋ฏผ๊ฐ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ช ํํ ์ ์๋ฅผ ๋ด๋ฆฌ๊ธฐ ์ด๋ ค์ ๋ด๋ถ์ ์ผ๋ก ํ๋จํ์ฌ ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Network Bandwidth(๋์ญํญ)๋ ์ค์ํ ์งํ ์ค์ ํ๋์ธ๋ฐ ๋๊ธฐ์ด ์๋น์ค๋ ๊ต์ฅํ ์์ ํจํท์ ์ก์์ ํ๊ธฐ ๋๋ฌธ์ ํด๋น ์งํ์ ๊ฑฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค. ์ฐธ๊ณ ๋ก AWS์์๋ ๊ณต์์ ์ผ๋ก ECS์ ์คํ์ ๋ฐ๋ฅธ ๋์ญํญ์ ๊ณต๊ฐํ๊ณ ์์ง ์์ต๋๋ค. ๊ทธ๋์ ๋ช๋ช ๋ถ๋ค์ด ์ง์ ๋์ญํญ์ ๋ํ ํ ์คํธ๋ฅผ ์งํํ๊ณ ๊ณต์ ํด ์ฃผ์ ๊ฒ์๋ฌผ ๋ณด๊ณ ํ๋จํ ์ ์์๋๋ฐ, ์ ๋ ๋๋ฆฌ์ ์ค ๊ธฐ์ ๋ธ๋ก๊ทธ - ECS Fargate ์ฑ๋ฅ ์ธก์ ํ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
ElastiCache๋ ์๋ ๋ง์ ์์ ๋ถํ๋ฅผ ๊ฒฌ๋ ์ ์๋ค๊ณ ์๋ ค์ ธ ์์ด์, ECS์์ ๋ณ๋ชฉ์ด ์ ์๊ธฐ๋๋ก ์ ๊ฒฝ์ ์ข ๋ ์ผ์์ต๋๋ค. Locust๋ก RPS๋ฅผ ๊ณ์ ํ์ธํ๋ฉด์ RPS๊ฐ ๋ง์ด ๋ฐ๋ฆฐ๋ค ์ถ์ผ๋ฉด task์ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ ์ค์ผ์ผ ์์ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
ElastiCache(Redis) ์งํ๋ ์ด๋ค ๊ฒ์ ๋ด์ผ ํ ๊น?
ElastiCache์ ๊ฒฝ์ฐ ๋๊ธฐ์ด ์๋น์ค์์ ๋ฉ์ธ ์ ์ฅ์๋ก ์ฌ์ฉ๋๋ ๋ฆฌ์์ค์ ๋๋ค. ๋ง์ ์งํ๋ค์ ๋ชจ๋ํฐ๋งํ์๋๋ฐ ๊ทธ ๊ณผ์ ์์ AWS Support์ ๋์์ ๋ง์ด ๋ฐ์์ต๋๋ค.
๋ํ์ ์ธ ์งํ 2๊ฐ์ง๋ CPUUtilization, EngineCPUUtilization ์ ๋๋ค. ๊ฐ ์งํ์ ์ ์๋ฅผ ๋จผ์ ๋ง์๋๋ฆฌ์๋ฉด EngineCPUUtilization๋ Redis ๋ฉ์ธ thread์ CPU ์ฌ์ฉ๋ฅ , CPUUtilization๋ ์ ์ฒด ํธ์คํธ(Redis๊ฐ ํฌํจ๋ ๊ฐ์์ปดํจํฐ ์ ์ฒด)์ ๋ํ CPU ์ฌ์ฉ๋ฅ ์ ์๋ฏธํฉ๋๋ค. AWS ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด vCpu๊ฐ 4๊ฐ ์ด์์ธ ๊ฒฝ์ฐ EngineCPUUtilization๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋ ๊ฒ์ ์ถ์ฒํ๊ณ ์์ต๋๋ค.
๊ทธ ์ด์ ๋ Redis์ ์๋ธ thread๊ฐ cpu์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ธ thread๋ ๋น๋๊ธฐ ์์ ์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐฑ์ ์์ ์ฌ์ฉ๋ฉ๋๋ค. vCpu๊ฐ 4๊ฐ ์ด์์ด๋ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ thread๊ฐ ์ฌ์ฉํ๋ vCpu ์ด์ธ์ 3๊ฐ์ vCpu๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๊ฒ ์ฌ์ vCpu๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฉ์ธ thread๊ฐ ์ฑ๋ฅ์ด ๋ถ์กฑํ ์ํฉ(EngineCPUUtilization์ด ๋์ผ๋ CPUUtilization์ ๋ฎ์)์ด ์ผ๋ฐ์ ์ด๊ธฐ์ EngineCPUUtilization์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ํฐ๋งํ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค. EngineCPUUtilization์ ๋ฉ์ธ thread์ ๋ถํ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๋์์ง๋ฉฐ CPUUtilization์ OS ๋ ๋ฒจ์์ ์ ์ฒด vCpu์ ๋ถํ๊ฐ ๋์์ง๋ ์ํฉ์ ๋์์ง๊ฒ ๋ฉ๋๋ค
๊ทธ๋ ๋ค๋ฉด vCpu๊ฐ 4๊ฐ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ๋ ์ CPUUtilization๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋๊ฒ์ด ์ข์๊น์? ์์์ ์ธ๊ธํ ์๋ธ thread ๋์์ ์ํด ๋ฉ์ธ thread๊ฐ ์ฌ์ฉํ๊ณ ์๋ vCpu์ cpu ์๊ฐ์ ์๋นํ์ฌ EngineCPUUtilization์ ์ํฅ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ EngineCPUUtilization๋ง ๋ด์๋ ์ ํํ ์ด๋ค ๊ฒ์ด ์งํ์ ์ํฅ์ ๋ฏธ์น๋์ง ํ๋จํ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ฐ ์งํ์ ์ํฅ์ ๋ฏธ์น๋ ์์ ์ ์๋์ ๊ฐ์๋ฐ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค. ElastiCache for Redis ํด๋ฌ์คํฐ์์ CPU ์ฌ์ฉ๋์ด ๋ง๊ฑฐ๋ ์ฆ๊ฐํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
- EngineCPUUtilization (๋ฉ์ธ thread์ ๋ถํ๊ฐ ๋ฐ์ํ๋ ์ํฉ): ์๊ฐ ๋ณต์ก๋๊ฐ ๋์ ๋ช ๋ น (keys, hkeys, hgetall, sort ๋ฑ)์ ์ํํ๋ ๊ฒฝ์ฐ, ๋ถํ๊ฐ ๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ, new connections์ด ๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ
- CPUUtilization (OS ๋ ๋ฒจ์์ ์ ์ฒด vCpu์ ๋ถํ๊ฐ ๋์์ง๋ ์ํฉ): ๋คํธ์ํฌ ํธ๋ํฝ ํน์ ์ปค๋ฅ์ ์ด ๋ง์ ๊ฒฝ์ฐ
์ ๋ 2vCpu๋ฅผ ๊ฐ์ง m6g.large ์คํ์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ์๋๋ฐ ์ ๋ด์ฉ์ ํ ๋๋ก ๋ณด๋ฉด CPUUtilization๋ฅผ ์ค์ ์ ์ผ๋ก ๋ชจ๋ํฐ๋ง ํ๋ ๊ฒ์ ๋ง์ผ๋ ๋ถํ๊ฐ ๋ง์ด ๋ฐ์ํ ์๋ก EngineCPUUtilization์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ ๋ค ํ์ธํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถํ๊ฐ ๋ง์์ก์ ๋, Redis์ ์คํ์ ์ด๋ค ์งํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณด๊ณ ์ ํด์ผ ํ๊ณ ์ด๋ค ๋ฐฉ์(์ค์ผ์ผ ์ /์์)์ ์ฌ์ฉํด์ ์คํ์ ์กฐ์ ํด์ผ ํ ๊น์? ์ค์ผ์ผ ์ /์์์ ๊ธฐ์ค์ ์๋์ ๊ฐ์ต๋๋ค.
- ์ค์ผ์ผ ์
- ๋ฐ์ดํฐ ์ฉ๋(memory๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ)
- ๋คํธ์ํฌ ๋์ญํญ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ
- ์ค์ผ์ผ ์์
- EngineCPUUtilization๊ณผ ๊ฐ์ ๋ช ๋ น์ด ์ฒ๋ฆฌ์ ๋ํ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ
๋๊ธฐ์ด ์๋น์ค์ ๊ฒฝ์ฐ memory๋ ๋คํธ์ํฌ ๋์ญํญ์ด ๋ชจ์๋ผ์ง๋ ์์์ต๋๋ค. ๋คํธ์ํฌ ๋์ญํญ์ ๊ฒฝ์ฐ NetworkByteIn/NetworkByteOut ์งํ์ ํฉ๊ณ๋ฅผ ๋ชจ๋ํฐ๋งํ์์ต๋๋ค. Redis๋ burst ๋์ญํญ์ด ์กด์ฌํ๋ ์ธ์คํด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ burst๋ฅผ ์ฌ์ฉ์ค์ธ์ง๋ ํ์ธ์ ๊ผญ ํด๋ด์ผ ํฉ๋๋ค. ์ด๋ Network I/O Allowance Exceeded ์งํ๋ก ํ์ธํ ์ ์๋๋ฐ, ์ด ์งํ๊ฐ 0 ์ด๊ณผ์ธ ๊ฒฝ์ฐ burst๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ๋ ๋ถํ๊ฐ ๋ง์์ง์๋ก EngineCPUUtilization์ ์งํ๊ฐ ๊ณ์ ์์นํ๋ ๊ฒ์ ํ์ธํ์๊ธฐ ๋๋ฌธ์ ์์ ์ธ๊ธํ ๊ธฐ์ค์ ๋ฐ๋ผ replica node๋ฅผ ์ถ๊ฐํ์ฌ ๋ถํ๋ฅผ ๋ถ์ฐ์ํค๋ ์ค์ผ์ผ ์์ ๋ฐฉ์์ ์ ํํ์๊ณ replica๋ฅผ ์ถ๊ฐํ ์๋ก ๊ฐ node์ EngineCPUUtilization์ ์งํ๊ฐ ๋จ์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
EngineCPUUtilization ์งํ๋ฅผ ๋ณด๊ณ Redis ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ค์ผ์ผ ์ ์ ํด์ผํ๋๊ฒ ์๋๊ฐ ํ๊ณ ์๊ฐํ ์ ์๋๋ฐ redis๋ ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํฉ๋๋ค. ElastiCache ์ค์ผ์ผ ์ ์ ํ๋ฉด vCPU ๊ฐฏ์, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ์ฑ๋ฅ์ด ์ฆ๊ฐํ์ง๋ง ๋จ์ผ vCPU์ ์ฑ๋ฅ์ ๋ฐ๋์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ EngineCPUUtilization ์งํ์ ๊ฐ์ ์ ๊ธฐ๋ํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ์ค์ ๋ก ๋์ผ ๋ถํ๋ฅผ ์ ์งํ๊ณ ์คํ์ ์ ๋ช๋ฒ ์งํํด ๋ณธ ์ ์ด ์์๋๋ฐ EngineCPUUtilization์ ์งํ์ ๊ฐ์ ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. (๋์ OS ๋ ๋ฒจ์์์ cpu์ํ๋ฅผ ๋ํ๋ด๋ CPUUtilization ์งํ๋ vCpu๊ฐ ๋ง์์ง์๋ก ๋ฐ๋น๋กํ์ฌ ์ค์ด๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ElastiCache์ ์คํ์ ์ด๊ณณ์์ ํ์ธํด๋ณผ ์ ์์ต๋๋ค.
์์์ ์ธ๊ธํ ์งํ ์ธ์๋ SetTypeCmds, SetTypeCmdsLatency, Evictions, GetTypeCmdsLatency ๋ฑ์ ๋ค์ํ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํ์์ต๋๋ค. ์ด๊ณณ์์ ์ ๋ถ ์ค๋ช ํ๊ธฐ์ ์์ด ๋๋ฌด ๋ง์์ Redis ์งํ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์น๋ฉฐ
์์์ ์ค๋ช ํ ๋ฐฉ์๋๋ก ๋ถํํ ์คํธ๋ฅผ ์งํํ์๊ณ ๋ชฉํ์๋ 10๋ง๋ช ๊น์ง ๋ฌด๋ฆฌ์์ด ๋ฐ์๋ผ ์ ์๋ ์คํ์ ์ ํ ์ ์์์ต๋๋ค.
๋ถํํ ์คํธ๋ฅผ ์งํํ์๋ ๋ถ๋ค์ด ์ด ๊ธ์ ๋ณด๊ณ ๋ง์ ๋์์ ๋ฐ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๋ ๊ถ๊ธํ์ ๊ฒ ์์ผ์ ๋ถ์ ์ ํฌํ ์ ํ๋๊ป์ ์์ฑํ์ [AWS ๊ธฐ์ ๋ธ๋ก๊ทธ] Wonderwall ์ ๋ถํ ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ์งํํ์๊น?๋ ๊ฐ์ด ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐฑ์๋ ํ์์๋ ์ ํฌ์ ํจ๊ป ์๋น์ค์ ํ์ง์ ๋์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๊ณ ํจ๊ป ์ฑ์ฅํด๋๊ฐ ๊ฐ๋ฐ์๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค. ๊ด์ฌ ์์ผ์ ๋ถ๋ค์ ๋ฐ๋ก ๋ฐ์ ์๋ ์ฑ์ฉํ์ด์ง๋ฅผ ํตํด ์ธ์ ๋ ์ง ์ง์ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.