시간 동기화 문제 — NTP/chrony 트러블슈팅
TLS 인증서 오류, 로그 타임스탬프 불일치, 클러스터 노드 간 시각 차이 등 시간 동기화 문제를 timedatectl, chronyc, ntpq로 진단하고 makestep·타임존 설정으로 복구하는 방법을 설명합니다.
지난 글에서 응답 없는 프로세스를 추적하는 방법을 살펴봤다. 이번에는 조용하지만 시스템 전반에 영향을 주는 시간 동기화 문제를 다룬다. 시계가 몇 초만 틀려도 TLS 인증서 유효성 검사가 실패하고, 분산 시스템의 인증 토큰이 만료되며, 로그 파일의 타임스탬프가 어긋나 장애 분석이 불가능해진다.
시간 동기화 아키텍처
현대 리눅스 시스템의 시간 관리:
- 하드웨어 시계 (RTC) — 전원이 꺼져도 유지, 배터리로 동작
- 시스템 시계 — 커널이 관리, 부팅 시 RTC에서 초기화
- NTP 데몬 — 외부 서버와 시스템 시계를 동기화 (
chronyd또는ntpd) - systemd-timesyncd — 가벼운 SNTP 클라이언트 (기본 내장)
시간 오차가 생기는 주요 원인: VM/컨테이너 슬립, RTC 배터리 방전, NTP 서버 연결 실패, 잘못된 타임존 설정.
1단계 — timedatectl로 전체 상태 확인
timedatectl
출력 예:
Local time: Thu 2026-05-29 14:32:10 KST
Universal time: Thu 2026-05-29 05:32:10 UTC
RTC time: Thu 2026-05-29 05:32:09
Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
NTP service: active
확인 포인트:
System clock synchronized: yes— NTP 동기화 성공 여부NTP service: active— NTP 데몬 실행 여부Local time과RTC time의 차이 — UTC 오프셋과 맞는지
NTP가 비활성 상태라면:
sudo timedatectl set-ntp true
systemctl status chronyd # 또는 systemd-timesyncd
2단계 — chrony 동기화 상태 점검
chronyc tracking
Reference ID : A29FC87B (time.google.com)
Stratum : 2
System time : 0.000015 seconds slow of NTP time
RMS offset : 0.000023 seconds
Frequency : 2.345 ppm slow
System time— 현재 오프셋. 수백 밀리초 이상이면 문제Stratum— NTP 계층 (1=원자시계 직접, 2=1계층 서버 참조)RMS offset— 안정성 지표
# NTP 서버 목록과 상태
chronyc sources -v
# * = 현재 사용 중인 서버
# + = 후보 서버
# ? = 응답 없음
3단계 — 오프셋이 크면 강제 보정
chrony는 기본적으로 시간을 서서히 맞춘다(slewing). 수천 초 차이가 나면 자동 보정에 몇 시간이 걸린다.
# 즉각 한 번 강제 동기화 (시간 점프)
sudo chronyc makestep
# 또는 서비스 재시작 (시작 시 makestep 옵션이 있으면 자동 수행)
sudo systemctl restart chronyd
/etc/chrony.conf에 makestep 1.0 3 옵션이 있으면 재시작 시 자동으로 큰 오프셋을 즉각 보정한다.
4단계 — NTP 서버 연결 확인
# NTP 서버로 UDP 123 통신 가능한지 확인
nc -zu pool.ntp.org 123
# 방화벽 통과 여부
sudo tcpdump -n port 123
NTP 서버를 내부 서버로 변경해야 하는 경우:
# /etc/chrony.conf 수정
server ntp.internal.company.com iburst prefer
# 기존 pool 항목 주석 처리 후
sudo systemctl restart chronyd
chronyc sources
5단계 — 타임존 오류 수정
# 사용 가능한 타임존 목록
timedatectl list-timezones | grep Seoul
# 타임존 설정
sudo timedatectl set-timezone Asia/Seoul
# 환경 변수로 임시 설정 (현재 세션만)
export TZ='Asia/Seoul'
date
컨테이너에서는 호스트의 /etc/localtime을 마운트하거나 TZ 환경변수를 주입하는 것이 일반적이다.
VM/컨테이너 시간 drift 문제
가상 머신이 슬립(suspend)됐다 깨어나면 시스템 시계가 크게 어긋난다. KVM/VMware에서는 Guest Additions나 하이퍼바이저 시간 동기화를 사용하고, 동시에 내부 NTP를 활성화해 이중 보정한다.
# KVM 게스트에서 하이퍼바이저 시간 동기화 확인
cat /sys/class/ptp/ptp0/clock_name
# KVM virtual PTP
# /etc/chrony.conf에 추가
refclock PHC /dev/ptp0 poll 2 dpoll -2 offset 0
하드웨어 시계와 시스템 시계 동기화
# 하드웨어 시계 확인
hwclock --show
# 시스템 → 하드웨어 시계에 쓰기
sudo hwclock --systohc
# 하드웨어 → 시스템 시계에 쓰기
sudo hwclock --hctosys
시간 동기화 문제의 핵심 진단 순서는 timedatectl → chronyc tracking → chronyc sources → 방화벽 UDP 123 이다. 오프셋이 크면 makestep으로 즉각 보정하고, 재발을 막으려면 NTP 데몬이 항상 실행 중인지 모니터링한다.
지난 글: 프로세스 멈춤 — Hung Process 조사
다음 글: 로케일 및 인코딩 문제 — 한글 깨짐 트러블슈팅
읽어주셔서 감사합니다. 😊