ec2 freetier로 배포 중 한계점을 만남 웰넌 이슈
ec2의 연결이 계속 끊기는 문제!
claude에게 물어봤다.
"유명한 이슈야. ec2 메모리 문제로 서버가 종료 돼. 가장 최근 로그를 식별 할 수 있도록 알려줘"
sudo journalctl --since "1 hour ago" | grep -E "(failed|timeout|error|memory pressure)" --color=always
확인 결과

systemd-resolved[337]: Under memory pressure, flushing caches
kernel: Early memory node ranges
kernel: Memory: 950916K/1048180K available
DNS 리졸버 서비스의 캐시까지 비워가며 메모리를 확보하려 해봤지만, 불가능해서 재부팅됐다. 문제를 알아보자.
snapd[1158]: Main process exited, code=killed, status=9/KILL
snapd.service: Failed with result 'watchdog'
ubuntu@ip:~$ snap list
Name Version Rev Tracking Publisher Notes
amazon-ssm-agent 3.3.1957.0 11320 latest/stable/… aws✓ classic
core22 20250612 2045 latest/stable canonical✓ base
snapd 2.70 24792 latest/stable canonical✓ snapd
ec2는 기본적으로 snap 파일을 설치한다.
ssm을 위해 ec2에서 snap 기술을 활용한 것인데, 이 snap 자체가 백그라운드로 돌아가는데 메모리 cpu를 사용한다;
motd-news.service: Consumed 40.209s CPU time
apt-daily-upgrade.service: Consumed 3min 1.447s CPU time, 137.4M memory peak
motd-news.service
apt-daily-upgrade.service
즉, 위의 문제들로 메모리가 잡아먹히면서 jvm 메모리와 충돌하며 서버가 다운된 것
# 1. snapd 완전 비활성화
sudo systemctl disable snapd
sudo systemctl stop snapd
sudo systemctl mask snapd
# 2. 자동 업데이트 비활성화
sudo systemctl disable motd-news.timer
sudo systemctl disable apt-daily.timer apt-daily-upgrade.timer
만약, 보안 및 public ip 재할당 이슈로 SSM은 필요하다면?
# snap 전체를 제거하고 APT 버전으로 교체
sudo snap remove amazon-ssm-agent
sudo apt install amazon-ssm-agent
# 그 다음 snapd 완전 제거
sudo snap remove core22 snapd
sudo apt remove --purge snapd
이것들도 확인하면 좋다
ubuntu@ip:~$ ps aux --sort=-%mem | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1230 7.8 4.0 550428 39572 ? Ssl 13:49 0:00 /usr/libexec/fwupd/fwupd
root 611 0.0 3.7 1774704 36892 ? Ssl 12:49 0:03 /usr/lib/snapd/snapd
root 187 0.0 2.7 288952 27152 ? SLsl 12:48 0:00 /sbin/multipathd -d -s
root 712 0.0 2.3 110004 22968 ? Ssl 12:49 0:01 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
현재 fwupd, snapd, multipathd, unattended-upgrades 등이 보인다.
head를 늘려가면 필요없는 것들을 제거해도 된다.
각 기능들은 따로 설명은 하지 않겠다.
# SSM은 사용할 예정
sudo snap remove amazon-ssm-agent
sudo apt update
sudo apt install -y amazon-ssm-agent
# 0. 최적화 시작
echo "**최적화 전 메모리 상태**"
free -h
echo ""
# 1. snapd 완전 제거
echo "최적화 시작"
sudo systemctl stop snapd
sudo systemctl disable snapd
sudo systemctl mask snapd
if command -v snap &> /dev/null; then
sudo snap remove core22 snapd 2>/dev/null || true
sudo apt remove --purge -y snapd
sudo apt autoremove -y
fi
# 2. 자동 업데이트 비활성
sudo systemctl stop unattended-upgrades 2>/dev/null || true
sudo systemctl disable unattended-upgrades 2>/dev/null || true
sudo systemctl disable apt-daily.timer 2>/dev/null || true
sudo systemctl disable apt-daily-upgrade.timer 2>/dev/null || true
sudo systemctl disable motd-news.timer 2>/dev/null || true
if [ -f /etc/apt/apt.conf.d/20auto-upgrades ]; then
sudo sed -i 's/1/0/g' /etc/apt/apt.conf.d/20auto-upgrades
fi
echo "실행 중인 unattended-upgrade 프로세스 종료"
sudo pkill -f "unattended-upgrade" 2>/dev/null || true
# 3. 그 외 비활성화
services_to_disable=(
"fwupd"
"multipathd"
"udisks2"
"networkd-dispatcher"
"PackageKit"
)
for service in "${services_to_disable[@]}"; do
if systemctl is-active --quiet "$service"; then
sudo systemctl stop "$service" 2>/dev/null || true
fi
if systemctl is-enabled --quiet "$service" 2>/dev/null; then
sudo systemctl disable "$service" 2>/dev/null || true
fi
sudo systemctl mask "$service" 2>/dev/null || true
echo "$service 비활성화 완료"
done
# 4. 시스템 정리
sudo apt autoremove -y
sudo apt autoclean
sudo journalctl --vacuum-time=3d
# 5. 결과 확인
echo "**최적화 후 메모리 상태**"
free -h
Before
total used free shared buff/cache available
Mem: 957Mi 377Mi 162Mi 900Ki 592Mi 580Mi
Swap: 0B 0B 0B
After
**최적화 후 메모리 상태**
total used free shared buff/cache available
Mem: 957Mi 283Mi 264Mi 884Ki 562Mi 674Mi
Swap: 0B 0B 0B
사실 진짜 중요한 성과는 동적으로 140MB 이상 씩 증가할 수 있던, 예측 불가한 메모리 사용량에 대해 안정적으로 동작한다는게 더욱 크다!
대략 180 MB의 메모리 안정과 100MB의 메모리 확보
snapd 약 40 MB, auto upgrade 약 140 MB, 순수 절약 약 100MB
필요에 따라, 스왑 영역도 늘려도 되지만 느려져서 나는 안했다.
앞으로 freetier로 사이드 프로젝트를 할 경우 이거부터 해야겠다.