鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

在Nginx应用场景使用HTTPress对vKAE进行性能测试

针对Nginx应用场景,在客户端上,使用HTTPress工具对vKAE进行详细的性能测试,涵盖原生Nginx的同步与异步模式,以及使能vKAE结合Nginx的同步与异步模式,并对测试结果进行详细分析,得出结论与应用建议。

测试命令介绍

在虚拟机中执行两组HTTPress性能测试,分别针对原生Nginx的同步和异步模式,以及使能vKAE结合Nginx的同步与异步模式。

在客户端上,执行以下操作:使用HTTPress对HTTPS长连接和HTTPS短连接进行压力测试,测试命令如下:
  • HTTPS长连接。
    httpress -n 2000000 -c 200 -t 10 -k https://服务端IP地址:服务端口号/index${nodeIndexNum}.html
  • HTTPS短连接。
    httpress -n 20000 -c 200 -t 10 https://服务端IP地址:服务端端口号/index${nodeIndexNum}.html
  • 命令中的-n-t-c-k参数分别代表请求数、线程数、连接数和是否使用长连接。-n-t-c参数可以根据实际情况进行调整,以寻找RPS值最大的最优参数。
  • ${nodeIndexNum}是一个变量,可以根据实际情况设置为指定测试的页面编号。
  • 在客户端下,由于HTTP不使用加解密算法,HTTPS在HTTP基础上使用SSL/TLS算法,其中SSL/TLS握手过程包含加解密相关计算,非对称加解密计算复杂耗时,HPRE设备只对RSA非对称加解密算法进行加速,即使用vKAE硬件加速只对HTTPS长/短连接有效,因此在vKAE加速场景下仅对比HTTPS的测试结果。

在服务端上,执行以下操作:

  1. 以1个线程为例,在“/root/test/”目录下创建一个名为sync_nginx_1_worker.conf的Nginx配置文件。
    vim sync_nginx_1_worker.conf
  2. “i”进入编辑模式,在文件中新增如下内容。

    以下为使能KAE + 参数未调优过的Nginx同步模式的配置文件内容。

    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user root;
    
    worker_processes 1;
    worker_cpu_affinity
    1
    ;
    
    # error_log /var/log/nginx/error.log debug;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        # access_log off;
        # access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 4096;
    
        include             /usr/local/nginx/conf/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       8080;
            listen       [::]:8080;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    # Settings for a TLS enabled server.
    #
       server {
           listen       8090 ssl http2 so_keepalive=off;
           listen       [::]:8090 ssl http2 so_keepalive=off;
           #listen       8090 ssl http2 so_keepalive=off asynch;
           #listen       [::]:8090 ssl http2 so_keepalive=off asynch;
           server_name  _;
    
           # ssl_asynch on;
    
           ssl_certificate      /usr/local/nginx/server_2048.crt;
          ssl_certificate_key  /usr/local/nginx/server_2048.key;
    
           root         /usr/share/nginx/html;
    
           ssl_session_cache    shared:SSL:1m;
           ssl_session_timeout  5m;
           ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    
           ssl_ciphers  "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256    EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
           #ssl_ciphers  "RSA-PSK-AES128-CBC-SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
           # ssl_ciphers  AES256-GCM-SHA384;
           ssl_prefer_server_ciphers  on;
           # ssl_session_tickets  off;
    
           error_page 404 /404.html;
               location = /40x.html {
           }
    
           error_page 500 502 503 504 /50x.html;
               location = /50x.html {
           }
       }
    
    }
    • 该配置文件中,HTTP使用的端口号为8080,HTTPS使用的端口号为8090。
    • worker_processes为服务端线程数,worker_cpu_affinity为NUMA亲和性,可根据需要设置服务端的线程数,同时对应改变NUMA亲和性部分。
    • 如果要使用4个服务端线程,将“worker_processes”“worker_cpu_affinity”参数修改为如下:
      worker_processes 4;
      worker_cpu_affinity
      1
      10
      100
      1000;
    • 如果要配置使能KAE+参数未调优过的Nginx异步模式的配置文件内容,请先创建一个名为async_nginx_x_worker.conf(x表示使用的线程个数)的配置文件,并将上述配置文件内容拷贝到async_nginx_x_worker.conf文件中,再分别将以下三行内容前面的#号删除:
      #listen       8090 ssl http2 so_keepalive=off asynch;
      #listen       [::]:8090 ssl http2 so_keepalive=off asynch;
      
      # ssl_asynch on;

      最后在以下两行内容前面分别添加#号:

      listen       8090 ssl http2 so_keepalive=off;
      listen       [::]:8090 ssl http2 so_keepalive=off;
    • 如果要使用参数调优过的Nginx配置文件,可以直接使用9中的配置文件。
  3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  4. 在客户端上使用HTTPress对HTTPS短连接进行压力测试。
    以服务端分别使用1个线程和4个线程,客户端绑核数根据实际需要进行限制为例,在客户端上使用HTTPress对HTTPS短连接进行压力测试,测试命令如下:
    • 使能KAE + Nginx同步 + 服务端使用1个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; OPENSSL_CONF=/home/openssl.cnf /usr/share/nginx/sbin/nginx -c /root/test/sync_nginx_1_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 64000 https://服务端IP地址:8090/index.html
    • 使能KAE + Nginx异步 + 服务端使用1个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; OPENSSL_CONF=/home/openssl.cnf /usr/share/nginx/sbin/nginx -c /root/test/async_nginx_1_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 64000 https://服务端IP地址:8090/index.html
    • 使能KAE + Nginx同步 + 服务端使用4个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; OPENSSL_CONF=/home/openssl.cnf /usr/share/nginx/sbin/nginx -c /root/test/sync_nginx_4_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 128000 https://服务端IP地址:8090/index.html
    • 使能KAE + Nginx异步+服务端使用4个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; OPENSSL_CONF=/home/openssl.cnf /usr/share/nginx/sbin/nginx -c /root/test/async_nginx_4_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 128000 https://服务端IP地址:8090/index.html
    • 不使能KAE + Nginx同步 + 服务端使用1个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; /usr/share/nginx/sbin/nginx -c /root/test/sync_nginx_1_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 64000 https://服务端IP地址:8090/index.html
    • 不使能KAE + Nginx异步 + 服务端使用1个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; /usr/share/nginx/sbin/nginx -c /root/test/async_nginx_1_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 64000 https://服务端IP地址:8090/index.html
    • 不使能KAE + Nginx同步 + 服务端使用4个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; /usr/share/nginx/sbin/nginx -c /root/test/sync_nginx_4_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 128000 https://服务端IP地址:8090/index.html
    • 不使能KAE + Nginx异步 + 服务端使用4个线程。
      • 服务端:
        nginx -s stop || true; sleep 1; /usr/share/nginx/sbin/nginx -c /root/test/async_nginx_4_worker.conf; sleep 1
      • 客户端:
        taskset -c 64-254 httpress -c 64 -t 32 -n 128000 https://服务端IP地址:8090/index.html

测试结果与分析

以HTTPS短连接为例,在规格为8C16G虚拟机中,使用HTTPress工具进行压力测试得到的RPS结果如表1所示。

表1 测试结果

处理器型号

服务端线程数=1

服务端线程数=4

虚拟机规格

Nginx同步/异步

是否启用vKAE

鲲鹏920处理器

1367

5102

8C16G

同步

鲲鹏920处理器

2246

7393

8C16G

异步

鲲鹏920处理器

587

2255

8C16G

同步

鲲鹏920处理器

584

2245

8C16G

异步

在CPU利用率达到100%的情况下,得出以下结论:

  • 对于8C16G规格的虚拟机,在不使能vKAE的情况下同步与异步性能几乎无差异;使能vKAE之后,在CPU达到性能瓶颈之前,vKAE异步性能优于同步,RPS相比同步提升40%。
  • 在8C16G规格的虚拟机未达到CPU瓶颈时,同步的硬软比为226%,异步的硬软比为329%,异步性能提升优于同步。

结论与应用建议

对于8C16G规格的虚拟机:

  • 在不使能vKAE时,Nginx的同步与异步模式在性能上差异不大;在使用vKAE进行硬件加速后,特别是在处理HTTPS请求时,异步模式表现出更优异的性能提升。因此,在需要高性能HTTPS服务的场景中,推荐采用vKAE结合Nginx的异步模式配置。
  • Nginx配置文件的调优也是提升性能的关键因素之一。通过合理配置Nginx的worker_processes、worker_cpu_affinity等参数,可以进一步挖掘硬件的潜力,提升系统的整体性能。