nginx优化实践于与验证

Posted 陈雷雷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx优化实践于与验证相关的知识,希望对你有一定的参考价值。

nginx优化实践

实践场景1: 单台nginx 2核4G
实践场景2: 三台nginx 2核4G
压测工具:WRK

初始安装的nginx压测:

yum install -y nginx

安装WRK压测工具

git clone https://gitee.com/mirrors/wrk.git
cd wrk
make 
cp -a  wrk  /usr/local/bin/

wrk参数:

使用方法: wrk <选项> <被测HTTP服务的URL>                            
  Options:                                            
    -c, --connections <N>  跟服务器建立并保持的TCP连接数量  
    -d, --duration    <T>  压测时间           
    -t, --threads     <N>  使用多少个线程进行压测   
                                                      
    -s, --script      <S>  指定Lua脚本路径       
    -H, --header      <H>  为每一个HTTP请求添加HTTP头      
        --latency          在压测结束后,打印延迟统计信息   
        --timeout     <T>  超时时间     
    -v, --version          打印正在使用的wrk的详细版本信息
                                                      
  <N>代表数字参数,支持国际单位 (1k, 1M, 1G)
  <T>代表时间参数,支持时间单位 (2s, 2m, 2h)

云服务器配置

3台Linux服务器-绑定了一个公网IP39.98.77.148用于配置服务器
1台负载均衡slb

3台服务器安装nginx

yum isntall -y nginx

标识不同nginx
echo "nginx-171" >/usr/share/nginx/html/index.html
echo "nginx-171" >/usr/share/nginx/html/index.html
echo "nginx-171" >/usr/share/nginx/html/index.html

#nginx配置[每台服务器都使用最基础的配置]:
egrep -v "^$|#" /etc/nginx/nginx.conf.default >/etc/nginx/nginx.conf
nginx -s reload


#配置概览:
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


检查轮询算法:
[root@nginx-172 ~]# curl 192.168.0.171
nginx-171
[root@nginx-172 ~]# curl 192.168.0.172
nginx-172
[root@nginx-172 ~]# curl 192.168.0.173
nginx-173

wrk压测 初始[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208

初始配置压测:
[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   246.22ms  289.79ms   2.00s    85.67%
    Req/Sec     1.12k   427.18     3.51k    72.62%
  265348 requests in 2.00m, 1.34GB read
  Socket errors: connect 0, read 20, write 7873, timeout 3620
Requests/sec:   2210.37
Transfer/sec:     11.41MB


初始数据: 
延迟  246.22ms

优化1: work进程连接数优化:

worker_processes  1;
events {
    worker_connections  100000;    <----连接数配置,3台都配置成这个,重启后测试
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

结果:

[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   238.58ms  279.94ms   2.00s    84.64%  
    Req/Sec     1.06k   420.61     2.89k    70.18%
  250585 requests in 2.00m, 1.26GB read
  Socket errors: connect 0, read 12, write 10299, timeout 2497
Requests/sec:   2086.60
Transfer/sec:     10.77MB
--------------------------------------
结果:
延迟降低   289.79ms --> 238.58ms
丢包率减少 3620 --> 2497

优化2: work进程数量优化:

worker_processes  auto;   <--- 这里直接改为了auto,而不是1
events {
    worker_connections  100000;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

结果:

[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   263.22ms  298.89ms   2.00s    86.82%
    Req/Sec     1.10k   382.66     2.81k    71.77%
  259948 requests in 2.00m, 1.31GB read
  Socket errors: connect 0, read 10, write 6921, timeout 3454
Requests/sec:   2165.50
Transfer/sec:     11.18MB

结果:
每秒处理请求数   2086.60 --> 2165.50

优化3: cpu亲和力和优先级:

worker_processes  2; 
worker_cpu_affinity 0101 1010;  <--- 亲和力
worker_priority -20;     <---优先级
events {
    worker_connections  100000;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

结果:

[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   222.80ms  267.85ms   2.00s    84.34%
    Req/Sec   805.34    333.47     2.61k    73.99%
  190706 requests in 2.00m, 0.96GB read
  Socket errors: connect 0, read 15, write 16445, timeout 1272    # timeout明显减少
Requests/sec:   1588.88
Transfer/sec:      8.20MB

优化4: gzip优化:

worker_processes  2; 
worker_cpu_affinity 0101 1010;  <--- 亲和力
worker_priority -20;     <---优先级
events {
    worker_connections  100000;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip on;
    gzip_min_length 500;
    gzip_buffers 4 256;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_disable "MSIE [1-6]\\.";
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   232.83ms  277.62ms   2.00s    84.19%
    Req/Sec     0.95k   346.60     2.94k    75.79%
  225026 requests in 2.00m, 1.14GB read
  Socket errors: connect 0, read 13, write 12248, timeout 2490
Requests/sec:   1873.72
Transfer/sec:      9.71MB

优化5 CPU开销优化

events {
    worker_connections  100000;
    multi_accept on;
    accept_mutex on;
    accept_mutex_delay 1ms;
}
[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   213.94ms  260.76ms   2.00s    84.76%
    Req/Sec     0.87k   371.67     3.34k    77.82%
  206969 requests in 2.00m, 1.05GB read
  Socket errors: connect 0, read 13, write 15329, timeout 1713
Requests/sec:   1724.03
Transfer/sec:      8.93MB

优化6 日志优化

access_log /var/log/nginx/access.log aaa buffer=1m;
[root@master wrk]# wrk -t2 -c800 -d120s http://39.99.217.208
Running 2m test @ http://39.99.217.208
  2 threads and 800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   246.08ms  278.00ms   2.00s    84.53%
    Req/Sec   804.20    420.24     3.23k    75.12%
  189759 requests in 2.00m, 0.96GB read
  Socket errors: connect 0, read 30, write 14936, timeout 1451 
Requests/sec:   1580.08
Transfer/sec:      8.19MB

以上是关于nginx优化实践于与验证的主要内容,如果未能解决你的问题,请参考以下文章

linux学习:Nginx--常见功能配置片段与优化-06

张超:又拍云 OpenResty / Nginx 服务优化实践

研效优化实践:Python单测——从入门到起飞

第1370期 验证码前端性能分析及优化实践

记一次接口性能优化实践总结:优化接口性能的八个建议

如何验证 jemalloc 优化 Nginx 是否生效