当没有多进程的情况下,node的单线程模式会导致以排队的方式处理请求,当请求多的时候,势必会消耗较多CPU时间,特别是CPU密集型,或者烂的代码,比如一个会导致死循环(不知道会不会发生死锁之类的状况)这样的bug,整个服务器就直接宕掉。
app.get('/1',function(req, res) {
res.json({ title1: 'OK' });
});
app.get('/2', function(req, res) {
while(true) { /* 表示大量的CPU时间 */ }
res.json({ title2: 'OK' });
});
先访问/1,证明服务器没问题
访问/2,浏览器一直在转圈
在访问/1,也出不来了
实验结论:node对于CPU密集型(比如说写一个死循环)并不是无力的,而是直接死。。。
查询数据时间和各种资源调度时间忽略不计
一个用户等待的时间 >= 排在前面所有任务的CPU运算时间之和
如果要想浏览器等待一个资源响应的时间不能超过100ms,这里网络IO可能花掉50ms,10000个请求,每个的运算时间为5us=5*10^-6 s,一个3.2GHz的CPU(然而,单线程对多核CPU的利用并不理想),3.2GHz=3.2*10^9 Hz,也就有16K个指令周期,即便不用做解释,也许require的时候做过预编译,毕竟不是机器码,估计也做不到汇编层面上的优化,还有GC时间stop-the-world,16K也不是很多。
然而,考虑到现实情况,查数据的时间会更长,还要和DB进行IO,运算时间花的很少,IO又是异步的,这样就可以接受更多的请求,那么,就可能需要分配更多的内存作缓存区,内存用多了又被分页、调虚拟内存。。。