Friday, May 13, 2016

KvmTroubleShooting

부팅후 일정 시간(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 .........

문제의 원인

  1. KVM 의 guest 머신의 usb device 장치 인식 실패 가능성?
  2. libcap 의 API 오류 가능성?

문제의 재현

  1. tcpdump 를 통한 재현
    $ tcpdump

  2. tcpdump 소스스 분석을 통해 pcap_lookupdev() 함수에서 hang 확인

  3. 간단하게 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

문제의 해결 방법들

  1. Option -i 로 interface 를 명시 하는것으로 이슈는 해결 된다.
    $ tcpdump -i eth0

  2. 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 하면 된다.
  3. 근본적인 문제 해결을 위해서는 아래 사항 또한 확인이 필요해 보인다. (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 등의 명령어를 사용하여 상태를 모니터링

관련 링크

Related kernel mailing list



Post a Comment