내 서버에 수많은 PHP 프로세스가 열려 있는 이유는 무엇입니까?

내 서버에 수많은 PHP 프로세스가 열려 있는 이유는 무엇입니까?

오늘 내 웹사이트가 작동하지 않는 것을 보고 서버에 ssh 연결하고 ps -eF를 실행했습니다. 4시간 동안 실행되는 약 200개의 PHP 프로세스가 보입니다.

Apache는 mpm 이벤트 및 mod fcgid로 구축되었습니다.

모든 PHP 프로세스를 종료했는데 이제 정상적으로 실행됩니다. 왜 이런 일이 발생합니까? 이것이 예상되는 동작입니까?

Apache가 PHP 프로세스 수와 해당 프로세스 ID를 추적하는 방법을 실제로 이해하지 못하므로 이에 대해 읽을 수 있을 때 누군가가 참조할 수 있다면 좋을 것입니다.

또한 이것이 항상 발생하는지 확인하기 위해 "ab" 명령(Apache Benchmark)을 사용하여 30개의 동시 요청으로 연속으로 약 4-5번 실행했으며 다시 150개의 PHP 프로세스가 실행되고 있습니다. 이제 "ab"를 계속 실행하면 더 많은 프로세스가 생성되지 않으며 웹 사이트는 계속 작동합니다. 제가 "ab"를 실행한 4~5번은 동시에 실행된 것이 아니었습니다. 하나의 "ab" 프로세스가 완료되자마자 다른 프로세스를 실행했지만 "ab"를 실행할 때마다 30개의 동시 요청을 수행했습니다.

이것에 대해 좀 밝혀주세요! 감사합니다 :)

답변1

예, 이는 예상된 동작입니다. 동시에 5개의 ab 복사본이 실행 중인 것으로 보입니다. 그 결과 150개의 PHP 프로세스가 5개의 ab 프로세스 각각에 대한 30개의 요청을 처리하게 되었습니다.

Apache는 모든 스레드가 메모리에서 실행될 수 있을 때 가장 잘 작동합니다. 스레드를 디스크로 교체해야 하는 로드가 발생합니다. 이런 일이 발생하면 응답 시간이 급격히 저하됩니다. 프로세스를 종료하면 성능이 향상됩니다. 이 경우 서버 성능이 저하될 수 있습니다. 최대 스레드가 너무 높게 구성된 경우 이 동작을 사용하여 DOS(서비스 거부)를 수행하는 것이 상대적으로 쉽습니다.

문제가 발생할 수 있는 또 다른 이유는 두 프로세스가 두 리소스에서 교착 상태에 빠지는 경우입니다. 다른 프로세스에 이러한 리소스 중 하나가 필요한 경우 응답하지 못할 수 있습니다. 이 경우 Apache는 생성되는 프로세스 수를 제한합니다. 교착 상태의 프로세스 중 하나를 종료하면 문제가 해결됩니다. 일반적인 잠금 순서에 따라 다른 교착 상태를 방지하기 위해 특정 프로세스를 종료해야 할 수도 있습니다. 이는 서버 성능에 거의 또는 전혀 영향을 미치지 않습니다.

프로그래밍 오류로 인해 스레드가 중단될 수도 있습니다. 이로 인해 본 것처럼 헤드가 달라붙을 수 있습니다. 사후에 무슨 일이 일어났는지 알아내는 것은 어렵지만 Apache 서버 로그 내용이 도움이 될 수 있습니다. 문제가 있는지 오류 로그를 확인하십시오. 액세스 로그에는 프로세스를 종료한 시점에 중단된 요청에 대한 항목이 있을 수 있습니다.

Apache는 일정 기간 동안 사용되지 않는 경우 일부 프로세스를 종료해야 합니다. 이는 MaxSpareThreads매개변수에 의해 제어됩니다. 스레드, 서버 및 클라이언트 매개변수에 대한 몇 가지 설명이 포함되어 있는 제어 파일을 확인하세요. 일반적으로 기본값이 좋습니다.

코드에 문제가 있는 경우 MaxRequestsPerChild5000~100 범위로 설정하면 도움이 되는 경우가 많습니다. 숫자가 작을수록 새 스레드를 더 자주 생성해야 하며 Apache 서버가 작동하기가 더 어려워집니다.

편집: Apache는 시작 시 여러 스레드를 엽니다. 이는 여러 매개변수의 상호작용에 따라 달라집니다. 참조MPM 구성 문서매개변수에 대한 자세한 내용은 이는 서버 로딩과 무관하며 일반적으로 실행 중인 서버가 계속 실행되는 최소 스레드 수입니다.

관련 정보