zoukankan      html  css  js  c++  java
  • Nginx upstream性能优化

    1      目的

    完成基于大报文和小报文场景的Nginx压测方案设计,其在长连接和短连接的最佳并发模型测试结果如下表:

    大报文在短连接场景QPS在1.8K左右,在长连接场景QPS在2.1K左右,提升16.5%;

    小报文在短连接场景QPS在5.6K左右,在长连接场景QPS在11.8K左右,提升一倍;

    业务场景

    Nginx到后端

    并发量

    QPS

    CPU(%)

    带宽(M)

    PPS

    大报文

    短连接  

    800

    1855

    61.31

    763.48

    142425.46

    大报文

    长连接

    800

    2162

    66.74

    881.56

    133334.1

    小报文

    短连接

    800

    5678

    43.35

    117.64

    104862.72

    小报文

    长连接

    800

    11808

    60.55

    226.45

    151743.24

       

    2      介绍   

    在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器(php/jboss等)进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstream的实现很复杂。

    upstream顾名思义,真正产生内容的地方在”上游”而不是nginx,也就是说nginx是位于client和后端的upstream之间的桥梁,在这种情况下,一个upstream需要做的事情主要有2个,第一个是当client发送http请求过来之后,需要创建一个到后端upstream的请求。第二个是当后端发送数据过来之后,需要将后端upstream的数据再次发送给client。 

    2.1      Nginx Upstream连接后端有两种方式:短连接和长连接。   

    Keep-Alive即俗称的长连接,使客户端到服务端建立的连接持续有效,当对服务器发起后续请求时,Keep-Alive功能可以复用先前使用过的连接,减少了重新建立连接所需的开销。通常使用HTTP协议采用的是请求应答模式,客户端到服务端的一次请求完成了,它们之间的连接也随之关闭。在某些应用场景下,比如后端RESTful服务,就需要保持住连接,这时就可以启用HTTP Keep-Alive。Nginx长连接的配置:

    upstream backend-others {

                server 10.x.x.x max_fails=0 fail_timeout=10s;

                server 10.x.x.x:81 max_fails=0 fail_timeout=10s;           

                keepalive 20000;

            }

    location / {

                        #防止502以及Timeout的发生

                        proxy_connect_timeout 75;

                        proxy_read_timeout 300;

                        proxy_send_timeout 300;

                        proxy_buffer_size 64k;

                        proxy_buffers   4 64k;

                        proxy_busy_buffers_size 128k;

                        proxy_temp_file_write_size 128k;

                        proxy_http_version 1.1;

                        proxy_set_header Connection "";

                        proxy_pass http://backend-others;

                    }

    1   server

    定义服务器的地址address和其他参数parameters。 地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。还可以定义下面的参数:

    1)  weight=number 设定服务器的权重,默认是1。

    2)  max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

    3)  fail_timeout=time 设定统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。服务器被认为不可用的时间段。默认情况下,该超时时间是10秒。

    4)  Backup 标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。

    5)  Down 标记服务器永久不可用,可以跟ip_hash指令一起使用。

    2   默认的是RR轮询。

    3   ip_hash

    指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。可以解决session和cookie的问题,但会导致负载不均衡。

    4   keepalive

    激活对上游服务器的连接进行缓存。connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。如果连接数大于这个值时,最久未使用的连接会被关闭。需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。 新的连接总会按需被创建。connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。

    1)  对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空。

    2)  另外一种选择是,HTTP/1.0协议的持久连接也可以通过发送“Connection: Keep-Alive”头来实现。不过不建议这样用。

    3)  对于FastCGI的服务器,需要设置 fastcgi_keep_conn 指令来让连接keepalive工作。当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。

    5   proxy_connect_timeout 

    默认是60s,设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。

    proxy_read_timeout默认60s,定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

    6   proxy_send_timeout

    默认60s, 定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

    7   proxy_buffer_size

    设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。

    8   proxy_buffers为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。

    9   proxy_busy_buffers_size

    当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。

    10  proxy_temp_file_write_size

    在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。

    2.2      后端服务器的配置   

     

    位置

    参数名

    默认值

    Tomcat

    Server.xml

    Connector标签下的maxKeepAliveRequests

    100

    Nginx

    Server模块

    keepalive_requests

    100

    修改相应的值以适应Nginx Upstream的配置需求,如Nginx的keepalive_requests配置为20000。而在Tomcat中的maxKeepAliveRequests官方建议最大值是200,请根据实际需求测试结果来配置

    upstream backend-others {

                server 10.123.73.242:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.244:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.245:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.246:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.248:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.249:81 max_fails=0 fail_timeout=10s;

                server 10.123.73.247:81 max_fails=0 fail_timeout=10s;

                keepalive 20000;

            }

    location / {

                        #防止502以及Timeout的发生

                        proxy_connect_timeout 75;

                        proxy_read_timeout 300;

                        proxy_send_timeout 300;

                        proxy_buffer_size 64k;

                        proxy_buffers   4 64k;

                        proxy_busy_buffers_size 128k;

                        proxy_temp_file_write_size 128k;

                        proxy_http_version 1.1;

                        proxy_set_header Connection "";

                        proxy_pass http://backend-others;

                    }

    1   server定义服务器的地址address和其他参数parameters。 地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。还可以定义下面的参数:

    1)  weight=number 设定服务器的权重,默认是1。

    2)  max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

    3)  fail_timeout=time 设定统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。服务器被认为不可用的时间段。默认情况下,该超时时间是10秒。

    4)  Backup 标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。

    5)  Down 标记服务器永久不可用,可以跟ip_hash指令一起使用。

    2   默认的是RR轮询。

    3   ip_hash指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。可以解决session和cookie的问题,但会导致负载不均衡。

    4   keepalive激活对上游服务器的连接进行缓存。connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。如果连接数大于这个值时,最久未使用的连接会被关闭。需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。 新的连接总会按需被创建。connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。

    1)  对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空。

    2)  另外一种选择是,HTTP/1.0协议的持久连接也可以通过发送“Connection: Keep-Alive”头来实现。不过不建议这样用。

    3)  对于FastCGI的服务器,需要设置 fastcgi_keep_conn 指令来让连接keepalive工作。当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。

    5   proxy_connect_timeout 默认是60s,设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。

    proxy_read_timeout默认60s,定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

    6   proxy_send_timeout默认60s, 定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

    7   proxy_buffer_size设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。

    8   proxy_buffers为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。

    9   proxy_busy_buffers_size当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。

    10  proxy_temp_file_write_size在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。

    [ 编辑本段 ]   [ 回目录 ]2.2      后端服务器的配置   

     

    位置

    参数名

    默认值

    Tomcat

    Server.xml

    Connector标签下的maxKeepAliveRequests

    100

    Nginx

    Server模块

    keepalive_requests

    100

    修改相应的值以适应Nginx Upstream的配置需求,如Nginx的keepalive_requests配置为20000。而在Tomcat中的maxKeepAliveRequests官方建议最大值是200,请根据实际需求测试结果来配置

  • 相关阅读:
    装饰者模式(包装模式)
    内网穿透
    SpringMVC框架工作流程图及工作原理
    Java 使用 Socket 判断某服务能否连通
    最简单的一个socket客户端,保持连接服务端
    java读取txt文件
    SQL汇总
    最简单的一个socket服务端
    初级软件工程师怎么走向BATJ?——献给迷茫中的测试人
    软件测试工程师——100问面试题,你敢来接招吗?
  • 原文地址:https://www.cnblogs.com/shengs/p/4701905.html
Copyright © 2011-2022 走看看