express+mongoose做的。单台1核1g内存的node服务器。 我有个请求,去数据库查询耗时大概700ms左右,因为是聚合查询,而且数据量不小。这样子的一个请求,是不是会很严重的影响并发,我测试了下,几百的并发感觉有单撑不住。mongo那里cpu占用直接100%。访问一下就会很卡很慢,像是阻塞了。 为什么说是阻塞了。因为我又开了台node一模一样,连接同一个mongo数据库,访问完全没有问题,数据库查询也没问题。。。就想问这样子的请求是不是已经阻塞了node?
如果mongodb与node不竞争CPU的话,光是数据查询网络传输部分是非阻塞的,但是查询过来对数据再处理,这个部分是同步的,如果计算量大就会阻塞。如果存在竞争CPU的情况,那说明计算资源不够,得加PU。异步的本质是让别人做事情,如果没有别人了,都自己干,本质上其实还是同步的,还是一个接一个干,而且还要付出进程的代价。
回调函数内执行的内容除了异步命令函数,其他的都是同步的,如果计算量大,肯定是阻塞的。
麻烦了,我怎么和大家的想法不一致
我所理解的是,楼主所出现的情况是MongoDB瓶颈了,和Node这层是否阻塞没关系啊
由于NodeJS异步非阻塞IO,查询MongoDB所耗的时间长短并不影响Node层的并发吧
在我压力测试的经验中,只要Node应用占用CPU没达到100%,就说明并发量还没到极限
@DavidCai1993 @coordcn @kiliwak @klesh @Tei320 我试了下,阻塞也只会阻塞当前这个session的请求,也就是一个人阻塞了自己,其他人走这个请求还是可以正常走的。感觉这个问题好难定位,说是mongo负载高,可以理解,因为我htop看一下,cpu占用已经100%,而且始终保持,不过我新加了一台node去连接访问mongo,可以正常运转=。= 给我的感觉像是mongoose只有一个连接,是不是有点影响并发了。具体还在研究~