发表于: 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 ms | 165 | 60% | 547 ms | 295 | 46% |
中位相应时间(Median) | 171 ms | 117 | 32% | 171 ms | 125 | 27% |
90% line | 1067 ms | 238 | 78% | 1423 ms | 529 | 63% |
错误率 (Error %) | 0.18% | 1.58% | -778% | 20.55% | 8.52% | 59% |
Throughput | 727 每秒 | 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内存主机。
- 我使用Win10 Surface 跑Jmeter测压,能达到600请求/每秒的的Througput,错误率3%左右。
- 使用Mac i7 16G内存测,能达到1300每秒throughput,
- 使用一台8核32G服务器Run jmeter 发测压请求,能达到5000左右的throughput 错误率3%一下。
- 使用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服务器实际处理请求时的压力性能还没测,其它过程都有了一定认识。
明日计划
明天要跑长途。。。估计要滑水了。
评论