1. WEB 服务性能测试和优化
1.1 测试环境搭建
网络环境:内网
压力测试服务器:
服务器系统:Linux 2.6.18
服务器配置:Intel® Xeon™ CPU 3.40GHz 4 CPUS
内存:6GB
反向代理服务器:Nginx服务器
服务器系统:Linux 2.6.18
服务器配置:Pentium® Dual-Core CPU E5800 @ 3.20GHz 2CPUS
内存:2GB
发包服务器:
发包工具:apache 2.2.19自带的ab测试工具
服务器系统:Linux 2.6.18
服务器配置:Pentium® Dual-Core CPU E5800 @ 3.20GHz 2CPUS
内存:1GB
1.2 CPU性能测试
Nginx可作为HTTP服务器,在处理高并发请求的时候拥有比现在主流的Apache服务器更高的性能,同时Nginx也是一个优秀的反向代理服务器。所以在服务器端开启一个或多个Node.JS进程在多核CPU上运行,我们利用Nginx来进行反向代理和负载均衡,监听8888端口,直接通过使用Apache自带的ab测试包对8888端口进行压力测试。获得的测试结果如下所示:
Type |
单进程 |
双进程 |
三进程 |
Commond |
1000/30 |
1000/30 |
1000/30 |
rps |
203 |
311 |
432 |
tpq |
4.93 |
3.2 |
2.37 |
50%req |
4500ms |
1500ms |
750ms |
Fail |
0 |
0 |
0 |
表一 Node.JS多进程压力测试表
注:1000/30:代表命令./ab -c 1000 -t 30 http://10.1.155.40:8888/
rps:代表每秒处理请求数,并发的主要指标
tpq:每个请求处理的时间,单位毫秒
fail:代表平均处理失败请求个数
50%req:代表50%的请求在多少毫秒内返回
在有业务处理压力的情况下,单开Node.JS和多开Node.JS性能有明显差别, 每秒处理请求数性能提升100%,从用户响应速度上提升200%,从稳定性上提升200%。所以在多核CPU运行Node.JS 的时候可将1个CPU绑定Nginx进程使用,其他的CPU绑定Node.JS进程,这样可以明显提升服务器的性能和稳定性。
1.3 缓存优化策略
通过上面的论述我们介绍了Node.JS主要的两个缺点:V8内存限制和Node.JS的单线程等;这里我们给出了几种主要的解决方案,从而有助于其提高Node.JS的响应速度和WEB服务性能。
对于缓存要求不高的Web应用来说,在Node中做缓存最简单高效的方法是使用一个Object对象,将缓存以key-value的形式存入这个对象中,这么做的理由是拥有更快的存取速度。通过测试得知,相比Redis通过TCP连接的形式与客户端进行通信,在程序中直接使用对象进行存储的效率会是Redis的40倍。
对于解决资源不足的问题,尤其是内存方面的问题,通常采用风险转移的方式。即将缓存点从Node.JS进程中转移到第三方成熟的缓存(如Redis,varnish等)中去即可。这样做的优点在于:1、缓存内容没有冗余;2、集中式缓存,减少不一致性的发生;3、更加优秀的缓存算法以保证较高的命中率;3、让Node.JS保持轻量,以解决它更擅长的问题[1];
对于上面提到的请求上涨,硬盘IO 读取压力的问题,我们可以做如下改进:1、为指定几种后缀的文件,在响应时添加Expires头和Cache-Control: max-age头。超时日期设置为1年。2、由于这是静态文件服务器,为所有请求,响应时返回Last-Modified头。3、为带If-Modified-Since的请求头,做日期检查,如果没有修改,则返回304。若修改,则返回文件。4、使用GZip压缩文件可以减少响应的大小,能够达到节省带宽的目的。