发表于: 2017-06-22 10:17:32

3 1128


今日完成

简介

Nginx就是一个服务器了。大家称它是一个轻量级的服务器,因为和上古时代的Apache服务器比,Nginx的配置简单许多,服务器大小也小很多。Nginx服务器能达到一个什么样的性能呢?我们争取通过下面的实验来偷窥一下Nginx的性能。

 

1 实验环境配置

主机奢侈的选用了一个8核的,位于日本东京。系统选择了Centos 7。Ping了一下,延迟大概90ms。

        

在主机上安装Nginx。安装成功后可以看到安装成功的页面。

 

2 网页测压 - 不做性能调整

2.1 默认配置

作为一个基准点。我们要看看Nginx不调整时的性能。此时的配置文件如下。

 

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/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  /var/log/nginx/access.log  main;
sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;
include             /etc/nginx/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       80 default_server;
       listen       [::]:80 default_server;
       server_name  _;
       root         /usr/share/nginx/html;
       # Load configuration files for the default server block.
       include /etc/nginx/default.d/*.conf;
       location / {
       }
       error_page 404 /404.html;
           location = /40x.html {
       }
       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
}

可以看到 worker_processes auto已经配置让Nginx自己决定建立多少个worker。理论上它会根据需求建立8个(因为我们的服务器是8Core)。

 

2.2 测试一:在一秒钟内建立500个用户向服务器的默认页循环发出10个请求。

 

2.3 测试二:1000个用户并发访问请求10次

 

3: 调试Nginx后进行测试

3.1 配置nginx

使用了下面的配置来优化Nginx的性能。

worker_processes  auto;
worker_rlimit_nofile 100000;
events {
use epoll;
worker_connections 1024;
multi_accept on;    
}
http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
access_log off;
keepalive_timeout  65;
keepalive_requests 200;
reset_timedout_connection on;
sendfile on;
tcp_nopush on;
gzip on;
gzip_min_length 256;
gzip_comp_level 3;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache max=10000 inactive=30s;
open_file_cache_valid    60s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;
}

3.2 测试一:在一秒钟内建立500个用户向服务器的默认页循环发出10个请求。

3.3 测试二:1000个用户并发访问请求10次

 

3.4 测试结果总结

对比数据可以发现调试后性能提升还是比较明显的,在测试一中,错误率有所提成。测试二中,调试后的错误率虽然从20%降到了8.5%,但8.5%也不是可以接受的错误率。这次测试仅仅是使用nginx安装后自带的默认页来测压,没有什么复杂的页面内容,没有过多的图片,页没有什么数据库链接。所以在真实网站上如果存在复杂内容,nginx单机的性能应该就是这样了(当然还有更贵的服务器可选)。

测试一测试二
调试前 2.2调试后 3.2调试后性能提升调试前 2.3调试后 3.3调试后性能提升
平均相应时间 (Average)410 ms16560%547 ms29546%
中位相应时间(Median)171 ms11732%171 ms12527%
90% line1067 ms23878%1423 ms52963%
错误率 (Error %)0.18%1.58%-778%20.55%8.52%59%
Throughput727 每秒1251 每秒72%1057 每秒1685 每秒59%

 

4 Nginx 负载均衡

4.1 Nginx 简介

在前面我们基础的测试了单机Nginx的性能。在前面的测试中单机Nginx自己接收请求,处理请求,返回相应。在Nginx负载均衡后,Nginx主机负责接受请求以及根据转发算法来转发请求给upstream。处理请求以及返回相应都有upstream里面的各个节点(node)服务器处理。这样的配置对性能有什么影响呢?希望可以通过后面的实验来揭示。

为了简化过程,后面的实验里面我们还使用Nginx作为Node,以及只用安装后的默认页做实验。而不是用Tomcat,或者其它服务器来链接Nginx。

后面负载均衡都使用的least_conn算法分配request。每个node的主机都是1核 1G内存

4.1 一个主机加一个Node

配置后,我把Node节点S1 服务器的默认页上的标题改了,再次通过主机的ip访问,如果看到了我们改过的标题就证明Upstream设置成功了。事实证明。。确实成功了。。。可以看到标题变成了”我的S1服务器”

4.1.1 测试一:500请求一秒内发出,循环10次

4.2 测试二:1000个请求并发,循环10次

 

4.2 一台主机带2个Node

用和4.1同样的配置,但是要把默认在的主页标题里面添加上S2的字样,这样我们不断刷新对主机的访问,应该有机会看到带有S2的页面出现。这就证明我们的负载均衡配置成功了。事实证明。。我们又成功了。

4.2.1 测试一:500请求一秒内发出,循环10次

 

4.2.2 测试二:1000个请求并发,循环10次

测试跑了几次都是最后有一个thread一直不结束,拉低了整体的结果。

 

4.3 一台主机带4个Node

用同样的配置再增加两个Node。配置时在第三个服务器和第四个服务器的默认页中的标题加上S3 和 S4字样。配置好后把这两个服务器配置到Nginx主机的Upstream里面。再通过手动刷新对Nginx主机的访问来确认添加成功。

看到了这两个字样,我们的负载均衡成功搭配上了4个Nodes。

4.3.1  测试一:500请求一秒内发出,循环10次

4.3.2 测试二:1000个请求并发,循环10次

 

4.4 一台主机带8个Node

用同样的配置,以及同样的测试方法确认8台Node主机都设置好了,负载均衡确认工作。

 

4.4.1  测试一:500请求一秒内发出,循环10次

4.4.2 测试二:1000个请求并发,循环10次

4.4.3 测试三:使用两个不同的机器同时使用Jmete对服务器进行测试一。

结果性能差点的机器达到了350的throughputs,性能好的机器达到了700多的throughputs。两个加起来总性能1100多。从此判断Nginx的Throughputs.

 

4.5 总结

前面测试从一个node 增加到了8个node,并不能很好的感受到性能的变化。我们是Nginx后面挂了8个Nginx,测试的相当于是Nginx的性能。这是比较脱离实际的组合。正常生产环境下Nginx后面挂的是不同的服务器,比如Tomcat, Node.js,Django等等等等。Nginx的主要责任是做负载均衡。所以,要得到更有实际意义的结果,我们需要更真实的模拟生产环境,应该在Nginx后面挂Tomcat,Tornado,Django。

另外,发送测试请求的机器也可能是测试的平静。我用Mac做测试请求发送的机器的时候的结果明显好于用Surface tablet。错误率也很有可能和发送测试请求的机器的内存有关。所以在后面的试验里面我开设一台新的8核服务器来发送测试请求看看结果如何。

在试验之前,本对1挂8的性能有着很高的期望,到目前位置并没有看出区别,一定有原因,这就是现实。认命吧!少年。

 

5 使用性能更高的服务器测

继续使用一台8核服务器32G内存,Centos7 。使用Jmeter。用了一下午时间配置Jmeter remote。。不成功。最后在半夜12点决定开4台8核32G服务器,手动同时测。结果Througput大概能到5000每秒,错误率大概是低于1%。算是可以接受的了。其实这和用一台8和机器测的结果差不多了。

被测服务器架构,Nginx主机跑在8核32G内存服务器上,带了8个1核1G内存主机。

  1. 我使用Win10 Surface 跑Jmeter测压,能达到600请求/每秒的的Througput,错误率3%左右。
  2. 使用Mac i7 16G内存测,能达到1300每秒throughput,
  3. 使用一台8核32G服务器Run jmeter 发测压请求,能达到5000左右的throughput 错误率3%一下。
  4. 使用4台8核32G服务器同时跑Jmeter,四个服务器的throughput结果加起来,大概5000/秒左右。

另外,被测的Nginx主机在测试最高峰  CPU使用率超过了250%。可以说是到了瓶颈了。

8个Node服务器最高只到了20%左右

测压用的4个8核32G内存服务器都最高到了150%左右的CPU使用率

看来Nginx主机是瓶颈。以及测压时候,发送测压请求的机器也可能成为瓶颈。我们仅仅测试了Nginx主机分配Request的能力。还没有真正触及Application(Tomcat)服务器的性能。

今日遇到的困难

配置Jmeter分布式运行,本想用多台服务器同时发请求到被测主机,结果搞了一下午加上一晚上也没搞成,网上文章又少。最后还是开4个机器手动同时启动4台机器。这种费力不讨好的事情真是懊恼。

今日所学

对Nginx的性能以及服务器的性能有了一定认识。从用户发送请求,请求通过网络到达Nginx服务器,服务器分发请求给Node处理,Node返回相应给用户这个链条里,除了Node服务器实际处理请求时的压力性能还没测,其它过程都有了一定认识。

明日计划

明天要跑长途。。。估计要滑水了。




返回列表 返回列表
评论

    分享到