首页
学习
活动
专区
工具
TVP
发布

node服务器开发性能优化

最近拜组里开发需要用了node开发web服务,框架选用的是koa,自带路由,nodejs本身工作线程是单线程,但相关阻塞操作可以异步处理并定义回调函数再交由主函数处理,同时koa定义了自己的genarator执行器,这个执行器要求对next的传入参数都必须是Promise对象,个人实现了一下这个执行器,执行原理应该如下:

function yieldProcess1(){

return new Promise((resolve,reject)=>{

resolve('yield process1');

})

}

function yieldProcess2(){

return new Promise((resolve,reject)=>{

resolve('yield process2');

})

}

function* genTemplate() {

let data1=yield yieldProcess1();

let data2=yield yieldProcess2()

}

function gen() {

let data1=(function())()

let data2=(function())()

}

function coroutine(generator) {

let gen=generator()

function next(arg){

let result=gen.next(arg)

if(result.done)

return

console.log(err)

})

}

next()

}

let beg=(new Date()).getTime();

for(i=0;i

coroutine(genTemplate);

}

console.log((new Date()).getTime()-beg)

beg=(new Date()).getTime();

for(i=0;i

gen()

}

console.log((new Date()).getTime()-beg)

koa调度主要函数如下:

function koaConcurrent(generator) {

let gen=generator()

function next(arg){

let result=gen.next(arg)

if(result.done)

return

console.log(err)

})

}

next()

}

这样就把原来的异步操作同步化了,同时在处理工作线程阻塞操作时通过coroutine让出了cpu时间片,有效的利用了cpu资源

但是目前来看单线程运行,性能再高还是没有办法利用好多核机器的优势。之后我们使用了PM2进程管理器,这是一个守护进程,会启动多个子进程处理连接请求,很好的利用多核资源,在开了四个子进程情况下,并发50的前提下qps达到270

继续优化时候netstat发现127.0.0.1有大量TIME_WAIT连接,就是本机nginx反向代理没有开足够的keepalive。调整之后,情况消失,同时性能进一步提高,并发50的前提下qps达到300以上,整体优化的也差不多了

目前来看node做web开发没有太大硬伤,虽然gc和jit可能不如老牌的java,但差距应该也不大,一些擅长js的前端程序员中小型的服务器开发可以优先选择。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180309G0NMA100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券