Node使用了多进程,但QPS(每秒查询率)没有线性增长

阅读《深入浅出Node.js》10.2.3小节,里面测试了单进程和多进程下QPS的对比,性能确实提高了,但是却没有解释为什么性能并没有与CPU的数量成线性增长。
我自己也试了,确实如此。

现在的处理器支持SMT(intel商标化的名称叫“超线程”),也就是说你看到的计算机上的逻辑处理器核心的数量比物理的要多(一般是2倍,在一些处理器上是4倍或者更多)
但是逻辑处理器因为共享计算核心,所以并不能成倍提高性能。比如一个8逻辑处理器的计算机,实际上只有4个内核,那么它充其量只能比单个处理器内核提高大约5倍的性能。

另一个问题是,虽然你的处理器可以并行,但是磁盘还是只有一个,如果两个进程需要同时访问磁盘完成查询,那么显然只能轮流访问而不是同时访问,这部分无法并行。别的资源也类似。
因此,一个程序能加速到什么程度,取决于可以并行的代码的比例。
假设一个程序中有50%的操作不能并行,那么即便你有无穷多个处理器,并发无穷多个进程,那么你的程序的运行速度相比较单进程也最多提高2倍。
(50%无法并行的部分所用的时间假设是t/2,50%可以并行的操作用时是t/2,总时间是t/2+t/2=t,假设你有无穷多个进程,那么总时间就是t/2+0=t/2)

那是多个进程之间还是会有一些资源竞争,比如网络IO,文件IO,内存等。