从原理上理解NodeJs的性能优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/i_lovefish/article/details/94592398

如果你是一个NodeJS服务器开发工程师,肯定面临过一个问题:如何优化NodeJS服务器的性能。这个问题其实涉及到的内容是非常广的,优化方法也是多种多样的,如果初涉这个领域很有可能被搞的晕头转向,不知道从哪里开始优化。更不理解那些密密麻麻的优化手段背后的原理。这篇文章用测试加分析的方式来说明NodeJS服务器的运行原理,帮助读者理清性能优化的头绪。

实验场景说明

服务器:NodeJS。

服务器测试工具:Chrome、Jmeter。

我实现了一个简单的NodeJS服务器,这个服务器只有一个简单的A接口。现在我希望经过一系列测试来搞清楚NodeJS服务器的运作原理从而理清如何才能提高它的性能。

测试 1

我用chrome简单的调用了一次A接口。

结果如下图:

可以看到接口A调用的整个过程的用时是21.12ms,这其实就是服务器的接口响应时间,这是体现服务器性能的重要指标之一。但其实接口A的执行时间只需要8ms。

可以得出结论:

接口响应时间 = 网络传输时间 + 应用服务器处理时间 + 接口执行时间。所以如果你要优化接口响应时间是不是需要检验以上不同阶段的耗时,使用不同的手段去有优化呢。

测试 2

我使用Jmeter在20秒内不断的重复调用接口A,测试结果如下:

其中需要关注的指标有两个Average(平均接口响应时间)是15ms和Throughput(吞吐量)是65次/秒。平均接口响应时间之前已有说明,这里我们看一下吞吐量。吞吐量是指服务器处理事务的效率,一般是指每秒钟处理多少个请求。优化服务器性能其实就是优化这两个重要的指标。

测试 3

我使用Jmeter同时开启了两个线程,在20秒内不断的重复调用接口A,测试结果如下:

现在我们来分析测试2和测试3的数据:可以看到平均响应时间(Average)差不多没有很大的变化。再来看看吞吐量,测试2为64.9次/秒,测试3为102.7次/秒。

为什么吞吐量会变大呢?其实原因很简单测试2中只有一个线程在调用接口A,接口返回后到接口A再一次调用这段时间内服务器是闲置状态。在测试3中,由于有两个线程在调用,能够利用服务器闲置的时间。服务器闲置时间变少了,吞吐量自然上升了。

测试 4

我又使用Jmeter同时开启了10个线程,在20秒内不断的重复调用接口A:

现在我们来分析测试3和测试4的数据,可以看到吞吐量(Throughput)没有很大的变化是。再来看看平均响应时间(Average),测试3为16ms,测试4为88ms。

为什么吞吐量没有变化呢?那是因为当服务器一直满负荷工作的时候,吞吐量就达到了最大值区间,就算线程数再大也不会有大变化。

为什么平均响应时间(Average)会变大呢?这也很容易理解,当服务器满负荷工作时,新过来的请求没办法及时处理就开始排队了。所以,响应时间变大的最大原因其实就是排队时间变大。

可以得出结论:

吞吐量的最大值其实就是在服务器满负荷工作时产生的。

测试 5

我把耗时8ms的接口A改成了纯异步的方法。同样使用Jmeter同时开启了10个线程,在20秒内不断的重复调用接口A:

可以看到平均响应时间(Average)又回到了15ms。再来看看吞吐量(Throughput)测试4为109.8次/秒, 测试5为567.0次/秒。

这是什么原因呢,由于NodeJS是单线程的,当你在接口中使用了一些异步的方法比如使用数据库或者异步文件操作来替原来的同步方法就好比解放了NodeJS主线程,每次请求节约了调用接口执行的8秒时间。

测试 6

我在测试5的基础上用了四核模式来开启NodeJS服务进行测试。

可以看到平均响应时间(Average)是17ms变化不大。再来看看吞吐量(Throughput)测试5为567.0次/秒,测试6为1081.4次/秒。

可以看到吞吐量又翻了一倍,这是为什么呢?因为4核模式相当于启用了4个NodeJS服务器。那为什么没有翻4倍呢?因为服务器机器的CPU是最大4核的,所以就算4核模式运行也不能用满4核,电脑系统还要运行。

总结

这里我通过一个例子和6个测试来一步一步说明NodeJS服务器的运行原理和理清性能优化的头绪。经过这6步改动,服务器的吞吐量从刚开始的65/sec到最后的1081.4/sec,同时平均响应时间(Average)也没有变大,已经是一次不错的优化。其实性能优化的办法有很多,这里主要是帮助你理清头绪。这样在实际工作中就可以根据自己项目的实际需求,去思考哪里需要优化,通过什么方式优化,最终达到什么效果。例如,避免使用同步代码,可以解放主线程。传输数据大的接口使用gzip可以加快网络传输速度。数据库服务器分离可以更好地利用CPU资源等等。

 

展开阅读全文

没有更多推荐了,返回首页