NGINX Sizing Guide – 테스트 방법

우리는 NGINX의 성능을 벤치마킹하고 Bare Metal 서버에 배포하기 위한 NGINX Sizing Guide 를 만들었습니다. NGINX Open Source와 NGINX Plus는 애플리케이션 Load Balancing이라고도 알려진 Layer 7 Load Balancing과 API Gateway 솔루션으로 널리 사용됩니다.

Sizing 가이드는 하드웨어의 예상 비용과 함께 다양한 서버 크기에서 실행되는 NGINX로 달성할 수 있는 성능을 간략하게 설명합니다. Sizing Guide를 사용하여 NGINX를 적절하게 배포하고 과도한 프로비저닝(많은 비용이 발생합니다) 또는 과소 프로비저닝(성능 문제를 유발하고 장기적으로 비용이 발생할 수 있습니다)을 최대한 방지할 수 있습니다.

우리는 결과 재현에 관심이 있는 고객 및 다른 사람들로부터 우리가 사용한 방법론에 대한 질문과 함께 Sizing Guide 에 많은 관심을 보였습니다. 이번 포스트는 NGINX Sizing Guide 에 제시된 결과를 얻기 위해 수행한 테스트에 대한 개요를 제공합니다. 우리가 사용한 토폴로지, 실행한 테스트, Sizing Guide 에 나열된 가격을 찾은 방법을 다룹니다.

Note: NGINX Plus 용으로 특별히 Sizing 가이드를 개발했지만 테스트에 NGINX Open Source를 사용하여 NGINX Plus 구독 없이 누구나 테스트를 재현할 수 있습니다. 이 테스트는 NGINX Plus의 향상된 기능을 사용하지 않으므로 NGINX Opens Source와 NGINX Plus의 결과는 동일합니다. NGINX Open Source 버전 1.9.7은 대략 NGINX Plus 릴리스 7에 해당합니다.

목차

1. 토폴로지
2. 사용된 하드웨어
3. 사용된 소프트웨어
4. 테스트 방법론
5. 성능 지표
6. 테스트 실행
6-1. 초당 요청 수
6-2. 초당 SSL/TLS 트랜잭션
6-3. 처리량
6-4. 멀티 네트워크 카드

7. 가격
8. 부록
8-1. Dell 하드웨어 구성
8-2. NGINX Plus Reverse Proxy 구성
8-3. NGINX 웹 서버 구성

1. 토폴로지

모든 테스트는 간단한 Layer 2 네트워크에서 이중 40GbE 링크로 함께 연결된 세 대의 개별 시스템을 사용하여 수행되었습니다.

Two instances of NGINX were deployed for the tests in our sizing guide: one as a reverse proxy server (load balancer type configuration) and another as web server

NGINX 성능을 테스트하기 위해 표준 back-to-back-to-back 토폴로지가 사용되었습니다.

클라이언트 시스템에서 트래픽을 생성하기 위해 ab(ApacheBench)와 유사한 성능 테스트 도구인 wrk를 사용했습니다. 다이어그램에 표시된 대로 모든 트래픽은 NGINX Plus Reverse Proxy로 연결되었으며, 이는 NGINX Open Source Web Server Backend로 연결을 Forward 합니다.

2. NGINX Sizing Guide 사용된 하드웨어

테스트를 위해 다음 하드웨어를 사용했습니다.

시스템CPUNetworkMemory
Client2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36 real (or 72 HT) cores2x Intel XL710 40GbE QSFP+ (rev 01)16 GB
Reverse Proxy2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36 real (or 72 HT) cores4x Intel XL710 40GbE QSFP+ (rev 01)16 GB
Web Server2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz, 36 real (or 72 HT) cores2x Intel XL710 40GbE QSFP+ (rev 01)16 GB

3. NGINX Sizing Guide 사용된 소프트웨어

테스트를 위해 다음 소프트웨어를 사용했습니다.

  • 클라이언트 시스템에서 실행 중인 wrk 버전 4.0.0은 NGINX가 Proxy 한 트래픽을 생성했습니다. 이 지침에 따라 설치했습니다.
  • NGINX Open Source 버전 1.9.7은 Reverse Proxy 및 웹 서버 시스템에서 실행되었습니다. 이 지침에 따라 설치했습니다.
  • Ubuntu Linux 14.04.1은 세 시스템 모두에서 실행되었습니다.

4. NGINX Sizing Guide 테스트 방법론

서로 다른 수의 CPU로 NGINX Plus Reverse Proxy 서버의 성능을 테스트했습니다. 하나의 NGINX Worker Process는 단일 CPU를 사용하므로 서로 다른 수의 CPU의 성능을 측정하기 위해 Worker Process 수를 변경하고 두 개의 Worker Process, 4개, 8개 등으로 테스트를 반복했습니다.

Worker Process 수를 수동으로 설정하려면 worker_processes 지시문을 사용하십시오. 기본값은 auto이며 NGINX에 CPU 수를 감지하고 CPU 당 하나의 Worker Process를 실행하도록 지시합니다.

5. 성능 지표

다음 지표를 측정했습니다.

  • 초당 요청 수(RPS) – HTTP 요청을 처리하는 능력을 측정합니다. 테스트에서 각 클라이언트는 keepalive 연결을 통해 1KB 파일에 대한 요청을 보냅니다. Reverse Proxy는 각 요청을 처리하고 다른 keepalive 연결을 통해 웹 서버로 전달합니다.
  • 초당 SSL/TLS 트랜잭션(TPS) – 새로운 SSL/TLS 연결을 처리하는 능력을 측정합니다. 테스트에서 각 클라이언트는 각각 새 연결에서 일련의 HTTPS 요청을 보냅니다. Reverse Proxy는 요청을 구문 분석하고 설정된 keepalive 연결을 통해 웹 서버로 전달합니다. 웹 서버는 각 요청에 대해 0바이트 응답을 다시 보냅니다.
  • 처리량 – HTTP를 통해 1MB 파일을 제공할 때 NGINX가 유지할 수 있는 처리량을 측정합니다.

6. NGINX Sizing Guide 테스트 실행

모든 클라이언트 트래픽을 생성하기 위해 다음 옵션과 함께 wrk를 사용했습니다.

-c 옵션은 생성할 TCP 연결 수를 지정합니다. 테스트를 위해 이를 50개의 연결로 설정했습니다.

-d 옵션은 트래픽을 생성하는 기간을 지정합니다. 우리는 각각 3분씩 테스트를 진행했습니다.

-t 옵션은 생성할 스레드(Thread) 수를 지정합니다. 단일 스레드를 지정했습니다.

각 CPU를 완전히 실행하기 위해 단일 wrk process를 CPU에 고정할 수 있는 taskset를 사용했습니다. 이 방법은 wrk 스레드 수를 늘리는 것보다 더 일관된 결과를 생성합니다.

6-1. 초당 요청 수

초당 요청 수(RPS)를 측정하기 위해 다음 스크립트를 실행했습니다.

for i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do
    taskset -c $i wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address/1kb.bin &
done

이 테스트는 CPU 당 하나의 wrk 복사본을 생성했으며 클라이언트 시스템에 대해 총 36개입니다. 각 사본은 50개의 TCP 연결을 생성하고 이를 통해 3분(180초) 동안 1KB 파일에 대한 지속적인 요청을 했습니다.

6-2. 초당 SSL/TLS 트랜잭션

초당 SSL/TLS 트랜잭션(TPS)을 측정하기 위해 다음 스크립트를 실행했습니다.

for i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do
    taskset -c $i wrk -t 1 -c 50 -d 180s -H 'Connection: close' https://Reverse-Proxy-Server-IP-address/0kb.bin &
done

이 테스트는 이전 테스트와 동일한 -c, -d 및 -t 값을 사용하지만 초점이 SSL/TLS 연결 처리에 있기 때문에 두 가지 주목할 만한 차이점이 있습니다.

  • 클라이언트는 각 요청에 대한 연결을 열고 닫습니다(-H 옵션은 Connection: close HTTP 헤더를 설정합니다).
  • 요청된 파일의 크기는 1KB가 아닌 0바이트입니다.

6-3. 처리량

처리량을 측정하기 위해 다음 스크립트를 실행했습니다.

for i in `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; do
    taskset -c $i wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address/1mb.bin &
done

첫 번째 테스트와의 유일한 차이점은 1MB의 더 큰 파일 크기입니다. 더 큰 파일 크기(10MB)를 사용해도 전체 처리량이 증가하지 않는 것으로 나타났습니다.

6-4. 멀티 네트워크 카드

테스트에서 여러 네트워크 카드를 사용했습니다. 약간 수정된 다음 스크립트는 두 카드 간에 트래픽이 고르게 분산되도록 했습니다.

for i in `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://Reverse-Proxy-Server-IP-address-1/1kb.bin &
    taskset -c $n ./wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address-2/1kb.bin &
done

7. 가격

코어 수가 서로 다른 성능 수치를 갖게 되면 마지막 단계는 해당 사양의 서버 비용을 결정하는 것이었습니다. 테스트에 사용한 Intel 하드웨어와 유사한 사양의 Dell PowerEdge 서버 가격을 사용했습니다. 아래 부록에는 Reverse Proxy와 웹 서버 모두에 대한 전체 NGINX 구성과 함께 각 서버에 대한 전체 명세서가 나와 있습니다.

8. NGINX Sizing Guide 부록

8-1. Dell 하드웨어 구성

NGINX Sizing Guide 의 가격은 다음 Dell 하드웨어 구성에 대한 것입니다.

Note: 표시된 사양 및 가격의 서버 모델은 테스트를 실행할 당시 사용 가능했지만 향후 변경될 수 있습니다.

Server modelSpecs가격
Dell PowerEdge R230CPU: 2 core Intel Core I3 6100 3.7GHz, 2C/4T
RAM: 4 GB
HDD: 500 GB
NIC: Intel X710 2×10 Gbe
$1,200
Dell PowerEdge R230CPU: Intel® Xeon® E3‑1220 v5 3.0GHz, 4C/8T
RAM: 4 GB
HDD: 500 GB
NIC: Intel XL710 2×40 Gbe
$1,400
Dell PowerEdge R430CPU: Intel® Xeon® E5‑2630 v3 2.4GHz, 8C/16T
RAM: 4 GB
HDD: 500 GB
NIC: Intel XL710 2×40 Gbe
$2,200
Dell PowerEdge R430CPU: 2x Intel® Xeon® E5‑2630 v3 2.4GHz, 8C/16T
RAM: 8 GB
HDD: 500 GB
NIC: Intel XL710 2×40 Gbe
$3,000
Dell PowerEdge R630CPU: 2x Intel® Xeon® E5‑2697A v4 2.6GHz, 16C/32T
RAM: 8 GB
HDD: 500 GB
NIC: Intel XL710 2×40 Gbe
$8,000
Dell PowerEdge R630CPU: 2x Intel® Xeon® E5‑2699 v3 2.3GHz, 18C/36T
RAM: 8 GB
HDD: 500 GB
NIC: Intel XL710 2×40 Gbe
$11,000

8-2. NGINX Plus Reverse Proxy 구성

다음 구성은 NGINX Plus Reverse Proxy에서 사용되었습니다. keepalive_timeoutkeepalive_requests 지시문의 두 세트에 유의하십시오.

  • SSL/TLS TPS 테스트의 경우, 테스트의 목표는 NGINX가 처리할 수 있는 초당 SSL/TLS 연결 수를 확인하는 것이기 때문에 하나의 요청에 대해서만 연결이 열린 상태로 유지되도록 두 지시문의 값을 설정했습니다. SSL/TLS 세션 캐싱도 비활성화되었습니다.
  • RPS 테스트의 경우 가능한 한 오랫동안 연결을 유지하도록 지시문을 조정했습니다.

구성은 proxy_pass 지시문을 사용하여 Proxy 하는 NGINX 를 사용하는 상당히 표준적인 Reverse Proxy 서버 구성입니다.

user                 nginx;
worker_processes     auto;
worker_rlimit_nofile 10240;
pid                  /var/run/nginx.pid;

events {
    worker_connections 10240;
    accept_mutex       off;
    multi_accept       off;
}

http {
    access_log    off;
    include       /etc/nginx/mime.types;
    default_type  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 tests
    keepalive_timeout  300s;     
    keepalive_requests 1000000;

    # SSL/TLS TPS tests
    #keepalive_timeout  0;  
    #keepalive_requests 1; 
  
    upstream webserver {
        server Web-Server-IP-address;
    }

    server {
        listen 80;
        listen 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;
            }
        }
    }
}

8-3. NGINX 웹 서버 구성

아래 구성은 NGINX 웹 서버에서 사용되었습니다. root 지시문에 의해 구성된 대로 /var/www/html/에서 정적 파일을 제공합니다. 정적 파일은 dd를 사용하여 생성되었습니다. 이 예제는 0으로 구성된 1KB 파일을 생성합니다.

dd if=/dev/zero of=1kb.bin bs=1KB count=1

구성

user                 nginx;
worker_processes     auto;
worker_rlimit_nofile 10240;
pid                  /var/run/nginx.pid;

events {
    worker_connections 10240;
    accept_mutex       off;
    multi_accept       off;
}

http {
    access_log   off;
    include      /etc/nginx/mime.types;
    default_type 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;

    keepalive_timeout  300s;     
    keepalive_requests 1000000;

    server {
        listen 80;
        root /var/www/html;
    }
}

NGINX Plus를 직접 사용해 보거나 테스트해 보려면 지금 30일 무료 평가판을 신청하거나 사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.