express+mongoose做的。单台1核1g内存的node服务器。 我有个请求,去数据库查询耗时大概700ms左右,因为是聚合查询,而且数据量不小。这样子的一个请求,是不是会很严重的影响并发,我测试了下,几百的并发感觉有单撑不住。mongo那里cpu占用直接100%。访问一下就会很卡很慢,像是阻塞了。 为什么说是阻塞了。因为我又开了台node一模一样,连接同一个mongo数据库,访问完全没有问题,数据库查询也没问题。。。就想问这样子的请求是不是已经阻塞了node?
当然会的,CPU密集型任务是Node.js不大适合的场景…
如果mongodb与node不竞争CPU的话,光是数据查询网络传输部分是非阻塞的,但是查询过来对数据再处理,这个部分是同步的,如果计算量大就会阻塞。如果存在竞争CPU的情况,那说明计算资源不够,得加PU。异步的本质是让别人做事情,如果没有别人了,都自己干,本质上其实还是同步的,还是一个接一个干,而且还要付出进程的代价。
回调函数内执行的内容除了异步命令函数,其他的都是同步的,如果计算量大,肯定是阻塞的。
看你的描述, node这边是没有阻塞的, 主要是在mongodb上. 因为mongodb聚合查询数据量大, 这部分在单核CPU上响应过慢, 导致整个系统的吞吐能力受限
同意三楼的意见,问题出在数据库。700ms的查询还要承受大并发是不合理的。应优化数据查询或调整结构
来自炫酷的 CNodeMD
@DavidCai1993 CPU密集型也是要看情况的进行评估的,node异步IO可以解决部分。
麻烦了,我怎么和大家的想法不一致
我所理解的是,楼主所出现的情况是MongoDB瓶颈了,和Node这层是否阻塞没关系啊
由于NodeJS异步非阻塞IO,查询MongoDB所耗的时间长短并不影响Node层的并发吧
在我压力测试的经验中,只要Node应用占用CPU没达到100%,就说明并发量还没到极限
非阻塞是指的I/O(网络,文件,etc)的非阻塞.除此此外,运算都是阻塞的,因为不是多线程.
@DavidCai1993 @coordcn @kiliwak @klesh @Tei320 我试了下,阻塞也只会阻塞当前这个session的请求,也就是一个人阻塞了自己,其他人走这个请求还是可以正常走的。感觉这个问题好难定位,说是mongo负载高,可以理解,因为我htop看一下,cpu占用已经100%,而且始终保持,不过我新加了一台node去连接访问mongo,可以正常运转=。= 给我的感觉像是mongoose只有一个连接,是不是有点影响并发了。具体还在研究~
@CoderIvan node的cpu占用没有到100%,我是mongo占用到100%,mongo和node不在一台机器上
@CN-Sean 用户User1访问接口Interface1(mongo相关)卡住,然后你在用他访问interface2(mongo无关),如果访问不了,那么便是阻塞了,反之,mongo卡住了。
@hanyuzhou2006 对,我赞同这说法
@hanyuzhou2006 感谢建议,已测试,可以访问接口2
@hanyuzhou2006 然后,mongo我估计是在那个连接上卡住了,新开的node服务器重新连接,完全没有问题
问题卡在mongodb上,可以考虑mongodb cluster,把数据库查询横向扩展。