부팅후 일정 시간(5min~) 경과후 tcpdump 실행시 network 단절 | system down 현상 분석
문제 발생 서버 정보
Date
2012/10/17
Server
한국의 KVM 제공 업체들 중의 하나
OS 정보
CentOS 6.3 / x86_86 / 2.6.32-279.9.1.el6.x86_64
CPU 정보
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.14.1
stepping : 3
cpu MHz : 2200.000
cache size : 512 KB
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm up unfair_spinlock pni cx16 popcnt hypervisor lahf_lm abm sse4a
bogomips : 4400.00
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
문제 확인 필요 사항들
- KVM 의 물리적 구성 정보
- KVM 의 Network 구성 정보
- KVM 의 부모 머신의 튜닝 정보(network…current_clocksource…)
문제의 현상
시스템 부팅후 몇분 경과후 -i 옵션을 제외한 tcpdump 실행시 시스템 멈춤 현상.
멈춤이 풀린후 tcpdump 재실행시 정상 출력됨.
tcpdump 마지막 실행후 5분 이상 경과후 tcpdump 재실행시 시스템 멈춤 현상 재발생.
해당 현상은 tcpdump 마지막 실행후 경과 시간이 길어질수록 재실행시 멈춤 현상이 더 오래 지속 됨.
해당 현상이 발생 될때 간혹 /var/log/messages 에 아래 와 같은 로그가 기록 됨.
kernel: Clocksource tsc unstable (delta = -25769803766 ns). Enable .........
문제의 원인
- KVM 의 guest 머신의 usb device 장치 인식 실패 가능성?
- libcap 의 API 오류 가능성?
문제의 재현
tcpdump 를 통한 재현
$ tcpdump
tcpdump 소스스 분석을 통해 pcap_lookupdev() 함수에서 hang 확인
간단하게 code 를 통한 재현 [libpcap hang 재현 코드]
$ vi pcap_hang.c
#include <stdio.h> #include <pcap.h> int main() { char *dev=NULL, errbuf[256]; dev = (dev == NULL) ? pcap_lookupdev(errbuf) : dev; if (dev == NULL) { fprintf(stderr, "pcap_lookupdev : %s\n", errbuf); return(1); } printf("# Interface: %s\n", dev); return(0); }
$ gcc -o pcap_hang pcap_hang.c -lpcap
$ ./pcap_hang
문제의 해결 방법들
Option -i 로 interface 를 명시 하는것으로 이슈는 해결 된다.
$ tcpdump -i eth0
libpcap 의 수정
Call 추적
0 pcap_lookupdev()->pcap_findalldevs() : libpcap-1.3.0/inet.c 1 pcap_findalldevs()->pcap_platform_finddevs() : libpcap-1.3.0/fad-getad.c 2 pcap_platform_finddevs()->usb_platform_finddevs() : libpcap-1.3.0/pcap-linux.c 3 usb_platform_finddevs()->usb_dev_add() : libpcap-1.3.0/pcap-usb-linux.c
문제를 발생하는 Call은 libpcap의 pcap_lookupdev() 함수 실행시 문제가 발생 하는 것으로 보인다.
- 문제가 발생하는 함수의 중요 부분은 usb_dev_add() 부분으로 PCAP_SUPPORT_USB 를 define 하지 않고 Compile 하면 된다.
근본적인 문제 해결을 위해서는 아래 사항 또한 확인이 필요해 보인다. (Parent 에 권한이 없는 외부 서버)
host & guest 머신의 ntpd 실행 여부를 확인 및 동기화 설정
- CPU Clock 를 위한 host & guest 의 시간 동기화는 필수 이다.
KVM 부모 머신과 자식 머신의 current_clocksource 를 동일하게 설정
clocksource 실시간 변경하기
$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
kvm-clock tsc hpet acpi_pm$ echo "hpet" > /sys/devices/system/clocksource/clocksource0/current_clocksource
clocksource 부팅시 적용하기
$ vi /etc/grub.conf
kernel /boot/vmlinuz-2.6.32-279.9.1.el6.x86_64 …... clocksource=hpet
perf 등의 명령어를 사용하여 상태를 모니터링
Post a Comment