설정값 (Parameter) 권장사항 (Recommendation) 설정 명령 (Example Command) 설명 (Description)
하트비트 간격 (Heartbeat Interval) 평균 왕복 시간(RTT)의 0.5~1.5배로 설정 --heartbeat-interval 100 (밀리초 단위) 리더가 팔로워에게 자신이 활성화 상태임을 알리는 빈도. 지연 시간이 긴 환경에서 중요한 설정입니다.
선거 시간 초과 (Election Timeout) 평균 왕복 시간(RTT)의 최소 10배로 설정 --election-timeout 1000 (밀리초 단위) 팔로워가 리더의 하트비트를 기다리는 시간. 네트워크 변동성을 고려하여 충분한 값으로 설정해야 합니다.
스냅샷 튜닝 (Snapshot Tuning) 주기적으로 스냅샷을 생성 --snapshot-count 10000 로그 파일이 너무 커지는 것을 방지하고 성능을 최적화하기 위해 로그를 압축합니다. snapshot-count는 로그 항목 수가 이 값에 도달하면 스냅샷을 생성하도록 etcd에 지시합니다.
디스크 튜닝 (Disk Tuning) ionice와 같은 도구를 사용하여 디스크 I/O 우선순위 설정 ionice -c2 -n0 -p etcd 데이터 디렉터리가 포함된 디스크의 I/O 지연 시간을 줄입니다.
네트워크 튜닝 (Network Tuning) tc와 같은 도구를 사용하여 etcd 피어 간 트래픽에 우선순위 부여 tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1 etcd 클러스터 통신에 필요한 네트워크 트래픽의 지연 시간을 최소화합니다.
CPU 튜닝 (CPU Tuning) CPU 거버너를 performance 모드로 설정 cpupower frequency-set -g performance etcd 프로세스가 항상 최대 CPU 성능으로 실행되도록 하여 지연 시간을 줄입니다
ionice는 Linux에서 프로세스의 IO 우선순위를 설정하는 도구입니다. etcd와 같이 디스크 IO 성능이 중요한 애플리케이션에서 필수적인 튜닝 요소입니다.
0 (none) : 기본 스케줄링, 커널이 자동 결정
1 (rt) : Real-time, 최고 우선순위
2 (be) : Best-effort, 일반적인 우선순위 기반
3 (idle) : 시스템이 한가할 때만 IO 수행
0 = 가장 높음 (최고 우선순위)
1 = 높음
2 = 높음
3 = 보통
4 = 보통 (기본값)
5 = 낮음
6 = 낮음
7 = 가장 낮음 (최저 우선순위)
주의: 숫자가 작을수록 높은 우선순위입니다!
# etcd 프로세스의 현재 ionice 설정 확인
ionice -p $(pgrep etcd)
none: prio 0
| 항목 | 기본값 (none: prio 0) | 튜닝값 (be: prio 0) |
|---|---|---|
| 클래스 | none (커널 자동 결정) | be (Best-effort) |
| 우선순위 | 0 (실제론 be: prio 4) | 0 (명시적 최고 우선순위) |
| IO 접근 | 다른 프로세스와 공평 분배 | etcd 우선 접근 |
| 지연시간 | 시스템 부하 시 증가 가능 | 낮은 지연시간 보장 |
# Best-effort 클래스, 최고 우선순위로 설정
ionice -c2 -n0 -p $(pgrep etcd)
# 설정 확인
ionice -p $(pgrep etcd)
best-effort: prio 0
# etcd 실행 시 ionice 적용
ionice -c2 -n0 etcd
# 또는 Real-time 클래스 (더 높은 우선순위, 주의 필요)
ionice -c1 -n0 etcd
[Unit]
Description=etcd
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/ionice -c2 -n0 /usr/local/bin/etcd
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
# etcd WAL 패턴 테스트 (Sequential Write)
ionice -c2 -n0 fio \
--name=etcd-wal \
--rw=write \
--bs=64k \
--fsync=1 \
--size=1G \
--filename=/var/lib/etcd/wal-test
# etcd DB 패턴 테스트 (Random Read/Write)
ionice -c2 -n0 fio \
--name=etcd-db \
--rw=randrw \
--bs=4k \
--size=1G \
--filename=/var/lib/etcd/db-test
# IO 사용률 모니터링
iostat -x 1
# etcd 프로세스별 IO 모니터링
iotop -p $(pgrep etcd)
# top에서 etcd 프로세스만 필터링
top -p $(pgrep etcd)
# 또는 top 실행 후 'o'를 누르고 COMMAND=etcd 입력
# RT 클래스는 매우 강력하므로 주의
ionice -c1 -n0 etcd
ionice -c2 -n0으로 etcd의 IO 우선순위를 높이면:
✅ WAL 쓰기 지연시간 감소
✅ 클러스터 응답성 향상
✅ 안정적인 리더 선출
✅ 전체적인 etcd 성능 개선
etcd와 같은 분산 시스템에서는 낮은 지연시간이 핵심이므로, ionice 튜닝은 필수적인 최적화 작업입니다.
💡 Tip: 운영환경 적용 전에는 반드시 테스트 환경에서 충분한 검증을 거치세요!
etcd 클러스터에서 네트워크 혼잡으로 인한 dropped MsgProp, dropped MsgAppResp 오류를 해결하기 위한 Traffic Control(TC) 설정 방법을 상세히 알아보겠습니다.
dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full
Traffic Control을 사용하여 etcd peer 통신을 클라이언트 통신보다 높은 우선순위로 처리합니다.
tc qdisc add dev bond0 root handle 1: prio bands 3
| 항목 | 의미 | 설명 |
|---|---|---|
tc qdisc | 큐잉규칙 | 패킷 스케줄링 방식 정의 |
add | 추가명령 | 새로운 규칙 생성 |
dev bond0 | 본드장치 | 대상 네트워크 인터페이스 |
root | 최상위큐 | 모든 트래픽의 시작점 |
handle 1: | 핸들번호 | 큐 식별자 |
prio | 우선순위 | 우선순위 기반 스케줄러 |
bands 3 | 3단계 | 3개 우선순위 레벨 |
# 송신 트래픽
tc filter add dev bond0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
# 수신 트래픽
tc filter add dev bond0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
# 송신 트래픽
tc filter add dev bond0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:2
# 수신 트래픽
tc filter add dev bond0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:2
| 항목 | 의미 | 설명 |
|---|---|---|
tc filter | 필터규칙 | 트래픽 분류 조건 |
parent 1: | 상위참조 | 1번 큐의 하위 규칙 |
protocol ip | IP패킷 | IPv4 패킷만 처리 |
prio 1/2 | 필터순위 | 필터 적용 우선순위 |
u32 | 분류기 | IP 헤더 기반 매칭 |
sport/dport | 포트방향 | 송신/수신 포트 |
2380/2379 | 포트번호 | etcd peer/클라이언트 포트 |
0xffff | 포트마스크 | 정확한 포트 매칭 |
flowid 1:1 | 흐름식별 | 1번 밴드(최고 우선순위) |
flowid 1:2 | 흐름식별 | 2번 밴드(중간 우선순위) |
| 순위 | 포트 | 용도 | 밴드 | 처리방식 |
|---|---|---|---|---|
| 🥇 1위 | 2380 | etcd peer 통신 | flowid 1:1 | 최우선 처리 |
| 🥈 2위 | 2379 | etcd 클라이언트 통신 | flowid 1:2 | 중간 처리 |
| 🥉 3위 | 기타 | 일반 트래픽 | flowid 1:3 | 낮은 처리 |
# 1. 우선순위 큐 생성
tc qdisc add dev bond0 root handle 1: prio bands 3
# 2. Peer 통신 송신 우선순위 설정
tc filter add dev bond0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
# 3. Peer 통신 수신 우선순위 설정
tc filter add dev bond0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
# 4. 클라이언트 통신 송신 우선순위 설정
tc filter add dev bond0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:2
# 5. 클라이언트 통신 수신 우선순위 설정
tc filter add dev bond0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:2
# qdisc 확인
tc qdisc show dev bond0
# filter 확인
tc filter show dev bond0
tc qdisc del dev bond0 root
모든 트래픽 동일 우선순위
[클라이언트] [peer] [클라이언트] [peer] [기타] → 순서대로 처리
우선순위 1: [peer] [peer] [peer] → 최우선 처리
우선순위 2: [클라이언트] [클라이언트] → 중간 처리
우선순위 3: [기타] [기타] → 나중 처리
dropped MsgProp 오류 감소dropped MsgAppResp 오류 감소 이 설정을 통해 etcd 클러스터의 네트워크 안정성을 크게 향상시킬 수 있습니다! 🎯