G(우아하게 마무리) 성장에 갇힌 Apache MPM 작업자 - "점수판이 꽉 찼습니다"

G(우아하게 마무리) 성장에 갇힌 Apache MPM 작업자 - "점수판이 꽉 찼습니다"

MPM 작업자 실행, Apache 2.4.46, Debian 9

우아하게 마무리하는 작업자는 시간이 지남에 따라 성장할 뿐, 끝내지 못하는 것 같습니다. 결국 용량이 부족해지고 "점수판이 꽉 찼습니다"라는 오류가 발생합니다. 아파치를 다시 시작하면 해제됩니다.

정지된 요청 중 상당수가 PHP가 포함되지 않은 순수한 이미지 GET이기 때문에 나는 그것이 내 웹사이트 코드(php)와 관련이 있다고 믿지 않습니다.

여기에 이미지 설명을 입력하세요

<IfModule mpm_worker_module>
ServerLimit 500
StartServers       10
MinSpareThreads    50
MaxSpareThreads    100
    ThreadLimit          64
    ThreadsPerChild      64
    MaxRequestWorkers     500
    MaxConnectionsPerChild   0
</IfModule>

점수판 여기에 이미지 설명을 입력하세요

예 g 노동자 여기에 이미지 설명을 입력하세요

일주일 동안 아파치, 여유 슬롯 감소 여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

Keep Alive를 켜고 끄려고 시도했습니다.

여기에 이미지 설명을 입력하세요

답변1

MPM 작업자를 사용하면 프로세스에 존재하는 스레드에 의해 요청이 처리됩니다.

에서https://httpd.apache.org/docs/2.4/mod/worker.html

단일 제어 프로세스(상위)는 하위 프로세스 실행을 담당합니다. 각 하위 프로세스는 ThreadsPerChild 지시문에 지정된 고정된 수의 서버 스레드와 연결을 수신하고 연결이 도착할 때 처리를 위해 서버 스레드에 전달하는 리스너 스레드를 생성합니다.

Linux에서 프로세스는 스레드를 '포함'합니다. 즉, 하나의 PID는 해당 PID의 다른 스레드와 메모리(다른 리소스 사이에서)를 공유하는 여러 스레드를 가질 수 있습니다.

사실, Linux는 실제로 '작업'에만 관심이 있으며, 멀티 스레드가 아닌 프로세스는 컨테이너가 있는 PID입니다.하나일.

Apache를 정상적으로 다시 로드하면 포함된 프로세스가 종료됩니다. 여기서 일어나는 일은 Apache가 컨테이너 PID를 다시 시작하기 전에 포함 프로세스의 모든 스레드가 완료될 때까지 각 스레드를 기다리게 한다는 것입니다.

따라서 귀하의 경우 해당 목록의 모든 프로세스에 포함된 단일 스레드가 여전히 사용 중이거나 어떤 이유로 중단된 경우가 있습니다.

몇 가지 옵션이 있습니다.

  1. 어쨌든 기다리기를 포기하고 다시 시작하세요.
  2. 문제 스레드(애플리케이션의 버그일 수 있음)를 찾아서 수정하세요.

1, 쉽습니다. GracefulShutdownTimeout높지만 어리석지 않은 값으로 구성 옵션을 추가하십시오 . 900초라고 말해보세요. 기본적으로 이것은 무한합니다. 즉, 문제 스레드가 완료될 때까지 스레드가 영원히 대기한다는 의미입니다.

이것의 가장 큰 단점은 중요한 작업을 수행하는 중에 프로세스에 충돌할 가능성이 있다는 것입니다. 프로세스를 종료하면 파일이 손상되거나 응용 프로그램이 미묘하게 중단될 수 있습니다. 또한 처리 도중에 클라이언트를 종료할 가능성이 (아주 작습니다) 있습니다.

2, 작업자 목록에 갇힌 스레드를 찾아낸 다음 연결이 수행하는 작업을 진단하는 작업이 포함되지만 설계 결함이 될 수 있는 것이 무엇인지 찾아내야 하며 중단하기 전에 해당 동작을 더 자신 있게 설명할 수 있습니다. 문제 스레드를 삭제하세요.

관련 정보