์ฅ์ ๋ฐ์ ์ผ์: 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+
โข
4) VolumeQueueLength (๋๊ธฐ์ด ์ฆ๊ฐ)
โข
I/O๊ฐ ์ฒ๋ฆฌ๋์ง ๋ชปํด QueueLength ์ฆ๊ฐ
โ ๋์คํฌ ์์ฒญ์ด ์ค์๊ณ ์์์
5) BurstBalance (gp2 ํฌ๋ ๋ง ๊ณ ๊ฐ) โ 2๋ฒ์งธ ํต์ฌ ์งํ
โข
100% โ ์ ์
โข
20% ์ดํ โ ์ฑ๋ฅ ์ ํ
โข
0% โ EBS ์ฑ๋ฅ 3MB/s๋ก ์ ํ(= ์๋ ์ ์ง์ ๊ฑฐ์ ๋์ผ)
๊ฒฐ๋ก
โข
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๊ฐ ๋ชฐ๋ฆฌ๋ ์์
์์๋ ์์ ์ ์ผ๋ก ๋์ํ๋ค.
โข
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 ๋ณ๊ฒฝ์ด ์์ผ๋ฉด ์บ์ ํ์ฉ










