2011-12-30 4 views
1

큰 응용 프로그램을 개발 중이므로 테스트를로드해야합니다. PHP/NGinx를 실행하는 응용 프로그램 용 HighCPU Ex.Large 인스턴스가 하나있는 EC2 기반 클러스터입니다.EC2 클러스터에서 Nginx 스케일링 및 병목 확인

이 응용 프로그램은 일부 5k - 10k 키 값을 보유하는 redis 서버에서 데이터를 읽은 다음 응답을 작성하고 mongoDB 서버에 데이터를 기록하고 클라이언트에 다시 응답합니다.

언제든지 앱 서버에 요청을 보내면 약 20 - 25ms 내에 모든 계산이 끝납니다.

이제로드 테스트를하고 서버에 요청을 보내려면 랩톱에서 PHP 기반 응용 프로그램을 실행하려고합니다. 수천명의 사람들이 20-30 초가 넘었습니다. 이로드 기간 동안 브라우저에서 앱 URL을 열 때마다 다시 약 25 - 35ms의 실행 시간으로 응답합니다. 다시 멋진 메시지입니다. 그래서 나는 redis와 mongo가 병목 현상을 일으키지 않는다고 확신합니다. 그러나로드하는 동안 응답을 되 찾는 데 약 25 초가 걸립니다.

높은 CPU 예. 대형 인스턴스에는 8GB RAM과 8 코어가 있습니다.

로드 테스트 중에 top 명령은 약 4-6 개의 php_cgi 프로세스가 약 15-20 %의 CPU를 사용한다는 것을 보여줍니다.

저는 50 명의 작업자 프로세스가 nginx 및 1024 개의 작업자 연결에 있습니다.

병목 현상을 일으킬 수있는 문제는 무엇입니까?

이것이 작동하지 않는다면, 나는 임베디드 웹 서버와 임베디드 캐시를 사용하여 전체 자바 응용 프로그램으로 이동하는 것을 진지하게 고려하고 있습니다.

업데이트 - 8 PHP_FCGI_CHILDREN 증가하며로드하는 동안, 당신은 CPU 코어 당 하나 개의 작업자 프로세스를 너무 많이 필요하다

답변

1

50 개 작업자 프로세스를 응답 시간을 halfed. 더 많은 작업자 프로세스를 사용하면 프로세스 간 전환이 호출되므로 많은 시간이 소요됩니다.

당신은 지금 할 수있는 일 : (당신이 4 개 CPU 유닛이있는 경우 CPU 당 하나의 작업자, 예를 들어 4 작업자 프로세스)을 최소로 1. 설정 작업자 프로세스를하지만, 작업자 연결 - 최대 (예 : 10240)

  1. sysctl을 통해 TCP 스택을 조정하십시오. 연결이 많은 경우 스택 제한에 도달 할 수 있습니다.

  2. nginx stub_status 모듈 (munin + nginx를 사용할 수 있으며 설치가 쉽고 시스템 상태에 대한 충분한 정보를 제공)에서 통계를 가져옵니다.

  3. nginx error.log 및 시스템 메시지 로그에서 오류를 확인하십시오.

  4. 튠업 nginx (연결 타이밍 및 최대 쿼리 크기 감소).

여러분을 돕기를 바랍니다.

+0

감사합니다. 나는 그 작업자 프로세스를 10으로 편집했습니다. 아직 많이 향상되지 않았습니다. 한가지 주목할 점은 단지 5 개의 php-cgi 프로세스가 실행되고 있다는 것입니다. 또한 PHP_FCGI_CHILDREN은 5로 설정됩니다. 이것을 많이 늘리면 다소 도움이 될 것이라고 생각하십니까? 내가 8 코어 있다고 생각해. –