#!/bin/bash
echo "================================================"
echo "etcd 3.5 OS 파라미터 최적화 - 기존값 확인"
echo "================================================"
echo "Date: $(date)"
echo "Hostname: $(hostname)"
echo "================================================"
echo
echo "1. CPU 설정 확인"
echo "----------------------------------------"
echo "CPU 개수: cpu" ]; then
cpu_num=$(echo $cpu | grep -o 'cpu[0-9]')
echo " $cpu_num: $(cat $cpu)"
fi
done
echo
echo "사용 가능한 Governor:"
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 2>/dev/null || echo " 정보 없음"
echo
echo "권장사항: performance 또는 conservative 모드"
echo "설정명령: echo performance | tee /sys/devices/system/cpu/cpu/cpufreq/scaling_governor"
else
echo " CPU frequency scaling 정보를 찾을 수 없습니다."
fi
echo
echo "2. 메모리 설정 확인"
echo "----------------------------------------"
echo "총 메모리:"
free -h | head -2
echo
echo "Swap 설정:"
swapon -s
if [ $? -ne 0 ]; then
echo " Swap이 비활성화되어 있습니다. (권장)"
else
echo " 권장사항: etcd 성능을 위해 swap 비활성화"
fi
echo
echo "3. 디스크 I/O 설정 확인"
echo "----------------------------------------"
echo "마운트된 파일시스템:"
df -h | grep -E "(/dev" ]; then
device=(echo $dev | cut -d'/' -f4) scheduler=(cat $dev)
echo " $device: $scheduler"
fi
done
echo
echo "권장사항: SSD의 경우 noop 또는 deadline, HDD의 경우 cfq"
echo
echo "4. 네트워크 설정 확인"
echo "----------------------------------------"
echo "네트워크 인터페이스:"
ip link show | grep -E "^[0-9]+:" | awk '{print $2}' | sed 's/://'
echo
echo "기본 etcd 포트 상태 확인:"
echo " 포트 2379 (클라이언트): $(ss -ln | grep :2379 | wc -l) 개의 리스닝 소켓"
echo " 포트 2380 (피어): $(ss -ln | grep :2380 | wc -l) 개의 리스닝 소켓"
echo
echo "5. 커널 파라미터 확인"
echo "----------------------------------------"
echo "파일 디스크립터 제한:"
echo " 시스템 전체: $(cat /proc/sys/fs/file-max)"
echo " 현재 사용: $(cat /proc/sys/fs/file-nr | awk '{print $1}')"
ulimit -n > /dev/null 2>&1 && echo " 프로세스별 soft limit: $(ulimit -n)" || echo " 프로세스별 limit 확인 불가"
ulimit -Hn > /dev/null 2>&1 && echo " 프로세스별 hard limit: $(ulimit -Hn)" || echo " 프로세스별 hard limit 확인 불가"
echo
echo "TCP 소켓 설정:"
echo " net.core.somaxconn: $(cat /proc/sys/net/core/somaxconn)"
echo " net.ipv4.tcp_max_syn_backlog: $(cat /proc/sys/net/ipv4/tcp_max_syn_backlog)"
echo
echo "가상 메모리 설정:"
echo " vm.swappiness: $(cat /proc/sys/vm/swappiness)"
echo " vm.dirty_ratio: $(cat /proc/sys/vm/dirty_ratio)"
echo " vm.dirty_background_ratio: $(cat /proc/sys/vm/dirty_background_ratio)"
echo
echo "6. etcd 프로세스 확인"
echo "----------------------------------------"
etcd_pid=etcd_pid" ]; then
echo "etcd 프로세스 발견 (PID: $etcd_pid)"
echo "현재 I/O 우선순위:"
ionice -p $etcd_pid 2>/dev/null || echo " ionice 명령을 사용할 수 없습니다."
echo
echo "프로세스 리소스 사용량:"
ps -p $etcd_pid -o pid,ppid,user,pcpu,pmem,vsz,rss,tty,stat,start,time,cmd
echo
echo "권장사항: ionice -c2 -n0 -p $etcd_pid (best effort, highest priority)"
else
echo "실행 중인 etcd 프로세스가 없습니다."
fi
echo
echo "7. 디스크 성능 간단 확인"
echo "----------------------------------------"
echo "현재 디렉토리의 디스크 동기화 성능 테스트 (10회):"
echo "etcd는 50 sequential IOPS (7200 RPM) 최소 필요, 500 sequential IOPS (SSD) 권장"
tempfile="/tmp/etcd_disk_test$(date +%s.%N)
dd if=/dev/zero of=temp_file bs=4K count=1 conv=fdatasync &>/dev/null end_time=(date +%s.%N)
duration=end_time - end_time - (echo "total_time + $duration" | bc -l 2>/dev/null || python3 -c "print(total_time + duration)") done rm -f $temp_file avg_time=(echo "total_time / 10)")
iops=$(echo "1 / $avg_time" | bc -l 2>/dev/null || python3 -c "print(1 / $avg_time)")
printf "평균 fsync 시간: %.3f초\n" $avg_time
printf "예상 sequential IOPS: %.0f\n" $iops
echo
echo "8. 트래픽 컨트롤 설정 확인"
echo "----------------------------------------"
echo "현재 qdisc 설정:"
tc qdisc show 2>/dev/null || echo " 트래픽 컨트롤 정보를 가져올 수 없습니다."
echo
echo "etcd 트래픽 우선순위 설정 예시:"
echo " tc qdisc add dev eth0 root handle 1: prio bands 3"
echo " tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1"
echo " tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1"
echo
echo "9. 시스템 부하 확인"
echo "----------------------------------------"
echo "현재 시스템 부하:"
uptime
echo
echo "메모리 사용률:"
free | awk 'NR==2{printf " 사용률: %.2f%%\n", 3*100/$2}' echo echo "디스크 사용률:" df -h | awk 'NF=="/"{printf " 루트 파티션: %s\n", $5}'
echo
echo "================================================"
echo "etcd 3.5 최적화 권장 설정 요약"
echo "================================================"
echo
echo "1. CPU Governor:"
echo " echo performance | tee /sys/devices/system/cpu/cpu/cpufreq/scaling_governor"
echo
echo "2. I/O 우선순위 (etcd 실행 후):"
echo " ionice -c2 -n0 -p $(pgrep etcd)"
echo
echo "3. 파일 디스크립터 제한 (/etc/security/limits.conf):"
echo " soft nofile 65536"
echo " * hard nofile 65536"
echo
echo "4. 커널 파라미터 (/etc/sysctl.conf):"
echo " vm.swappiness = 1"
echo " net.core.somaxconn = 32768"
echo " net.ipv4.tcp_max_syn_backlog = 8192"
echo
echo "5. etcd 설정 권장값:"
echo " --heartbeat-interval=100 # 네트워크 RTT의 0.5-1.5배"
echo " --election-timeout=1000 # heartbeat-interval의 10배 이상"
echo " --snapshot-count=10000 # 메모리 사용량이 높으면 5000으로 조정"
echo
echo "6. 하드웨어 권장사항:"
echo " - CPU: 2-4 cores (일반적인 클러스터)"
echo " - Memory: 8GB+ (데이터 크기에 따라)"
echo " - Disk: SSD 권장 (500+ sequential IOPS)"
echo " - Network: 저지연 네트워크 (datacenter 내 < 1ms RTT)"
echo
echo "================================================"
echo "확인 완료: $(date)"
echo "================================================"