服务的性能主要表现在两个主要方面:
- 吞吐量
- 是否存在内存泄漏
吞吐量——我们通常说的速度快慢
指标包含有QPS、并发数和响应时间
QPS(TPS):每秒钟request/事务 数量
并发数: 系统同时处理的request/事务数
响应时间: 一般取平均响应时间
他们之间的关系:并发数 = QPS * 响应时间
当这些指标达不到我们的系统设计要求,或者说系统预估的访问指标时,就需要通过调优提高指标,或者是增加硬件。
更详细的描述就不在赘述了,因为不是此篇文章的重点。
测量
首先我们先准备一个测试项目,本例的代码稍后展示
接下来我们就可以配置jmeter来对这个服务进行性能测试了。
- 首先为
测试计划
添加线程组
- 添加http请求
- 根据服务端情况填写配置项
- 添加查看结果树
- 添加聚合报告
到这里,一个最基本的测试组就完成了。可以点击启动查看执行效果了,在查看结果树
模块中可以看到发送的请求和收到的相应数据
再来看看聚合报告
聚合报告
中列出了这次测试的报告信息,这些指标的含义:
- Label:每个JMeter的element的Name值。例如HTTP Request的Name
- #Samples:发出请求数量
- Average:平均响应时间(单位:)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间
- Median:中位数,也就是50%用户的响应时间
- 90%Line:90%用户的响应时间
- 95%Line:95%用户的响应时间
- 99%Line:99%用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:本次测试中出现错误的请求的数量/请求的总数
- Throughput:吞吐量。默认情况下标示每秒完成的请求数(具体单位如下图)
- KB/sec:每秒从服务器端接收到/发送的数据量
以上的测试与其说是对node服务的测试,倒不如说是对jmeter的测试,因为我们只发送了一次请求,接下来我们就来一次压测,看看结果会怎么样。
如图修改线程组的设置,在10秒内启动200线程,循环执行10次
执行的结果
从该结果中可以看出,qps为11,中位数大于16秒,接下来我们看看是否有提升的空间。
调优
目前可以检测服务执行瓶颈的方式很多,我使用了应用最为广泛的v8-profiler。
- 首先在项目中引入
v8-profiler
const profiler = require('v8-profiler');
- 使用API生成监控文件
profiler.startProfiling('1', true);
setTimeout(()=>{
var profile1 = profiler.stopProfiling();
profile1.export()
.pipe(fs.