NGINX.COM
Web Server Load Balancing with NGINX Plus

今年早些时候,我们对 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 链路。

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
使用标准 客户端-代理-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

所用软件

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

  • 在客户端计算机上运行的wrk版本 4.0.0 生成 NGINX 代理的流量。 我们根据这些说明进行了安装。
  • 反向代理Web 服务器上运行NGINX 1.9.7开源版本。我们根据这些说明,从位于nginx.org 的官方存储库中进行了安装。
  • 三台服务器运行的系统版本是Ubuntu Linux 14.04.1

测试方法

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

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

性能指标

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

  • 每秒请求数 (RPS)  – 测量处理每秒 HTTP 请求的能力。在我们的测试中,每个客户端都通过 keepalive 连接发送对 1 KB 文件的请求。反向代理会处理每个请求,并通过另一个 keepalive 连接将其转发到 Web 服务器
  • 每秒 SSL/TLS 事务 (TPS) – 测量处理每秒新建 SSL/TLS 连接的能力。在我们的测试中,每个客户端都会通过新连接发送一系列 HTTPS 请求。反向代理解析请求,然后通过建立的 keepalive 连接将这些请求转发到 Web 服务器Web 服务器会就每个请求返回 0 字节响应。
  • 吞吐量 – 测量 NGINX Plus 通过 HTTP 为 1 MB 文件提供服务时可维持的吞吐量。

运行测试

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

  • -c 选项指定了要创建的 TCP 连接数量,在我们的测试中,我们将其设置为 50 个连接。
  • -d选项指定了生成流量的周期。我们的每项测试均持续了 3 分钟。
  • -t选项指定了要创建的线程数量。我们指定了一个线程。

为了充分利用每颗 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 连接,因此与上一个测试存在两方面的显著差异:

  • 客户端打开并关闭每个请求的连接(-H 选项设置 Connection: close HTTP 标头)。
  • 所请求的文件大小为 0(零)字节,而不是 1 KB。

吞吐量

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

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这两个指令集:

  • 对于 SSL/TLS TPS 测试,我们设置了两个指令的数值,以确保连接仅面向一个请求保持打开,因为该测试的目标是查看 NGINX Plus 每秒可以处理的 SSL/TLS 连接数量。SSL/TLS 会话缓存也被禁用。
  • 在 RPS 测试中,对指令进行了微调,以确保连接维持尽可能长的时间。

否则,该配置会是相当标准的反向代理服务器配置,其中 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 天免费试用版,或与我们联系以讨论您的应用场景

Hero image
免费 O'Reilly 电子书:
《NGINX 完全指南》

更新于 2022 年,一本书了解关于 NGINX 的一切

关于作者

Faisal Memon

软件工程师

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。