가상 서버가 응답을 멈추고 CPU를 100% 사용하고 있습니다. 진단 방법은 무엇입니까?

가상 서버가 응답을 멈추고 CPU를 100% 사용하고 있습니다. 진단 방법은 무엇입니까?

CentOS 7.4 가상 서버(VMware ESXi)에서 서버 사용량이 몇 초 내에 갑자기 100%에 도달하여 SSH가 작동하지 않고 실행 중인 특정 프로그램이 응답하지 않는 이상한 문제가 발생하고 있습니다. 유일한 해결책은 vSphere를 통해 서버를 강제로 다시 시작하는 것입니다. 이러한 높은 사용량의 원인을 파악할 수 없습니다. 따라서 제 질문은 이렇게 갑작스러운 높은 사용량을 어떻게 진단합니까?입니다. 재부팅 후 조사하기 위해 일부 프로세스 정보를 기록하는 방법이 있습니까?

편집: ssh전혀 작동하지 않습니다. 실제로 제가 해냈는데 ssh -vvv자세한 출력이 "호스트 포트 22에 연결 중"에서 멈춰서 쉘이 결코 반환되지 않습니다. 연결이 설정되기를 기다리는 것 같습니다. 에 대해서는 ping당사 IT 엔지니어가 서버에 대한 ICMP 트래픽을 차단했기 때문에 ping작동을 확인할 수 없습니다.

답변1

비슷한 문제가 발생했을 때 다음과 같은 작은 스크립트를 만들었습니다(CPU 및 RAM 사용량과 함께 매초마다 실행 중인 프로세스의 날짜와 목록을 기록합니다).

#!/bin/sh
while true
  do 
    date
    ps faux
    sleep 1
  done >> /a/log/file

백그라운드 프로그램으로 실행하고 있습니다. 이는 프로세스가 언제 어디서 중단되는지 이해하는 데 도움이 됩니다.

/var/log/messages그 후에 는 문제를 정확히 식별하기 위해 다른 로그(아마 미친 프로그램의 로그)를 살펴봐야 합니다 .
설치할 수도 있습니다.atsarIO, 네트워크 활동, CPU 등에 대한 통계 로그가 포함된 놀라운 바이너리 로그를 제공합니다.

/!\ Warning:
이 스크립트를 충분히 오랫동안 실행하면 로그가 상당히 커질 수 있습니다. 충분한 디스크 공간이 있는 위치에 로그 파일을 저장하십시오. 그렇지 않으면 큰 문제가 될 수 있습니다.

/!\ Warning 2:
esxi 설정이 무엇인지 모르겠습니다. 그러나 어떤 이유로든 디스크가 esxi 전체에서 지연되는 경우 가상 머신이 IO에 의존하는 경우 이로 인해 심각한 지연이 발생하고 CPU 사용량이 높아질 수 있습니다.

편집 2:

@sourcejedi가 언급했듯이 스크립트에 동기화를 추가하여 하드 재부팅 시 로그가 기록되도록 할 수 있습니다(필요한지는 잘 모르겠지만 가장 안전한 두 가지가 하나보다 낫습니다.

#!/bin/sh
    LOGFILE="a/log/file"
    echo "" > $LOGFILE
    while true
      do 
        date
        ps faux
        sync $LOGFILE
        sleep 1
      done >> $LOGFILE

답변2

N개의 CPU가 있는 시스템에서는 N개의 사용자 공간 스레드를 실행할 수 있으며, 각 스레드는 CPU의 100%를 사용합니다. 그러나 이를 사용하려고 하면 ssh커널은 CPU 시간의 "공정한" 공유를 제공 ssh하고 로그인을 허용합니다.

VMware에서 CPU 사용량이 100%이고 ssh응답이 없으면 커널 내부에 사용 중인 루프가 있을 수 있습니다.

서버가 로컬 콘솔에서 그래픽 인터페이스를 실행하고 있지 않은지 확인하십시오. 커널이 인쇄한 모든 메시지를 볼 수 있도록 텍스트 모드에 있기를 원합니다. 이제 읽어보세요:

문서에 따르면딱딱한잠금 감지기(NMI 감시 기능이라고도 함)는 기본적으로 활성화되어 있습니다. 커널이 가상 머신에서 실행 중일 때 비활성화되지 않는 한. 따라서 이 경우 기본값은 감지만 하는 것입니다.부드러운잠금.

    /*
     * Hard lockup detection is enabled by default. Disable it, as guests
     * can get false positives too easily, for example if the host is
     * overcommitted.
     */
    hardlockup_detector_disable();

--아치/x86/kernel/kvm.c: kvm_guest_init()

나는 이것의 이론적 근거와 역사에 대해 혼란스러워합니다. 소프트 잠금 감지기가 하드 잠금 감지기보다 "더 안전"하다고 간주하는 이유를 모르겠습니다. 초기 변화도 합리적입니다.다른 이유. "게스트 PMU는 여전히 오류를 지우고 있습니다. KVM PMU가 충분히 안정되면 기본적으로 활성화된 하드 잠금으로 전환한다는 아이디어입니다." 마지막으로, 일부 하이퍼바이저 버전에서는 NMI 감시 기능을 전혀 활성화하지 못할 수도 있다는 점이 언급되었습니다.

하이퍼바이저에서 CPU를 많이 과도하게 사용하지 않는다고 가정하면 NMI 감시 기능도 활성화할 수 있는지 확인할 수 있습니다. 위의 링크를 사용 sysctl하거나 sysctl 문서에 커널 부팅 옵션을 사용할 수도 있다고 나와 있습니다 nmi_watchdog=1.

그런 다음 커널에서 인쇄된 메시지를 볼 수 있는지 테스트합니다.

커널 패닉이 인쇄되는지 알 수 있도록 "로컬 콘솔"이 기록되거나 적어도 지속됩니까? 실제로 그래야 하지만 시뮬레이션된 vSphere 등을 사용하면 어떻게 작동할지 잘 모르겠습니다.TV 시리즈편안. 아날로그 비디오 디스플레이만 사용하고 있다면 이미 지속되는 상태입니다.

이 VMWare 기사동일한 가정에 의존하는 것 같습니다.

콘솔 로깅을 비활성화하지 않았는지 확인하십시오. 다음 명령을 실행하세요:

sudo sh -c "echo '<3>test' >/dev/kmsg"

콘솔에 "Test"라고 표시되어야 합니다.

시뮬레이션된 비디오 디스플레이인 경우 일부 충돌 메시지가 화면 상단에서 스크롤되어 사라질 수 있습니다. 커널이 충돌하면 Shift+PageUp을 사용하여 위로 스크롤할 수 없습니다. 원칙적으로는 롤백을 구현하는 에뮬레이트된 직렬 콘솔을 갖는 것이 더 유용할 것입니다.

커널 패닉의 경우 위의 VMWare 링크에 몇 가지 다른 크래시 덤프 제안이 있습니다.

--Debian Stretch VM이 며칠마다 준응답이 없게 됩니다.

연결된 답변의 다른 지침 대부분은 보류 중인 작업 메시지에 관한 것입니다. 잠금이 설정된 경우 반드시 이러한 내용이 표시되는 것은 아닙니다.

즉, 라고도 언급됩니다 sysrq. sysrq+L가능한이것은 유용한 정보를 얻을 수 있는 또 다른 방법입니다.부드러운잠그세요. 그러면 각 CPU에 대한 커널 추적이 생성됩니다. 그러나 근본 원인은 CPU 중 하나에서만 볼 수 있으므로 거기에서 많은 메시지를 캡처할 수 있어야 합니다. 직렬 콘솔이 있으면 가장 좋습니다. 비디오 콘솔이 있는 경우 Shift+PageUp을 누르세요.가능한CPU가 많지 않다고 가정하면 이것이 작동합니다.

관련 정보