를 실행할 때 nginx -s reload
nginx는 소프트 다시 로드(이전 프로세스의 기존 연결을 점차적으로 닫고 새 프로세스에서 새 요청을 처리함)를 의미합니다.
그렇게 하기는 하지만 (아마도) 이전 프로세스에 대한 활성 요청이 완료되지 않은 것 같습니다. 폭주 상황이 발생하며 reload
여러 번 시도하면 결국 서버의 메모리가 부족해집니다.
nginx가 제공하는 연결을 덤프하는 방법(아마도 C++ 모듈?)이 있습니까?특정한리눅스 PID?
nginx가 자체적으로 종료되는 것을 허용하지 않는 것이 무엇인지 정확히 알아낼 수 없다면 이 문제를 해결하는 방법을 잘 모르겠습니다.
(분할해서 정복하려고 사이트를 그냥 닫을 수는 없고, 200개가 넘는 사이트가 있는 라이브 클라이언트 서버입니다)
nginx 버전: nginx/1.24.0
답변1
nginx는 작업자를 호스트별로 분리하지 않는다고 생각합니다. 작업자 프로세스가 연결, TLS, HTTP/2 핸드셰이크를 처리할 때까지(요청이 이미 작업자 프로세스에 "속해" 있음) 어떤 호스트를 제공하는지 알 방법이 없습니다. .
이러한 프로세스()에 gdb를 연결하면 gdb -p {pid}
어떤 스레드가 있고 어떤 스레드가 사용을 기다리고 있는지 확인할 수 있습니다 info threads
. 스레드가 일부 IO가 완료되기를 기다리고 있는 것일까요? 일부는 파이프에서 읽고 일부는 IPC입니까? 스레드( thread {number}
)를 선택하고 역추적( bt
)을 수행합니다. 지역 변수를 인쇄 print {variable name}
하고( ) 사용할 호출 스택의 수준을 선택할 수 있습니다( frame {stack frame nr.}
).