Nginx 요청 / 초를 최대화하기위한 팁?


15

분석 패키지를 구축 중이며 프로젝트 요구 사항에 따르면 하루에 10 억 건의 조회수를 지원해야합니다. 그래, "십억". 다시 말해, 초당 12,000 회의 적중이 지속되고, 바람직하게는 파열 될 여지가있다. 이를 위해 여러 개의 서버가 필요하다는 것을 알고 있지만 "더 많은 하드웨어를 던지기"전에 각 노드에서 최대 성능을 얻으려고합니다.

현재 조회수 추적 부분이 완료되었으며 최적화되었습니다. 요청을 Redis에 바로 저장합니다 (나중에 Hadoop으로 처리하기 위해). 이 응용 프로그램은 게이트웨이 용 gunicorn이있는 Python / Django입니다.

내 2GB Ubuntu 10.04 랙 공간 서버 (프로덕션 머신 아님)는 초당 약 1200 개의 정적 파일을 제공 할 수 있습니다 (단일 정적 자산에 대해 Apache AB를 사용하여 벤치 마크 됨). 비교를 위해 정적 파일 링크를 내 추적 링크와 교체하면 초당 약 600 건의 요청이 발생합니다. 동일한 정적 자산을 제공하는 것보다 2 배 더 느리기 때문에 추적기가 잘 최적화되어 있음을 의미합니다 자꾸.

그러나 수백만 건의 히트로 벤치마킹 할 때 몇 가지 사항이 있습니다.

  1. 디스크 사용량 없음-모든 Nginx 로그를 해제했으며 사용자 정의 코드는 아무것도하지 않고 요청 세부 정보를 Redis에 저장하기 때문에 예상됩니다.
  2. 일정하지 않은 메모리 사용-아마도 Redis의 메모리 관리로 인해 메모리 사용량이 점차 증가하고 감소하지만 한 번도 병목 현상이 발생하지 않았습니다.
  3. 시스템로드는 2-4 정도이며, 가장 무거운 벤치 마크에서도 시스템이 여전히 응답하며, 다른 서버가 600 건의 요청을 수행하는 동안 눈에 띄게 지연되지 않고 http://mysite.com/tracking/pixel 을 수동으로 볼 수 있습니다 둘째.
  4. 짧은 테스트를 실행하면 50,000 개의 조회 (약 2m 소요)가 초당 안정적인 600 건의 요청을받습니다. 더 긴 테스트 (지금까지 3.5m까지 시도)를 실행하면 r / s가 약 250으로 저하됩니다.

내 질문들-

ㅏ. 이 서버를 아직 최대로 사용하고있는 것 같습니까? 1,200 / s 정적 파일 nginx 성능은 다른 사람이 경험 한 것과 비슷합니까?

비. 이러한 대용량 애플리케이션에 공통적 인 nginx 튜닝이 있습니까? 작업자 스레드가 64로 설정되고 gunicorn 작업자 스레드가 8로 설정되었지만이 값을 조정해도 크게 도움이되지는 않습니다.

씨. 들어오는 연결을 제한 할 수있는 리눅스 수준의 설정이 있습니까?

디. 장기 실행 테스트에서 성능이 250r / s로 저하되는 원인은 무엇입니까? 다시 말하지만이 테스트 중에는 메모리가 최대치가 아니며 HDD 사용량이 없습니다.

미리 감사드립니다. :)

편집은 여기 내 nginx를 설정 - http://pastie.org/1450749 - 명백한 지방이 밖으로 손질로는 주로 바닐라입니다.


한 게시물에서 여러 가지 질문을하고 있으므로 수정을 고려하십시오. 모든 부분에 답할 수 없으므로 의견이 아닌 답변을하고 있습니다. 필자는 Python / Django 성능을 고려했다고 가정합니다. 극단적 인 속도에는 적합하지 않습니다. 1200 req / s에 관해서는 1px gif 또는 HTTP 204 응답이라고 가정하는 것이 매우 낮습니다. fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world(24k 요청 / 초, 로컬 호스트에서 실행되지만 1 개의 nginx 작업자 만 사용)
Jesper M

금광 의견, 정말 감사합니다. 나는 글을 읽고 나의 결과를 다시 올 것이다. "다중 질문"포인터에 감사드립니다!
linkedlinked

답변:


8

Nginx의 worker_threads를 남용하고 있습니다. 그 많은 노동자들을 운영 할 필요는 전혀 없습니다. CPU 수만큼 작업자를 실행하고 하루에 호출해야합니다. 동일한 서버에서 gunicorn을 실행하는 경우 nginx 워커를 2 개로 제한해야합니다. 그렇지 않으면, 모든 프로세스를 관리하는 데 필요한 모든 컨텍스트 전환으로 CPU를 스 래시합니다.


1
아 고마워 성능은 2에서와 마찬가지로 64에서와 거의 비슷해 보였지만 WTF 가하고 있지 않다는 것을 알았습니다. 설명해 주셔서 감사합니다.
linkedlinked

Nginx 구성을 공유 할 수 있습니까? 튜닝 대상이 무엇인지 모르면 튜닝 팁을 제공하기가 어렵습니다.
blueben

2

정적 콘텐츠에 대한 5K 요청을 제공하기 위해 nginx를 사용했습니다. 현재 1024로 설정된 worker_connections 수를 늘릴 수 있습니다.

max_client 계산은 다음과 같습니다.

기본 섹션의 worker_connections 및 worker_proceses를 사용하면 maxclients 값을 계산할 수 있습니다.

max_clients = worker_processes * worker_connections

리버스 프록시 상황에서 max_clients는

max_clients = worker_processes * worker_connections / 4

http://wiki.nginx.org/EventsModule#worker_connections

설정 용량을 알고 있으면 최대 작업자 연결을 쉽게 계산할 수 있습니다. 총 용량 / 코어 수는 최대 작업자 연결 수입니다. 총 용량을 계산하려면 여러 가지 방법이 있습니다.

  1. 가장 현실적인 수치를 제공하는 설정을 시도하고 벤치마킹하는 것이 좋습니다. 공성, pummel, 아파치 벤치 등과 같은 도구를 사용할 수 있으며 테스트 중에 시스템 리소스 사용량을 측정해야합니다.

위의 방법으로 문제가 해결되지 않으면 아래 방법을 시도하십시오. 나는 RAM과 IO를 무시하고 넓은 가정을하고 있는데, 그것들도 고려할 것이지만 이것들은 시작점을 줄 것이고 거기서부터 조정할 수 있습니다.

  1. 대역폭이 병목 상태라고 가정하고 nginx가 제공하는 평균 객체 크기를 취하여 대역폭을 나누면 최대 지원 QPS를 얻을 수 있습니다.

  2. 두 번째 가정에서 CPU는 병목 현상입니다. 이 경우 요청 시간을 측정하고 1을 시스템의 코어 수로 나누어 1로 나눕니다. 이것은 nginx가 처리 할 수있는 초당 요청 수를 제공합니다.


worker_connections을 늘릴 수 있는지와 주어진 서버에 이상적인 설정을 결정하는 방법은 무엇입니까?
Kato

이것에 대해 몇 가지 방법이 있습니다.
Sameer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.