2016-12-20 2 views
1

Nginx에 성능 문제가 있습니다.Nginx 성능 문제

하나의 Nginx 서버가 4 개의 node.js 응용 프로그램 앞에 앉아 있습니다. 노드 응용 프로그램은 멋진 일을하지 않고 expressJS 스택을 반복하며 외부 DB 소스 등에 액세스하지 않습니다.

저는 ApacheBench를 사용하여 응용 프로그램의 성능을 벤치 마크합니다. 내 upstream 규칙에서 단일 서버를 사용할 때 일정한 처리량을 얻을 수 있습니다. 1000 req/s

upstream cp_backend { 
    server 10.134.14.128:5000; 
    keepalive 32; 
} 

반환 1000 req/s 예를 들면 다음과 같습니다. 내가 (예를 들어, 두 번째 서버에서 실행) 두 번째 노드 응용 프로그램을 추가 할 때 :

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    keepalive 32; 
} 

을 (예상대로) 나는 주위 2000 req/s 처리량을 참조하십시오.

그러나 2 개 이상의 백엔드 서버를 추가하자마자 앱이 더 이상 선형으로 확장되지 않습니다. 예를 들어 :

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    server 10.134.26.172:5000; 
    keepalive 32; 
} 

만 약 2500 req/s, 대신 예상대로 3000을 반환합니다. 마찬가지로 예상대로

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    server 10.134.26.172:5000; 
    server 10.134.26.178:5000; 
    keepalive 32; 
} 

만 대신 4000의 약 3000 req/s 돌아갑니다.

배경을 좀 더 제공하십시오. 나는 다른 서버 (non nodeJS) 응용 프로그램을이 서버 세트에서 실행 중이며 17k req/s 이상을 얻을 수 있으므로 Nginx를 알고 내 컴퓨터가이 숫자에 도달 할 수 있는지 알고 있습니다. content-length이 노드 앱보다 실제로 17k 테스트에서 더 큰 것을 언급 할 가치가 있습니다.

각 노드 앱은 자체 리소스를 사용하여 별도의 VM에서 실행됩니다. top과 같은 간단한 도구를 사용할 때 주요 병목 현상이 보이지 않습니다. 또한 node.js VM이 1000 req/s를 수행 할 수있는 단일 업스트림 서버를 사용할 때도 알 수 있습니다. nginx 병목 현상이있는 것 같습니다. nginx를 통해 1000 req/s를 얻을 수 있기 때문입니다. 각 노드 앱이 1000 req/s을 사용할 수 있다는 것을 알고 있다면 4k req/s과 4 upstream 개의 서버를 얻을 수없는 이유는 무엇입니까?

좋은 프로파일 링 소프트웨어에 대한 권장 사항은 무엇입니까?

답변

0

진단을 시도하거나 개발중인 하드웨어 종류를 지정하지 않았기 때문에 매우 좋은 답변을 얻지 못할 수 있습니다.

하드웨어로 인해 리소스가 부족하다고 생각합니다. CPU를 최대화하거나 네트워크 연결을 포화 상태 일 가능성이 높습니다.

각 노드 응용 프로그램은 자체 스레드를 갖지만 두 스레드가 동일한 코어에서 실행되는 경우 서로의 성능에 영향을 줄 수 있습니다. 각 앱이 자체 코어에서 실행 되더라도 버스를 포화시킬 수 있습니다.

네트워크 포화 상태라면 앱이 대역폭을 놓고 싸우고 있으며 네트워크 격리가 잘되어야한다는 것을 의미합니다.

마지막으로 ApacheBench를 실행하는 컴퓨터는 계속 고생하고 있습니다.

모든 경우에 서버가 분명히 훨씬 강력하고 잘 확장되어 있기 때문에 하드웨어 프로파일 러를 찾고 하드웨어가 수행하는 작업을 확인하십시오.

+0

답장을 보내 주셔서 감사합니다. 각 노드 응용 프로그램은 자체의 전용 VM을 가지고 있으므로 각 노드 응용 프로그램은 자체 코어에서 실행됩니다. 예제에서 볼 수 있듯이 각 노드 앱에는 자체 IP 주소가 있습니다. – cookandy

+0

예제에서 볼 수 있듯이 각 노드 앱에는 자체 IP 주소가 있습니다. 그것이 네트워크라면, 나는 동일한 서버에서 실행되는 (더 큰 콘텐츠 길이와 함께) 다른 앱으로 17k req/s를 기대하지 않을 것이다. – cookandy

+0

가상화 된 환경 내의 각 앱마다 다른 IP를 지정할 수있다. 귀하는 귀하의 세부 사항을 분명히하지 않았습니다. – Soviut

1

nginx 프록시 서버를 비롯한 병목 현상을 이해하려면 각 노드의 CPU 및 메모리 사용률에 대한 세부 정보가 필요합니다.

프록시에 2 개 이상의 업스트림 서버를 연결할 때 'least_conn'매개 변수를 사용하는 것이 가장 좋습니다. 이렇게하면 서버로드 분포가 동일하고 그 시간에 부하가 가장 적은 서버를 선호하게됩니다.

당신은 당신뿐만 아니라 조정 Nginx에해야 할 수도 있습니다 http://nginx.org/en/docs/http/load_balancing.html

에서 더 많은 정보를 얻을 것이다. http://clouditops.blogspot.in/2016/11/improve-nginx-performance.html