请教一个请求慢的问题
发布于 8 年前 作者 billypon 4600 次浏览 来自 问答

用node+express开发了一个小程序,最终以production运行 但如果闲置的时间比较长(具体多久不清楚),后面第一次请求就会很慢,以后再请求就会很快 这个纯粹是计算请求返回的时间,不含静态资源 这是什么问题?如何解决?

18 回复

第一次请求需要建立tcp链接,握手-延迟确认,后面建立长链接后省去了这些

@jiangliqin 不,实际上和这个无关 关掉浏览器后,或者重新打开别的浏览器,甚至换一台电脑,换一个网络,此时请求不再缓慢 所以明显和tcp的三次握手无关

有可能是纳格算法的问题 要禁用掉纳格算法 server.on(‘connection’,function(socket){ socket.setNoDelay(true); });

@151263 测试过了,这个方法也不行 停掉服务,然后修改代码,再启动服务,第一次请求的时候依然慢

@billypon 用console.time(“good”); console.timeEnd(“good”); 看看是哪一步慢

@151263 试了一下,我在请求开始的地方设置time一下,然后请求返回之前timeEnd 再用curl模拟请求,结果就是先卡20s无显示,接着再显示time的时间,然后curl返回 之后再curl,就立即返回,相当的快

就是说,一旦闲置一段时间,给人的感觉就好像是重启了服务一样

@billypon 并且如果这个时候我立刻重启服务进程,请求还是相当的快

@billypon 你要排除是网络的问题, 换个网络试一下,比如说局域网, 然后 time也逐步的缩小范围, 对于诡异问题,逐步排除是唯一的方法

@151263 我是直接在服务器上curl自己,所以不存在网络问题吧 time的话,我直接放在整个请求上,但返回的时间还是很短,连1秒都不到。 也就意味着,主要是卡在time之前

不说请求里的具体逻辑,都是耍流氓

@billypon 那你就换一台服务器再次测试,换成别的电脑同样的代码再测试

@151263 好,感谢关注,有结果了我再发上来

@151263 结果来了,同样的代码,我后来放本机运行,同样是闲置很长时间 服务器是centos+systemd,本机是直接node app.js,都以production模式跑的 本机就很快,几乎秒回

@billypon 那至少可以说明,跟nodejs的代码无关, 或者是操作系统,或者是网卡,或者是硬件部分

是不是跟虚拟机有关系。闲置之后 资源较少,启动就较冷。

@151263 本机虽然快,但也是有一个停顿的,只是停顿时间很短,最多1s 而服务器上,停顿20s都有可能

@JacksonTian 那请问有什么方法可以查吗?我感觉像是一些buffer被回收了,然后停顿的时间是为了重建buffer,不知道理解对不对

@JacksonTian 我的服务,天天都跑在虚拟机上, 各种各样的虚拟机,也没出现过这个问题

回到顶部