为了提升浏览器页面加载速度,我们网站打算采用node.js作为服务端来渲染页面。 现在遇到一个非常棘手的问题,真心求教大神们指点一下。
我们用node渲染了一个页面,页面大小为160KB,输出模版采用handlebars,从接受请求到返回数据,小于30ms。用ab在做压力测试的时候,发现并发很低(700/sec),node 所在进程的CPU也基本满载了。
经过分析,是带宽不够的原因,机器是千兆网卡,千兆网卡的传输速率在110M左右。 当并发在1000次/sec的时候,数据为1000*160KB=160M/sec,已然超出了机房的110M带宽,1000并发都压不了,更无从继续2000、3000压测了… 带宽满载导致了node无法下发数据,而接受到的任务越积越多,cpu负载过高;而ab压测端也在阻塞,请求不能及时出,node回应也无法及时收到。 上面这些原因,最终导致ab的压测值 700/sec,这显然不符合预期。 我在node层加了gzip压缩,数据压缩到16kb,带宽压力减轻了,QPS也提升到1100/sec,但是这样增加了node负载,cpu已满载,离预期的4000+并发依然很远。
江湖传言,天猫已全面普及node,用node来渲染页面。服务端渲染页面势必对带宽要求很高,是否遇到同样的问题?请阿里大神、各路大神们指点一下,对于这种情况,大伙都是怎么解决的。
跪拜~
先说下我现在在做的项目,我们没有采用服务端渲染,直接输出空html到浏览器,然后在前端渲染和重载body部分,延迟很低,对带宽要求也很低,就相当于只有一个链接,就是主页,没有刷新和跳转,只是重载body,html内部的html信息通过websocket发送到浏览器,然后就不再关注了,浏览器自己决定怎么渲染
gzip放在Nginx端试试?