NGINX Full Version

NGINX Plus 选型指南:我们如何进行测试

A 1967 Ferrari 275 GTB/4*S N.A.R.T. Spider is shown in this handout photo taken on June 10, 2013. One of only 10 made, it is estimated at $14 million to $17 million in a two-day sale that will be held by RM Auctions in Monterey, California, Oon Aug. 16-17. Photographer: Darin Schnabel/RM Auctions via Bloomberg

今年早些时候,我们对 NGINX Plus 的性能进行了基准测试,并创建了一份选型指南,为将其部署到裸机服务器上提供指导。NGINX Open Source 和 NGINX Plus 广泛应用于7 层负载均衡,亦称为应用负载均衡

[编者按语  – 我们会定期更新选型指南,以及时反映 NGINX Plus 功能以及硬件成本和性能方面的变化。上述链接始终指向最新指南。

如欲了解 NGINX 和 NGINX Plus 作为 Web 服务器的性能信息,请参阅 测试 NGINX 和 NGINX Plus Web 服务器的性能。]

在选型指南中您可以查询到在不同资源下NGINX Plus的预期性能,以及估计的硬件成本。您可以参考这份选型指南选定适当的 NGINX Plus 部署,以便尽可能地避免过度配置(这会造成高成本问题)或配置不足(这会导致性能问题,并且从长远来看反而会导致使用成本增高)。

不少客户及潜在使用者对该指南以及我们所使用的方法颇感兴趣。这篇博文概述了我们为实现选型指南中所示结果所执行的测试。它涵盖了我们使用的拓扑结构和运行的测试,并介绍了我们是如何确定选型指南中的标价的。

注意:尽管这份选型指南是专为 NGINX Plus 开发的,但是在测试中我们使用的是NGINX开源版,无论是否订阅 NGINX Plus,都可以复现我们的测试。而且,测试不涉及 NGINX Plus 的任何增强功能,因此无论是对NGINX 开源版还是对 NGINX Plus 进行测试,结果都是相同的NGINX开源版本1.9.7 大致对应 NGINX Plus 版本 7。

不过,为了在测试拓扑结构中更好地将反向代理与后端 Web 服务器区分开来,我们将 NGINX Plus 称为前者,将NGINX开源版称为后者。

拓扑结构

所有测试都是使用三台独立的计算机完成的,这些计算机通过简单的2 层扁平网络连接到双 40 GbE 链路。

使用标准 客户端-代理-web server 拓扑架构来测试 NGINX Plus 性能

为了从客户端计算机生成流量,我们使用了 wrk,一款类似于ab (ApacheBench) 的性能测试工具。如图所示,所有流量都定向到 NGINX Plus 反向代理,该代理将连接转发到开源版 NGINX Web 服务器后端。

所用硬件

我们使用以下硬件进行了测试。

计算机 CPU 网络 内存
客户端 2 颗英特尔 (R) 至强 (R) CPU E5 2699 v3 @ 2.30GHz,36 个真正(或 72 HT)内核 2 个英特尔 XL710 40GbE QSFP+(版本 01) 16 GB
反向代理 2 颗英特尔 (R) 至强 (R) CPU E5 2699 v3 @ 2.30GHz,36 个真正(或 72 HT)内核 4 个英特尔 XL710 40GbE QSFP+(版本 01) 16 GB
Web 服务器 2 颗英特尔 (R) 至强 (R) CPU E5 2699 v3 @ 2.30GHz,36 个真正(或 72 HT)内核 2 个英特尔 XL710 40GbE QSFP+(版本 01) 16 GB

所用软件

我们使用以下软件进行了测试:

测试方法

我们使用不同数量的 CPU 测试了 NGINX Plus 反向代理服务器的性能。一个 NGINX Plus worker 进程消耗一颗CPU,因此为了测量不同数量 CPU 的性能,我们改变了 worker 进程的数量,使用两个、四个、八个 worker 进程重复进行了测试。有关 NGINX 架构的概述,请参阅我们的博客

注意:如欲手动设置 worker 进程数,请使用 worker_processes 指令。 默认值为 auto,这表示 NGINX Plus 会检测 CPU 数量并为每颗 CPU 运行一个 worker 进程。

性能指标

我们对以下指标进行了测量:

运行测试

为了生成所有客户端流量,我们在使用wrk时用到了以下选项:

为了充分利用每颗 CPU,我们使用了任务集,该任务集可以将单个wrk进程绑定到 CPU 上。与增加wrk 数量的做法相比,该方法能够产生更加一致的结果。

每秒请求数

为了测量每秒请求数 (RPS),我们运行了以下脚本:

for i in `seq 1 number-of-CPUs`; 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 连接,并通过这些连接对 1 KB 文件发起了长达 3 分钟(180 秒)的连续请求。

每秒 SSL/TLS 事务

为了测量每秒 SSL/TLS 事务 (TPS),我们运行了以下脚本:

for i in `seq 1 number-of-CPUs`; 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 连接,因此与上一个测试存在两方面的显著差异:

吞吐量

为了测量吞吐量,我们运行了以下脚本:

for i in `seq 1 number-of-CPUs`; do
    taskset -c $i wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address/1mb.bin &
done

当文件大小为1MB时测试结果与第一次测试不同,我们发现使用更大的文件(10 MB)不会增加整体吞吐量。

多个网卡

在我们的测试中,我们使用了多个网卡。以下经过稍微修改的脚本,可确保流量在两张网卡之间平均分配:

for i in `seq 1 number-of-CPUs/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

定价

最后一步,就是确定相应规格的服务器的成本。针对本次测试环境,我们以Dell PowerEdge 服务器的价格作为参考。下面的附录包含每个服务器的完整物料清单,以及反向代理Web 服务器 的完整 NGINX 配置。

附录

Dell 硬件配置

选型指南中的价格适用于以下 Dell 硬件配置。

注意:以下Dell服务器规格及价格信息仅供参考,最终采购价格以服务器厂商实际报价为准。

服务器型号 规格 价格
Dell PowerEdge R230 CPU:2 个内核 英特尔酷睿 I3 6100 3.7GHz,2C/4T
RAM:4 GB
HDD:500 GB
网卡:英特尔 X710 2×10 Gbe
$1,200
CPU:英特尔® 至强® E3 1220 v5 3.0GHz,4C/8T
RAM: 4 GB
HDD: 500 GB
网卡:英特尔 XL710 2×40 Gbe
$1,400
Dell PowerEdge R430 CPU:英特尔® 至强® E5 2630 v3 2.4GHz,8C/16T
RAM: 4 GB
HDD: 500 GB
网卡:英特尔 XL710 2×40 Gbe
$2,200
CPU:2 颗英特尔® 至强® E5 2630 v3 2.4GHz,8C/16T
RAM: 8 GB
HDD: 500 GB
网卡:英特尔 XL710 2×40 Gbe
$3,000
Dell PowerEdge R630 CPU:2 颗英特尔® 至强® E5 2697A v4 2.6GHz,16C/32T
RAM: 8 GB
HDD: 500 GB
网卡:英特尔 XL710 2×40 Gbe
$8,000
CPU:2 颗英特尔® 至强® E5 2699 v3 2.3GHz,18C/36T
RAM: 8 GB
HDD: 500 GB
网卡:英特尔 XL710 2×40 Gbe
$11,000

NGINX Plus 反向代理配置

在 NGINX Plus 反向代理上使用了以下配置。请注意 keepalive_timeoutkeepalive_requests这两个指令集:

否则,该配置会是相当标准的反向代理服务器配置,其中 NGINX Plus 会使用 proxy_pass指令代理到 Web 服务器。

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;
            }
        }
    }
}

NGINX Web 服务器配置

在 NGINXWeb 服务器. It serves static files from /var/www/html/上使用了以下配置。正如root指令所配置,它使用 /var/www/html/ 下的静态文件。该静态文件是使用dd生成的;本示例创建一个 1 KB 的zero文件:

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 天免费试用版,或与我们联系以讨论您的应用场景