계속 오르는 Ruby Process를 어떻게 디버깅하나요?

계속 오르는 Ruby Process를 어떻게 디버깅하나요?

며칠 전 내 앱 서버 4개 모두에 문제가 발생하기 시작했습니다. 일부 코드를 배포한 후에 발생했지만 내가 한 일은 일부 IP 주소를 저장하는 로컬 데이터베이스 파일을 업데이트하는 것뿐이므로 실제 코드를 변경하지 않았습니다. 바로 그 무렵, 내 루비 프로세스가 이제 통제 불능 상태가 된 것 같습니다. 한동안 괜찮다가 갑자기 하나의 CPU에서 CPU 성능이 100%로 빠르게 올라갑니다. 나는 승객을 사용하고 있기 때문에 결국 다른 스레드가 동일한 작업을 수행하고 다른 CPU를 최대화하는 등 웹 서버가 더 이상 트래픽을 처리할 수 없고 응답을 멈출 때까지 계속됩니다.

나는 많은 조사를 해왔지만(나는 잘하지 못합니다), 그러나 적어도 프로세스에서 strace를 실행할 때 시작하기에 꽤 정상적으로 보인다는 것을 발견했습니다. 그리고 위에서 설명한 대로 미쳐버릴 때, 끊임없는 clock_gettime(CLOCK_REALTIME, {1518938625, 9566131}) = 0전화의 홍수입니다. 내가 말했듯이 일반적인 프로세스는 예를 들어 웹 요청이 들어올 때만 지속적으로 내용을 뱉어내는 것이 아니라 프로세스를 종료하거나 승객을 다시 시작하거나 서버를 재부팅할 때까지 문제가 발생하여 계속 미쳐가는 것입니다. 그런 다음 한두 시간 내에 다시 문제가 발생합니다.

나는 며칠 동안 보모를 하면서 계속해서 절름발이를 유지하기 위해 계속해서 작업을 다시 시작했지만 몇 가지 아이디어가 절실히 필요합니다. 나는 clock_gettime과 관련된 100% CPU 문제에 대해 이야기하는 2013년과 같은 아주 오래된 게시물 몇 개를 발견했으며, 내가 본 몇 가지 게시물과 관련된 제안을 두 가지 모두 시도했습니다. 하나는 TZ 변수를 설정하는 것이고, 다른 하나는 일종의 윤초 버그를 수정하는 것입니다. 제안된 수정 사항의 이유를 이해할 수 없지만 안타깝게도 작동하지 않았습니다.

다음 스택을 실행 중입니다: ruby ​​2.2.0 Passenger 독립 실행형: Gem 버전: 4.0.58 (그리고 동작 변경 없이 한 서버에서 5.2.0으로 업그레이드를 시도했습니다) MySQL CentOS 6.9

관련 정보