Search

[TroubleShooting] Jenkins ์žฅ์•  ๋ถ„์„

Date
2025/11/18
Category
Devops
Tag
TroubleShooting
CI/CD

์žฅ์•  ๋ฐœ์ƒ ์ผ์‹œ: 2025.11.17 23:50 ~ 00:10

์˜ํ–ฅ ์„œ๋น„์Šค: Jenkins CI ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ

์žฅ์•  ์œ ํ˜•: Jenkins ๋นŒ๋“œ ์ค‘๋‹จ / ALB 504 Timeout / SSH ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ / EBS I/O Bottleneck

1. ๊ฐœ์š”

2025-11-17 23:50 ~ 00:10 ์‚ฌ์ด, Jenkins๋ฅผ ํ†ตํ•ด ํŠน์ • ์„œ๋น„์Šค์˜ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ & ECR Push ์ž‘์—… ์ค‘ Jenkins UI๊ฐ€ 504 Gateway Timeout์„ ๋ฐ˜ํ™˜ํ•˜์˜€๊ณ , ์ดํ›„ SSH ์ ‘์† ๋˜ํ•œ ๋ถˆ๊ฐ€ํ•ด์ง€๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
ํ•ด๋‹น ์žฅ์• ๋Š” ๋‹จ์ˆœํ•œ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋‚˜ Jenkins ์ž์ฒด ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ, EC2 ๋‚ด๋ถ€์˜ EBS(gp2) ๋””์Šคํฌ I/O ๋ณ‘๋ชฉ์œผ๋กœ ์ธํ•œ ์‹œ์Šคํ…œ ์ •์ง€(hang)๋กœ ํ™•์ธ๋˜์—ˆ๋‹ค.
๋ณธ ๋ฌธ์„œ๋Š” ์žฅ์• ์˜ ์ „์ฒด ์›์ธ, ์ฆ์ƒ, CloudWatch ์ง€ํ‘œ ๋ถ„์„, ํ•ด๊ฒฐ ๋ฐฉ์•ˆ, ๊ทผ๋ณธ์ ์ธ ๊ฐœ์„  ์ „๋žต์„ ๊ธฐ์ˆ ํ•œ๋‹ค.

2. ์žฅ์•  ์˜ํ–ฅ ๋ฒ”์œ„

ํ•ญ๋ชฉ
์˜ํ–ฅ
Jenkins Web UI
์ ‘์† ๋ถˆ๊ฐ€ (504 Gateway Timeout)
SSH ์ ‘์†
๋ถˆ๊ฐ€
์ด๋ฏธ์ง€ ๋นŒ๋“œ
์ค‘๋‹จ๋จ
Jenkins ์ปจํ…Œ์ด๋„ˆ
Docker ๋‚ด๋ถ€์—์„œ ์ •์ง€ ์ƒํƒœ
NAT Gateway / ๋„คํŠธ์›Œํฌ
๋ฌธ์ œ ์—†์Œ
EC2 ์ƒํƒœ ์ฒดํฌ
์ •์ƒ
โ†’ Jenkins EC2 ๋‚ด๋ถ€์˜ ๋””์Šคํฌ I/O ์Šคํ†จ๋กœ ์ธํ•ด OS ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ˜ ์‚ฌ๋ก€

3. ์žฅ์•  ํƒ€์ž„๋ผ์ธ

์‹œ๊ฐ„
์ด๋ฒคํŠธ
23:50
Docker build ์‹œ์ž‘ โ†’ I/O ์ฆ๊ฐ€
23:55
Jenkins ์‘๋‹ต ์ง€์—ฐ ์‹œ์ž‘
00:00
DiskOps/ReadBytes ํญ์ƒ์Šน
00:00~00:03
EBS BurstBalance ๊ธ‰๋ฝ / TotalReadTime ํญ์ฆ
00:03
Jenkins 504 ๋ฐœ์ƒ
00:05
SSH ์ ‘์† ๋ถˆ๊ฐ€
00:10
EC2 ์™„์ „ hang ์ƒํƒœ

4. ์›์ธ ๋ถ„์„ (Root Cause)

Root Cause: EBS gp2 BurstBalance ๊ณ ๊ฐˆ โ†’ I/O ์Šคํ†จ(IO Stall)

Jenkins EC2 ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ธ EBS ๋ณผ๋ฅจ ํƒ€์ž…์ด gp2์˜€์œผ๋ฉฐ, Docker build์™€ ECR push ๊ณผ์ •์—์„œ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋†’์€ IOPS๋ฅผ ์š”๊ตฌํ•˜๋ฉด์„œ gp2์˜ ๋ฒ„์ŠคํŠธ ํฌ๋ ˆ๋”ง(Burst Credit)์ด ์†Œ์ง„๋จ.
๊ทธ ๊ฒฐ๊ณผ:
โ€ข
VolumeTotalReadTime์ด ์ตœ๋Œ€ 119์ดˆ๊นŒ์ง€ ์ฆ๊ฐ€
โ€ข
QueueLength ์ฆ๊ฐ€
โ€ข
๋””์Šคํฌ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•ด OS ๋ ˆ๋ฒจ์—์„œ block
โ€ข
Jenkins ์ปจํ…Œ์ด๋„ˆ + SSH ๋ชจ๋‘ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€
โ€ข
์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์‹ค์ƒ โ€œ๋ฉˆ์ถ˜โ€ ์ƒํƒœ(hang)

5. CloudWatch ์ง€ํ‘œ ๋ถ„์„

5.1 EC2 ์ธก ์ง€ํ‘œ ๋ถ„์„

1) CPUUtilization

โ€ข
CPU๋Š” 40~60% ์ˆ˜์ค€ โ†’ ์ •์ƒ
โ€ข
CPU ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ

2) NetworkIn / NetworkOut

โ€ข
Docker build์™€ push ๊ณผ์ •์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์ฆ๊ฐ€ โ†’ ์ •์ƒ
โ€ข
์ดํ›„ ๊ฐ‘์ž๊ธฐ 0์œผ๋กœ ๋–จ์–ด์ง โ†’ EC2๊ฐ€ ๋ฉˆ์ถ˜ ์ƒํƒœ๋กœ ํŒ๋‹จ๋จ

3) StatusCheckFailed (System/Instance)

โ€ข
๋ชจ๋‘ 0 โ†’ OS, ํ•˜๋“œ์›จ์–ด, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์•„๋‹˜

๊ฒฐ๋ก 

EC2 ์ž์ฒด ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ํ™•์ธ๋จ โ†’ Storage(EBS) ๋ถ„์„์œผ๋กœ ๋ฐฉํ–ฅ ๊ฒฐ์ •

5.2 EBS ์ธก ์ง€ํ‘œ ๋ถ„์„

1) VolumeReadBytes / WriteBytes (๋ฐ์ดํ„ฐ ์–‘ ํญ์ฆ)

โ€ข
Docker ๋ ˆ์ด์–ด ์ƒ์„ฑ์œผ๋กœ ์ธํ•ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€
โ€ข
์ด๋Š” ์ •์ƒ์ ์ด์ง€๋งŒ โ†’ ์ดํ›„ ์ง€ํ‘œ๋“ค๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ๋น„์ •์ƒ ํ๋ฆ„์ด ๋‚˜ํƒ€๋‚จ

2) VolumeReadOps / WriteOps (Ops ํญ๋ฐœ โ†’ I/O ๋ณ‘๋ชฉ ์‹œ์ž‘)

โ€ข
ReadOps๋Š” 16๋งŒ ops๊นŒ์ง€ ์ƒ์Šน
โ€ข
WriteOps๋„ ์ˆ˜๋งŒ ops ๋ฐœ์ƒ
โ€ข
gp2๋Š” ๊ธฐ๋ณธ IOPS๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์—(100~300 IOPS ์ˆ˜์ค€), ์ˆœ๊ฐ„ ๋ถ€ํ•˜๋ฅผ ์ ˆ๋Œ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์Œ

3) VolumeTotalReadTime / WriteTime (I/O ์Šคํ†จ ๋ฐœ์ƒ) โ€” ํ•ต์‹ฌ ์ง€ํ‘œ

OS๊ฐ€ ์Šคํ† ๋ฆฌ์ง€ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„
โ€ข
์ •์ƒ ๊ฐ’: 1ms ~ 10ms
โ€ข
๊ฒฝ๊ณ  ์ˆ˜์ค€: 50ms+
โ€ข
์žฅ์•  ์ˆ˜์ค€: 100ms+
โ€ข
์ด๋ฒˆ ์žฅ์•  ๊ฐ’: 119์ดˆ

4) VolumeQueueLength (๋Œ€๊ธฐ์—ด ์ฆ๊ฐ€)

โ€ข
I/O๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•ด QueueLength ์ฆ๊ฐ€
โ†’ ๋””์Šคํฌ ์š”์ฒญ์ด ์ค„์„œ๊ณ  ์žˆ์—ˆ์Œ

5) BurstBalance (gp2 ํฌ๋ ˆ๋”ง ๊ณ ๊ฐˆ) โ€” 2๋ฒˆ์งธ ํ•ต์‹ฌ ์ง€ํ‘œ

โ€ข
100% โ†’ ์ •์ƒ
โ€ข
20% ์ดํ•˜ โ†’ ์„ฑ๋Šฅ ์ €ํ•˜
โ€ข
0% โ†’ EBS ์„ฑ๋Šฅ 3MB/s๋กœ ์ œํ•œ(= ์ž‘๋™ ์ •์ง€์™€ ๊ฑฐ์˜ ๋™์ผ)
๊ทธ๋ž˜ํ”„์—์„œ BurstBalance๊ฐ€ ๋น ๋ฅด๊ฒŒ 0์œผ๋กœ ๋–จ์–ด์กŒ์Œ.

๊ฒฐ๋ก 

โ€ข
gp2์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ถ•๊ดด
โ€ข
๋ชจ๋“  I/O ์š”์ฒญ์ด ๋Œ€๊ธฐ์—ด์—์„œ ๋ฉˆ์ถค
โ€ข
๊ฒฐ๊ตญ EC2 ์ „์ฒด๊ฐ€ hang

6. ๊ฒฐ๋ก  (Root Cause ์ •๋ฆฌ)

EC2 ์žฅ์• ๊ฐ€ ์•„๋‹ˆ๋ผ EBS(gp2)์˜ I/O ๋ฒ„์ŠคํŠธ ๊ณ ๊ฐˆ์ด ์›์ธ

โ€ข
Docker build ์‹œ I/O ์‚ฌ์šฉ๋Ÿ‰ ํญ์ฆ
โ€ข
gp2์˜ IOPS ํ•œ๊ณ„ + BurstCredit ๊ณ ๊ฐˆ
โ€ข
EBS๊ฐ€ 119์ดˆ ๋™์•ˆ ์‘๋‹ต ๋ชป ํ•ด OS๊ฐ€ block ์ƒํƒœ๋กœ ๋ฉˆ์ถค
โ€ข
Jenkins + SSH + Docker ๋ชจ๋‘ ์‘๋‹ต ๋ถˆ๊ฐ€
โ€ข
EC2๋Š” ์‚ด์•„์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” hang ์ƒํƒœ
โ†’ ์Šคํ† ๋ฆฌ์ง€ ๋ณ‘๋ชฉ(IO Stall)๋กœ ์ธํ•œ ์‹œ์Šคํ…œ ์ „์ฒด ์ •์ง€

7. ๊ฐœ์„  ๋ฐฉ์•ˆ & ์žฌ๋ฐœ ๋ฐฉ์ง€ ๋Œ€์ฑ…

์ด๋ฒˆ ์žฅ์• ๋Š” Jenkins CI ๋นŒ๋“œ ๊ณผ์ •์—์„œ EBS(gp2)๊ฐ€ ์ˆœ๊ฐ„์ ์ธ I/O ๋ถ€ํ•˜๋ฅผ ๊ฐ๋‹นํ•˜์ง€ ๋ชปํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒƒ์ด ์›์ธ์ด์—ˆ๋‹ค. ๋™์ผ ์ƒํ™ฉ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ์น˜ํ•œ๋‹ค.

7.1 EBS ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ gp3๋กœ ๋ณ€๊ฒฝ (ํ•„์ˆ˜ ์กฐ์น˜)

์žฅ์• ์˜ ์ง์ ‘ ์›์ธ์ด gp2์˜ BurstCredit ๊ณ ๊ฐˆ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Jenkins EC2๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  EBS ๋ณผ๋ฅจ์€ gp3๋กœ ์ „ํ™˜ํ•œ๋‹ค.
gp3๋Š” IOPS์™€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํฌ๋ ˆ๋”ง๊ณผ ๊ด€๊ณ„์—†์ด ์ง€์†์ ์œผ๋กœ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Docker build์ฒ˜๋Ÿผ ๋‹จ์‹œ๊ฐ„์— I/O๊ฐ€ ๋ชฐ๋ฆฌ๋Š” ์ž‘์—…์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
gp3 ์žฅ์ 
โ€ข
IOPS/Throughput์„ ํฌ๋ ˆ๋”ง ์—†์ด ์ง€์†์ ์œผ๋กœ ์ œ๊ณต
โ€ข
์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋„์ปค ๋นŒ๋“œ workload ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
โ€ข
gp2 ๋Œ€๋น„ ๋น„์šฉ์ด ๋™์ผํ•˜๊ฑฐ๋‚˜ ์กฐ๊ธˆ ๋” ์ €๋ ด

7.2 Jenkins๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” EBS ์‚ฌ์–‘์„ ํ˜„์‹ค์ ์œผ๋กœ ์กฐ์ •

ํ˜„์žฌ CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Docker ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ˜๋ณต ์ƒ์„ฑ๋˜๊ณ  ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ I/O๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ ์ž์ฒด๋„ ๋ณ€๋™ ํญ์ด ํฌ๋‹ค.
๋”ฐ๋ผ์„œ Jenkins๊ฐ€ ์šด์˜๋˜๋Š” EC2์—์„œ๋Š” ์ด๋ฒˆ ์žฅ์• ์—์„œ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ I/O ํŒจํ„ด์„ ๊ธฐ์ค€์œผ๋กœ EBS๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค:
โ€ข
gp3
โ€ข
IOPS 3,000
โ€ข
Throughput 125MB/s
โ€ข
๋””์Šคํฌ ์šฉ๋Ÿ‰์€ 40~50GB ์ˆ˜์ค€์œผ๋กœ ํ™•๋ณด (Docker ์บ์‹œ ํฌํ•จ)

7.3 Jenkins์˜ ์—ญํ• ์„ Master/Worker๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ „ํ™˜

์ง€๊ธˆ์€ Jenkins Master๊ฐ€ ๋นŒ๋“œ ์‹คํ–‰๋ถ€ํ„ฐ Docker build, ECR push๊นŒ์ง€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.
Docker build ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ๋“ค์–ด์˜ค๋ฉด Jenkins ์ „์ฒด๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ํ–ฅํ›„ ์šด์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ์—ญํ• ์„ ๋ถ„๋ฆฌํ•  ๊ณ„ํš์ด๋‹ค.
โ€ข
Jenkins๋Š” Master ์—ญํ• ๋งŒ ๋‹ด๋‹น
โ€ข
Jenkins Build Worker๋ฅผ EC2 ๋˜๋Š” ECS Fargate๋กœ ๋ถ„๋ฆฌ
โ€ข
Docker build๋Š” ๋ถ„๋ฆฌ๋œ ๋นŒ๋“œ ๋…ธ๋“œ(Worker)์—์„œ ์ˆ˜ํ–‰

7.4 CloudWatch ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ญ๋ชฉ ์žฌ์ •๋น„ (EBS ์ค‘์‹ฌ)

์ด๋ฒˆ ์žฅ์• ์—์„œ ๊ฐ€์žฅ ํฐ ์ง€ํ‘œ๋Š” CPU๋‚˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ EBS TotalReadTime / QueueLength์˜€๋‹ค.
๋”ฐ๋ผ์„œ Jenkins ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํฌ์ปค์Šค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ์ •ํ•œ๋‹ค:
โ€ข
VolumeTotalReadTime โ‰ฅ 50ms โ†’ ์•Œ๋žŒ
โ€ข
VolumeQueueLength โ‰ฅ 1 โ†’ ์•Œ๋žŒ
โ€ข
BurstBalance โ‰ค 30% (gp2๋งŒ ํ•ด๋‹น)
โ€ข
DiskOps ๊ธ‰์ฆ
โ€ข
ReadBytes/WriteBytes ๋น„์ •์ƒ ์ฆ๊ฐ€
๊ธฐ์กด์—๋Š” CPU/๋„คํŠธ์›Œํฌ ์œ„์ฃผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ณ‘๋ชฉ์„ ํ•ต์‹ฌ ํ•ญ๋ชฉ์œผ๋กœ ์‚ผ์•„ ๊ฐ์‹œํ•œ๋‹ค.

7.5 Docker build ์ž์ฒด๋ฅผ ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์กฐ์น˜

Docker ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ๊ณ„์† ์Œ“์ด๊ณ  ์‚ญ์ œ๋˜๋ฉด์„œ I/O ๋ถ€ํ•˜๊ฐ€ ์ง‘์ค‘๋จ์„ ํ™•์ธํ–ˆ๋‹ค.
์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Jenkins ๋นŒ๋“œ ๊ณผ์ •์— ๋‹ค์Œ์„ ์ ์šฉํ•œ๋‹ค:
โ€ข
๋นŒ๋“œ ์บ์‹œ ๋ฐ ์ž„์‹œ ํŒŒ์ผ ์ •๋ฆฌ
โ€ข
Dockerfile ๋ ˆ์ด์–ด ์ˆ˜ ์ตœ์†Œํ™”
โ€ข
multi-stage build ์ ์šฉ
โ€ข
base image ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฉด ์บ์‹œ ํ™œ์šฉ