apache/mod_wsgi/windows의 Django 멀티스레딩

apache/mod_wsgi/windows의 Django 멀티스레딩

나는 apache와 django의 조합을 처음 접했고 멀티스레딩이 어떻게 처리되는지에 관해 솔직하게 순진했습니다. 특히 저는 Windows 서버에서 실행하므로 MPM이 스레드 기반이라는 것을 알고 있습니다.

웹 사이트의 페이지를 제공하는 응용 프로그램과 때때로 발생하며 최대 30초 정도 소요되는 CPU 집약적 백그라운드 프로세스를 수행하는 또 다른 응용 프로그램이 있습니다. 성능 문제가 발생할까봐 걱정되고 몇 가지 질문이 있습니다. 이것이 다른 사람들에게도 도움이 되기를 바랍니다...

  1. Apache는 스레드 간에 동시 요청을 어떻게 분배합니까? CPU 사이에는? 어떤 종류의 논리가 이를 추진합니까? 각 요청이 별도의 스레드를 생성합니까?
  2. 별도의 CPU에서 실행되도록 특정 앱을 수동으로 지정할 수 있나요? 예를 들어 CPU가 4개인 시스템이 있는 경우 웹 사이트 요청에 CPU 1개를 설정하고 요청 시 백그라운드 프로세스 실행에 CPU 3개를 설정할 수 있나요?
  3. 여러 스레드가 동일한 데이터베이스를 어떻게 읽고 쓰나요? 쓰기는 사용자별로 수행되므로 충돌이 발생할 것으로 예상되지 않지만 이것이 실제로 어떻게 처리되는지는 모르겠습니다.
  4. 예를 들어 EC2에서 실행되고 인스턴스가 두 개 이상인 경우와 같이 해당 머신이 두 개 이상 있으면 어떻게 되나요? 요청은 어떻게 배포되나요?

감사합니다

답변1

일반적인 내용은 다음을 참조하세요.

Apache는 스레드 간에 동시 요청을 어떻게 분배합니까?

다중 스레드 구성의 경우 미리 생성된 스레드 풀이 있습니다. 새로운 요청이 도착하면 처리를 위해 풀에 있는 사용 가능한 스레드 중 하나로 전달됩니다. 완료되면 스레드는 다시 풀로 돌아갑니다.

Apache는 CPU 간에 동시 요청을 어떻게 분배합니까?

그렇지 않습니다. 특정 시점에 스레드가 실행되는 위치는 운영 체제에 의해 결정됩니다. 스레드는 Apache에 의해 특정 프로세서에 바인딩되지 않으므로 실행이 이동할 수 있습니다.

각 요청이 별도의 스레드를 생성합니까?

Apache가 처리하는 웹 요청의 경우 대답은 '아니오'입니다.

별도의 CPU에서 실행되도록 특정 앱을 수동으로 지정할 수 있나요?

프로세스를 프로세서에 바인딩하기 위해 프로세서 선호도를 설정할 수 있는 방법이 있지만 이를 수행하는 방법은 시스템에 따라 다릅니다. 내가 아는 한 Apache 자체는 이를 수행하기 위한 구성 메커니즘을 제공하지 않습니다.

여러 스레드가 동일한 데이터베이스를 어떻게 읽고 쓰나요?

주의하여. 일반적으로 데이터베이스 서버 프로세스는 이 모든 것에 대해 걱정하므로 걱정할 필요가 없습니다. 클라이언트에서는 각 요청에 대해 하나를 생성하여 각 스레드가 자체 데이터베이스 연결을 사용하고 있는지 확인해야 합니다. 또는 데이터베이스 연결 풀이 있고 스레드는 필요할 때 풀에서 연결을 잡고 필요할 때 반환합니다. 완료.

이는 서버 프로세스를 통해 액세스가 중재되는 데이터베이스를 가정합니다. 파일 시스템 기반 데이터베이스를 사용하는 경우 데이터베이스 클라이언트 라이브러리는 다중 스레드 액세스가 안전한지 확인해야 합니다.

예를 들어 EC2에서 실행되고 인스턴스가 두 개 이상인 경우와 같이 해당 머신이 두 개 이상 있으면 어떻게 되나요? 요청은 어떻게 배포되나요?

요청을 분산하려면 일종의 프런트 엔드 로드 밸런서가 필요합니다. 이는 적절한 로드 밸런서일 수도 있고 nginx 프런트 엔드를 프록시로 사용할 수도 있습니다.

관련 정보