NGINX Plus规模评估指南:测试方法

NGINX | 2016年11月29日

今年早些时候,我们对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 Open Source,因此任何人无需订阅NGINX Plus即可复现测试。测试未使用NGINX Plus的任何增强功能,因此NGINX Open Source与NGINX Plus的测试结果相同。NGINX Open Source 1.9.7版大致对应NGINX Plus第7版。

不过,为了在测试拓扑中更清楚地区分反向代理和后端Web服务器,我们将前者称为NGINX Plus,将后者称为NGINX(开源版)。

拓扑

所有测试均使用3台独立计算机完成。这些计算机通过双路40 GbE链路连接在一个简单的扁平二层网络中。

使用标准的背靠背串联拓扑测试NGINX Plus性能

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

所用硬件

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

机器 CPU 网络 内存客户端 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36个物理核心(或72个超线程核心)2x Intel XL710 40GbE QSFP+(rev 01)16 GB反向代理 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36个物理核心(或72个超线程核心)4x Intel XL710 40GbE QSFP+(rev 01)16 GBWeb服务器 2x Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36个物理核心(或72个超线程核心)2x Intel XL710 40GbE QSFP+(rev 01)16 GB

所用软件

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

  • 客户端计算机上运行的wrk 4.0.0版生成了由NGINX代理的流量。我们按照这些说明进行了安装。
  • NGINX Open Source 1.9.7版运行在反向代理和Web服务器计算机上。我们按照这些nginx.org上的官方存储库说明进行了安装。
  • Ubuntu Linux 14.04.1在全部3台计算机上运行。

测试方法

我们测试了NGINX Plus反向代理服务器在不同CPU数量下的性能。每个NGINX Plus worker进程占用一个CPU,因此,为了衡量不同CPU数量下的性能,我们调整了worker进程的数量,并分别使用2个、4个、8个及更多worker进程重复测试。有关NGINX架构的概述,请参阅我们的博客。

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

性能指标

我们测量了以下指标:

  • 每秒请求数(RPS),用于衡量处理HTTP请求的能力。在测试中,每个客户端通过持久连接发送对1 KB文件的请求。反向代理处理每个请求,并通过另一个持久连接将其转发到Web服务器。
  • 每秒SSL/TLS事务数(TPS),衡量处理新SSL/TLS连接的能力。在测试中,每个客户端发送一系列HTTPS请求,每个请求均使用新连接。反向代理解析请求,并通过已建立的长连接将请求转发到Web服务器。Web服务器为每个请求返回0字节响应。
  • 吞吐量,衡量NGINX Plus通过HTTP提供1 MB文件时可持续达到的吞吐量。

运行测试

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

  • The -c选项用于指定要创建的TCP连接数。在测试中,我们将其设置为50个连接。
  • The -d选项用于指定流量生成时长。每次测试均运行3分钟。
  • The -t 选项用于指定要创建的线程数。我们指定了单个线程。

为了充分利用每个CPU,我们使用了taskset,它可以将单个wrk进程绑定到一个CPU。与增加wrk线程数量相比,此方法可获得更一致的结果。

每秒请求数

为测量每秒请求数(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连接,并通过这些连接持续请求一个1 KB的文件,持续3分钟(180秒)。

每秒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标头)。
  • 请求的文件大小为0(零)字节,而不是1 KB。

吞吐量

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

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

与第一次测试相比,唯一的区别是文件大小增加到了1 MB。我们发现,使用更大的文件(10 MB)并未提高整体吞吐量。

多块网卡

在测试中,我们使用了多块网卡。以下经过小幅修改的脚本可确保流量均匀分配到两块网卡:

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

定价

获得不同核心数量下的性能数据后,最后一步是确定相应规格服务器的成本。我们采用了Dell PowerEdge服务器的价格,这些服务器的规格与测试所用Intel硬件相近。下方附录提供了每台服务器的完整物料清单,以及反向代理和Web服务器的完整NGINX配置。

附录

Dell硬件配置

容量规划指南中的价格适用于以下Dell硬件配置。

注意:我们进行测试时,具有所示规格和价格的服务器型号仍有供应,但未来可能会发生变化。

服务器型号 规格 价格Dell PowerEdge R230 CPU:双核Intel Core I3 6100 3.7 GHz,2C/4T
内存:4 GB
硬盘:500 GB
网卡:Intel X710 2×10 GbE,1,200 美元CPU:Intel® Xeon® E3‑1220 v5 3.0 GHz,4C/8T
内存:4 GB
硬盘:500 GB
网卡:Intel XL710 2×40 GbE,1,400 美元Dell PowerEdge R430 CPU:Intel® Xeon® E5‑2630 v3 2.4 GHz,8C/16T
内存:4 GB
硬盘:500 GB
网卡:Intel XL710 2×40 GbE,2,200 美元CPU:2× Intel® Xeon® E5‑2630 v3 2.4 GHz,8C/16T
内存:8 GB
硬盘:500 GB
网卡:Intel XL710 2×40 GbE,3,000 美元Dell PowerEdge R630 CPU:2× Intel® Xeon® E5‑2697A v4 2.6 GHz,16C/32T
内存:8 GB
硬盘:500 GB
网卡:Intel XL710 2×40 GbE,8,000 美元CPU:2× Intel® Xeon® E5‑2699 v3 2.3 GHz,18C/36T
内存:8 GB
硬盘:500 GB
网卡:Intel XL710 2×40 GbE,11,000 美元

NGINX Plus反向代理配置

NGINX Plus反向代理使用了以下配置。请注意以下两组keepalive_timeout和keepalive_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服务器配置

以下配置用于NGINX Web Server。该服务器根据/var/www/html/指令中配置的root路径提供静态文件。静态文件使用dd生成;本示例将创建一个内容全为零的1 KB文件:

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天免费试用,或联系我们,讨论您的用例。


分享

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。