오늘 내 서버는 책임을 질 수 없게 되었고 SSH에 로그인할 수도 없었습니다. 하지만 내 서버 응용 프로그램을 실행했을 때 "최상위" 데이터를 복원할 수 있었습니다.
서버가 실행 중이지만 새 연결을 허용하지 않지만 내 응용 프로그램은 여전히 "top" 명령의 출력을 내 웹 인터페이스로 보내고 있습니다. 2% CPU 사용량 0.0% wa load 110 ? 어떻게?
시스템 로그에서 의심스러운 내용을 발견했습니다. https://pastebin.com/u8kLCJEM
약 10번 정도 나타났고, 제가 왔을 때(1시간 후) syslog에 더 이상 메시지가 없었습니다. 상단의 스크린샷을 찍고(110 로드) 서버를 완전히 다시 시작했는데 모든 것이 잘 작동했습니다. 하지만 서버가 충돌한 이유와 이를 방지하는 방법을 알고 싶습니다.
답변1
귀하의 시스템 로그에는 그다지 의심스러운 내용이 없습니다.
내가 볼 수 있는 것:
- 약 64GB RAM을 차지하는 JVM(Java Virtual Machine)이 있습니다.
- 64GB의 물리적 RAM이 있습니다.
- 너 교환 안 했어
이것이 바로 문제의 이유입니다. JVM이 누출되고 있습니다.
어떻게든 종료한 다음 다시 시작해야 합니다.
상위 콘솔과 웹 콘솔이 작동하는 이유는 사용 가능한 메모리가 약간 있고 JVM이 이상할 때 이미 실행 중이기 때문입니다. 따라서 많은 RAM을 할당할 필요가 없으며 사용하는 RAM의 양이 적어도 괜찮습니다.
다른 것, 시작하고 싶은 것, 운이 좋지 않습니다. 예를 들어, sshd는 새 프로세스(따라서 새 셸)를 포크할 수 없는 것 같습니다.
JVM은 많은 양의 RAM을 선호하지만 그다지 많지는 않습니다. 64GB가 이미 한계입니다. 서버가 호스팅하는 웹 응용 프로그램에 문제가 있습니다. 그것이 정확히 무엇인지는 그 위에서 실행되는 웹 애플리케이션을 더 깊이 조사해야만 찾을 수 있습니다.
시스템이 제대로 작동하려면 먼저 JVM을 어떻게든 종료해야 합니다. 명령줄에서 간단한 kill -9 13116
작업을 수행할 수 있지만 지금은 명령줄이 없습니다.
그러나 명령줄은top
할 수 있는프로세스를 종료합니다(k를 누르고 PID 선택). 웹 기반 상단에도 동일한 기능이 존재할 수 있습니다.
아무것도 작동하지 않으면 다시 시작해야 합니다.
장기적: JVM 플래그를 사용하고 메모리 사용량을 제한해야 합니다. .ini 파일 어딘가에 플래그를 설정할 수 있습니다. 이러한 플래그는 다음과 같습니다 -Xmx<number> -Xms<number>
. 이것들을 확인해 보세요. 세부사항은 애플리케이션 서버에 따라 다릅니다.
이런 종류의 RAM 난동은 Java에서는 일반적이지 않으며 뭔가 올바르지 않습니다. 귀하의 애플리케이션을 알아야만 그것이 무엇인지 정확히 알 수 있습니다.
보안 취약점이 귀하의 로그에 표시되지 않습니다.