올해 초에 우리는 NGINX Plus의 성능을 벤치마킹하고 만들었습니다. 사이즈 가이드 베어 메탈 서버에 배포하기 위해서입니다. NGINX 오픈 소스 및 NGINX Plus는 널리 사용됩니다. 7계층 로드 밸런싱, 또한 ~로 알려짐 애플리케이션 로드 밸런싱.
[ 편집자 - NGINX Plus 기능과 하드웨어 비용 및 성능의 변경 사항을 반영하기 위해 크기 조정 가이드를 주기적으로 업데이트합니다. 위의 링크는 항상 최신 가이드를 보여줍니다.
웹 서버로서 NGINX 및 NGINX Plus의 성능에 대한 자세한 내용은 NGINX 및 NGINX Plus 웹 서버 성능 테스트를 참조하세요.
크기 가이드는 다양한 서버 크기에서 NGINX Plus를 실행할 때 기대할 수 있는 성능과 하드웨어에 대한 예상 비용을 설명합니다. 사이징 가이드를 사용하면 NGINX Plus 배포를 적절히 사양화하고 과도한 프로비저닝(즉시 비용이 발생함)이나 부족한 프로비저닝(성능 문제를 일으키고 장기적으로 비용이 발생함)을 최대한 방지할 수 있습니다.
우리는 고객과 우리의 결과를 재현하는 데 관심이 있는 다른 사람들로부터 우리가 사용한 방법론에 대한 질문과 함께 사이즈 가이드에 대한 많은 관심을 받았습니다. 이 블로그 게시물에서는 사이즈 가이드에 제시된 결과를 얻기 위해 수행한 테스트에 대한 개요를 제공합니다. 여기에는 우리가 사용한 토폴로지, 실행한 테스트, 그리고 사이징 가이드에 나열된 가격을 찾은 방법이 포함됩니다.
메모 : NGINX Plus에 맞춰서 사이즈 가이드를 개발했지만, NGINX Plus 구독 없이도 누구나 테스트를 재현할 수 있도록 테스트에는 NGINX 오픈 소스를 사용했습니다. 이 테스트에서는 NGINX Plus의 향상된 기능을 전혀 사용하지 않으므로 NGINX Open Source와 NGINX Plus의 결과는 동일합니다. NGINX 오픈 소스 버전 1.9.7은 NGINX Plus 릴리스 7과 거의 일치합니다 .
그러나 테스트 토폴로지에서 역방향 프록시와 백엔드 웹 서버를 더 잘 구별하기 위해 전자의 경우 NGINX Plus를, 후자의 경우 NGINX(오픈 소스)를 참조합니다.
모든 테스트는 간단한 평면 2계층 네트워크에서 듀얼 40GbE 링크로 연결된 세 대의 별도 장비를 사용하여 수행되었습니다.
클라이언트 머신에서 트래픽을 생성하기 위해 ab
(ApacheBench)와 유사한 성능 테스트 도구인 wrk를
사용했습니다. 다이어그램에 표시된 것처럼 모든 트래픽은 NGINX Plus 역방향 프록시 로 전달되었고, 이를 통해 NGINX 오픈 소스 웹 서버 백엔드로 연결이 전달되었습니다.
테스트에는 다음과 같은 하드웨어를 사용했습니다.
기계 | CPU | 회로망 | 메모리 |
---|---|---|---|
고객 | 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36개의 실제(또는 72개의 HT) 코어 | 2x 인텔 XL710 40GbE QSFP+(rev 01) | 16기가바이트 |
역방향 프록시 | 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36개의 실제(또는 72개의 HT) 코어 | 4x 인텔 XL710 40GbE QSFP+(rev 01) | 16기가바이트 |
웹 서버 | 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36개의 실제(또는 72개의 HT) 코어 | 2x 인텔 XL710 40GbE QSFP+(rev 01) | 16기가바이트 |
우리는 테스트를 위해 다음 소프트웨어를 사용했습니다.
wrk
버전 4.0.0이 NGINX 프록시 트래픽을 생성했습니다. 우리는 이 지침 에 따라 설치했습니다.우리는 다양한 수의 CPU를 사용하여 NGINX Plus 역방향 프록시 서버의 성능을 테스트했습니다. 하나의 NGINX Plus 작업자
프로세스는 하나의 CPU를 소모하므로 CPU 개수에 따른 성능을 측정하기 위해 작업자
프로세스의 개수를 바꾸어가며 테스트를 반복했습니다. 작업자
프로세스 개수는 2개, 4개, 8개 등으로 증가했습니다. NGINX 아키텍처 개요는 블로그를 참조하세요.
메모 : 작업자
프로세스 수를 수동으로 설정하려면 worker_processes
지시어를 사용합니다. 기본값은 auto로
, NGINX Plus가 CPU 수를 감지하고 CPU당 하나의 작업자
프로세스를 실행하도록 합니다.
우리는 다음과 같은 측정 항목을 측정했습니다.
모든 클라이언트 트래픽을 생성하기 위해 다음 옵션과 함께 wrk를
사용했습니다.
-c
옵션은 생성할 TCP 연결 수를 지정합니다. 테스트를 위해 연결 수를 50개로 설정했습니다.-d
옵션은 트래픽을 생성하는 기간을 지정합니다. 우리는 각각 3분씩 테스트를 진행했습니다.-t
옵션은 생성할 스레드 수를 지정합니다. 우리는 단일 스레드를 지정했습니다.각 CPU를 최대한 활용하기 위해 taskset을
사용했는데, 이는 단일 wrk
프로세스를 CPU에 고정할 수 있습니다. 이 방법은 작업
스레드의 수를 늘리는 것보다 더 일관된 결과를 제공합니다.
초당 요청 수(RPS)를 측정하기 위해 다음 스크립트를 실행했습니다.
i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do taskset -c $i wrk -t 1 -c 50 -d 180s http:// 역방향 프록시 서버 IP 주소 /1kb.bin & done
이 테스트에서는 CPU당 하나의 wrk
사본이 생성되어 클라이언트 머신에 총 36개가 생성되었습니다. 각 사본은 50개의 TCP 연결을 생성하고 3분(180초) 동안 해당 연결을 통해 1KB 파일에 대한 지속적인 요청을 했습니다.
초당 SSL/TLS 거래량(TPS)을 측정하기 위해 다음 스크립트를 실행했습니다.
i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do taskset -c $i wrk -t 1 -c 50 -d 180s -H '연결: 닫기' https:// 역방향 프록시 서버 IP 주소 /0kb.bin & done
이 테스트는 이전 테스트와 동일한 -c
, -d
및 -t
값을 사용하지만 SSL/TLS 연결 처리에 초점을 맞추기 때문에 두 가지 중요한 면에서 다릅니다.
-H
옵션은 Connection:
close
HTTP 헤더를 설정합니다).처리량을 측정하기 위해 다음 스크립트를 실행했습니다.
i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do taskset -c $i wrk -t 1 -c 50 -d 180s http:// 역방향 프록시 서버 IP 주소 /1mb.bin & done
첫 번째 테스트와의 유일한 차이점은 파일 크기가 1MB로 커졌다는 것입니다. 우리는 훨씬 더 큰 파일 크기(10MB)를 사용해도 전체 처리량이 늘어나지 않는다는 것을 발견했습니다.
우리는 테스트에서 여러 개의 네트워크 카드를 사용했습니다. 다음은 약간 수정된 스크립트로, 트래픽이 두 카드 간에 균등하게 분산되도록 했습니다.
i에 대해 `seq 0 $((($(getconf _NPROCESSORS_ONLN) - 1)/2))`; do n=`echo $(($i+ number-of-CPUs/2 ))`; taskset -c $i ./wrk -t 1 -c 50 -d 180s http:// 역방향 프록시 서버 IP 주소 1 /1kb.bin & taskset -c $n ./wrk -t 1 -c 50 -d 180s http:// 역방향 프록시 서버 IP 주소 2 /1kb.bin & done
마지막 단계는 코어 수에 따른 성능 수치를 얻은 후 해당 사양에 맞는 서버 비용을 결정하는 것이었습니다. 우리는 테스트에 사용한 Intel 하드웨어와 유사한 사양을 갖춘 Dell PowerEdge 서버의 가격을 사용했습니다. 아래 부록에는 역방향 프록시 와 웹 서버 모두에 대한 전체 NGINX 구성과 함께 각 서버에 대한 전체 재료 목록이 포함되어 있습니다.
크기 가이드의 가격은 다음 Dell 하드웨어 구성에 적용됩니다.
메모 : 테스트를 실시한 당시에는 표시된 사양과 가격을 갖춘 서버 모델이 있었지만, 향후 변경될 수 있습니다.
서버 모델 | 명세서 | 가격 |
---|---|---|
델 파워에지 R230 | CPU: 2코어 인텔 코어 I3 6100 3.7GHz, 2C/4T 숫양: 4GB 하드 디스크: 500GB NIC: 인텔 X710 2×10 Gbe |
1,200달러 |
CPU: 인텔® 제온® E3‑1220 v5 3.0GHz, 4C/8T 숫양: 4GB 하드 디스크: 500GB NIC: 인텔 XL710 2×40 Gbe |
1,400달러 | |
델 파워에지 R430 | CPU: 인텔® 제온® E5‑2630 v3 2.4GHz, 8C/16T 숫양: 4GB 하드 디스크: 500GB NIC: 인텔 XL710 2×40 Gbe |
2,200달러 |
CPU: 2x Intel® Xeon® E5‑2630 v3 2.4GHz, 8C/16T 숫양: 8GB (8기가바이트) 하드 디스크: 500GB NIC: 인텔 XL710 2×40 Gbe |
3,000달러 | |
델 파워에지 R630 | CPU: 2x 인텔® 제온® E5‑2697A v4 2.6GHz, 16C/32T 숫양: 8GB (8기가바이트) 하드 디스크: 500GB NIC: 인텔 XL710 2×40 Gbe |
8,000달러 |
CPU: 2x Intel® Xeon® E5‑2699 v3 2.3GHz, 18C/36T 숫양: 8GB (8기가바이트) 하드 디스크: 500GB NIC: 인텔 XL710 2×40 Gbe |
11,000달러 |
다음 구성은 NGINX Plus 역방향 프록시 에서 사용되었습니다. keepalive_timeout
과 keepalive_requests
지시문의 두 세트를 주목하세요.
구성은 매우 표준적인 역방향 프록시 서버 구성이며, NGINX Plus는 proxy_pass
지시어를 사용하여 웹 서버에 프록시됩니다.
사용자 nginx;worker_processes 자동;worker_rlimit_nofile 10240;pid /var/run/nginx.pid;이벤트 {worker_connections 10240;accept_mutex off;multi_accept off;} http {access_log off;include /etc/nginx/mime.types;기본_유형 application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$ssl_cipher" ' '"$ssl_protocol" '; sendfile on; # RPS 테스트 keepalive_timeout 300초; keepalive_requests 1000000; # SSL/TLS TPS 테스트 #keepalive_timeout 0; #keepalive_requests 1; 업스트림 웹 서버 { 서버 웹 서버 IP 주소 ; } 서버 { 수신 80; 수신 443 ssl backlog=102400 reuseport; ssl_certificate /etc/nginx/ssl/rsa-cert.crt; ssl_certificate_key /etc/nginx/ssl/rsa-key.key; ssl_session_tickets off; ssl_session_cache off; root /var/www/html; location / { proxy_pass http://webserver; } } } }
아래 구성은 NGINX 웹 서버 에서 사용되었습니다. root
지시문에서 구성된 대로 /var/www/html/ 에서 정적 파일을 제공합니다. 정적 파일은 dd를
사용하여 생성되었습니다. 이 예에서는 0으로 구성된 1KB 파일을 만듭니다.
dd if=/dev/zero of=1kb.bin bs=1KB count=1
구성:
사용자 nginx;
작업자 프로세스 자동;
작업자_rlimit_nofile 10240;
pid /var/run/nginx.pid;
이벤트 {
작업자 연결 10240;
accept_mutex off;
multi_accept off;
}
http {
액세스 로그 off;
/etc/nginx/mime.types 포함;
기본 유형 애플리케이션/옥텟 스트림;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$ssl_cipher" '
'"$ssl_protocol" ';
sendfile 켜짐;
keepalive_timeout 300초;
keepalive_requests 1000000;
서버 {
listen 80;
루트 /var/www/html;
}
}
NGINX Plus를 직접 사용해보려면 오늘 무료 30일 체험판을 시작하거나 저희에게 연락하여 사용 사례에 대해 논의하세요 .
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."