mod_wsgi를 통해 Django를 실행하는 동안 WSGIDaemonProcess에 몇 개의 프로세스를 지정해야합니까?


23

하나의 상자에 자체 Apache 가상 호스트에서 2 개의 사이트 (수퍼 유저 및 Serverfault)가 실행되고 있다고 가정 해 봅시다. 두 사이트는 Django가 제공하며 mod-wsgi를 사용하여 Apache에서 실행됩니다. 사이트 중 하나의 일반적인 구성 파일은 다음과 같습니다.

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

호스트는 Ubuntu를 실행하는 4GB RAM이있는 Linux 시스템입니다. 누구든지 내 두 사이트에 대해 위에서 지정해야하는 프로세스 수를 제안 할 수 있습니까? 실제 슈퍼 유저 및 Serverfault 사이트와 동일한 트래픽이 있다고 가정 해 봅시다.

답변:


22

글쎄, 얼마나 많은 트래픽 않는 실제 수퍼 유저와에 Serverfault 사이트가 있나요? 가설은 대답을 쉽게하기에 충분한 정보가 없으면 많이 사용되지 않습니다 ...

최악의 프로세스 수는 사이트에서 처리 할 수있는 초당 최대 요청 수를 해당 요청이 가장 느린 동작으로 처리 된 경우 한 프로세스에서 처리 할 수있는 초당 요청 수로 나눈 값이어야합니다. 해당 조치의 처리 시간의 역수). req / sec의 신뢰 구간 및 시간 측정 값을 기반으로 적절한 퍼지 계수를 추가하십시오.

평균 사례 수는 동일하지만 요청 / 초를 각 작업에 대한 초당 요청의 가중 평균으로 나눈 값 (가중은 특정 작업에 도달 할 것으로 예상되는 요청의 비율)입니다. 퍼지 요소가 유용합니다.

머신에서 실행할 수있는 프로세스 수의 실제 상한은 각 프로세스에 필요한 메모리의 최대량에 의해 결정됩니다. 하나의 프로세스를 스풀링 한 다음 현실적인 데이터 세트를 사용하여 다양한 메모리 부족 조치 (일반적으로 많은 데이터를 검색하고 처리하는 조치)를 실행하십시오 (테스트 용 장난감 데이터 세트를 사용하는 경우 50 또는 100). 그런 다음 작업 중 하나가 테이블의 모든 행을 검색하고 조작하는 경우 해당 테이블이 10,000 행으로 커지는 시점을 측정하는 데 적합하지 않습니다. 임계 값을 너무 낮게 설정하면 특정 메모리 사용 임계 값에 도달하는 작업자를 수확하는 스크립트를 사용하여 프로세스 별 메모리 사용을 인위적으로 제한 할 수 있습니다.

메모리 사용 수치를 얻은 후에는 시스템 오버 헤드 (512MB와 같은)를 위해 약간의 메모리를 빼고 같은 컴퓨터에서 같은 프로세스 (데이터베이스 등)를 실행하는 경우 더미를 더 많이 빼냅니다. 디스크 캐시 공간이 부족하지 않도록 디스크 작업 세트 크기에 따라 다르지만 512MB 이상으로 이동합니다. 그것은 당신이 한도를 얻기 위해 프로세스 당 메모리 사용량으로 나눈 메모리의 양입니다.

최대로드를 처리해야하는 프로세스 수가 상자에 넣을 수있는 프로세스 수보다 많으면 더 많은 머신이 필요합니다 (또는 가장 간단한 경우 데이터베이스를 다른 머신으로 이동해야 함).

몇 년 동안 웹 사이트를 확장 한 경험이 하나의 작고 간단한 SF 게시물로 만들어졌습니다.


프로세스 / 스레드 수의 또 다른 중요한 요소는 개별 요청을 처리하는 데 걸리는 시간과 가능한 모든 시간에 걸쳐 전체가 분산되는 것입니다. 다시 말해, 평균 응답 시간보다 큰 요청을 한 번에 처리해야하는 요청 수는 몇 개입니까? 따라서 더 오래 실행되는 요청의 영향이 심각하고 전체 구성 매개 변수를 과도하게 지시 할 수 있으므로 이론적 인 요청 / 초만큼 간단하지 않습니다. FWIW mod_wsgi 3.0에는 구성을 돕기 위해 이것에 대한 데이터를 수집하고 캡처하기 위해 내장 된 통계 수집 기능이 포함됩니다.
Graham Dumpleton 2009

@ Graham : 내 대답을 다시 읽으십시오. Requests / sec는 응답 시간의 역수에 불과하며 10 진수를 곱하는 것보다 정수 req / sec로 나누는 것이 더 쉽습니다.
womble

그러나 최악의 경우에만 대응하거나 그 문제의 평균에만 집중할 수는 없습니다. 기간에 해당하는 요청 비율 (즉, 가능한 모든 시간에 걸친 스프레드)을 기반으로 가중치를 부여해야합니다. 최악의 경우의 응답 시간을 실제로 취했다면 비현실적인 요구 사항이 생길 것입니다. 문제는 어떤 수식을 사용 해야하는지 알기가 어렵습니다. 그렇기 때문에 mod_wsgi 3.0에는 스레드 사용률과 한 번에 여러 스레드가 사용중인 횟수 및 시간별 백분율을 보여주는 통계 수집 기능이 내장되어 있습니다.
Graham Dumpleton 2009

3
문제는 아마도 각 프로세스가 스레드를 사용하는 방법에 대해 걱정할 때 프로세스를보고있을 때 간단하지 않다는 것입니다. 즉, WSGIDaemonProcess 지시문은 각 프로세스가 기본적으로 15 개의 스레드를 사용하는 5 개의 프로세스를 나타냅니다. 내가 당신의 설명을 읽은대로 단일 스레드 프로세스를 가정하고 있습니다. 그렇지 않은 경우 모델이 GIL과 관련된 스레드와 경합 / 확장 문제를 어떻게 충족시키는 지 알려주십시오. 따라서 귀하의 설명은 단일 스레드 프로세스에만 유효하며 나는 주장하지 않을 것입니다.
Graham Dumpleton 2009

2
파이썬 코드와 모든 의존성이 스레드로부터 안전하다는 99 % 확신 할 때까지 "multithreaded-Apache + multiprocess-wsgi"방식이 최선의 방법이 아닌가?
Tomasz Zieliński

9

womble 의 답변은 굉장하지만, 경험이없는 사람들을 이해하고 적용하기는 조금 어렵습니다. 경험적인 숫자와 "간단한 콘텐츠"와 "전자 상거래"응용 프로그램 비교를주고 싶습니다.

적절한 mod_wsgi 구성과 관련하여 서로 다른 유스 케이스를 설정하는 것에 대한 자료는 많지 않으므로 여기에서 약간의 산문을 사용하는 것이 좋습니다.

A) CMS 사이트 및 마이크로 사이트

우리는 여러 고객 웹 사이트를 운영하며, 대부분은 주로 장고 CMS를 호스팅하는 콘텐츠 사이트 또는 마이크로 사이트, 일부 사용자 지정 양식, 때로는 백그라운드 작업을 위해 Celery를 운영합니다. 이 사이트는 리소스가 부족하지 않기 때문에 32GB RAM이 장착 된 단일 4 코어 Intel Xeon에서 병렬로 실행되는 사이트도 있습니다. 이러한 종류의 사이트 각각에 사용하는 구성은 다음과 같습니다.

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

단일 서버에서 약 40 개의 사이트에 대해 이야기하고 있는데, 대부분 스테이징 사이트가 대기 상태에서 실행됩니다. 서버 리소스 할당 기능에는 제한이 있지만 2 개의 프로세스 (기본적으로 각각 15 개의 스레드가 있음)를 사용하면 사이트의 상태가 양호합니다. 이 설정이 충분한 이유는 (CMS) 애플리케이션의 간단한 특성으로 정당화 될 수 있습니다. 요청을 완료하는 데 몇 밀리 초 이상 걸리지 않습니다. 아파치는 항상 편안한 상태를 유지하므로 CPU 부하도 늘어납니다.

B) 전자 상거래 사이트

더 복잡한 사이트는 계산 비용이 저렴한 로컬 운영이지만 거래 시간 측면에서 비싼 외부 종속성 (예 : 예약 데이터를 제공하는 웹 서비스)이 특징입니다. 외부 요청이있는 작업은 훨씬 더 오랜 시간 동안 스레드를 차지하므로 동일한 수의 사용자를 수용하기 위해 더 많은 스레드가 필요합니다 (위의 간단한 CMS 사이트와 비교). 더 나쁜 것은 외부 서비스가 요청에 즉각적으로 응답 할 수 없을 때, 때로는 몇 초 동안 스레드가 차단되는 경우가 있습니다. 이로 인해 사용 가능한 모든 mod_wsgi 스레드가 모두 사용되어 대기가 차단 될 때까지 스레드가 요청을 동일한 서비스 큐에 배치하는 불쾌한 부작용이 발생할 수 있습니다.

이러한 시나리오에서 우리는 6큰 차이를 보지 않고 프로세스 를 사용하려고 시도 12했으며 결과적으로 성능과 운영 안정성이 비교할 수없는 향상 을 보았습니다.

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

150 명의 사용자와 250 명의 병렬 사용자에 대한 일부 간단한로드 테스트는 사이트의 응답 속도를 유지하면서 쉽게 처리 할 수 ​​있습니다 ( 2프로세스를 사용하면 50 명의 사용자를 동시에 처리 할 수없는 프로세스). 32GB RAM이 장착 된 2 CPU 6 코어 Intel Xeon은 해당로드에서 25 % 미만의 CPU 사용률을 유지하며 RAM 사용량도 거의 25 % 미만으로 일정하게 유지됩니다. 여기서는 단일 사이트에만 전용 시스템을 사용하므로 다른 사이트에 필요한 리소스를 훔치지 않습니다.

결론

더 많은 수의 프로세스를 사용하는 것은 Apache가 사용 가능한 시스템 리소스를 사용하도록 허용하는 것 사이의 균형입니다. "공격"조건에서 안정적인 서버 시스템 (웹 사이트 아님!)을 유지하려면 숫자를 낮게 유지하십시오. 필요할 때 Apache가 시스템 리소스 (CPU, RAM)를 사용하도록 도와 주려면 더 높은 숫자를 선택하십시오. 당신이 갈 수있는 높이는 위의 허용 된 답변에 요약 된 것처럼 다소 계산되며 궁극적으로 사용 가능한 CPU 전력 및 RAM에 의해 제한됩니다.

(PS : modwsgi 프로젝트 위키 의 ConfigurationDirectives 섹션 을 Apache와 같은 백그라운드 읽기 용 베개 아래에 보관합니다 . 또한 Apache 서버의 열린 연결 을 이해하고 모니터링해야 합니다 .)


훌륭한 게시물이지만 왜 스레드 수를 설정하지 않습니까? 파이썬의 GIL은 스레드의 많은 장점을 무효화하기 때문에 스레드보다 더 많은 프로세스를 원한다고 가정하지만 스레드 수를 지정하면 이점이 있습니까?
Cerin

의 기본 수 threads는 15입니다 설명서에 따라 . 나는 그것을 명시 적으로 지정하는 이점이 없다고 생각합니다. 사실, 나는 이유를 위해 그것을 잊어 버렸다는 것을 기억합니다 : SO에 대한 게시물이 있거나 부작용을 피하기 위해 값을 생략하도록 권장하는 일부 문서가있었습니다 (나는 이상하게 들립니다). 불행히도, 나는 지금 그 출처를 찾지 못했습니다. 나머지 질문 (GIL)의 경우 아마도 내가보다 더 전문가 일 것입니다. 미안합니다.
Peterino

이 경험적 구성에 감사드립니다. 그러나이 게시물 에 따르면You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.