考虑到Node.js是单线程运行的,如果我在一个有4个EC2计算单元的Amazon EC2实例上运行Node服务器,它是否会比我只有2个EC2计算单元时运行更快/处理更多负载?
在亚马逊上,CPU利用率是否需要程序支持多线程才能充分利用所有资源?
考虑到Node.js是单线程运行的,如果我在一个有4个EC2计算单元的Amazon EC2实例上运行Node服务器,它是否会比我只有2个EC2计算单元时运行更快/处理更多负载?
在亚马逊上,CPU利用率是否需要程序支持多线程才能充分利用所有资源?
http://nodejs.org/docs/latest/api/cluster.html
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
回答你的问题,如果你只写“标准”的单线程JavaScript代码(你会受限于一个CPU),那么增加更多内核以提高节点性能是不起作用的。
这是因为node.js使用事件循环进行处理,所以如果你只启动一个单独的node.js进程而没有其他任何操作,它将不是多线程的,因此不会使用多个CPU(核心)。
然而,您可以使用node.js集群API来分叉(node process)进程,以便利用多个CPU(核心): https://nodejs.org/docs/latest/api/cluster.html。如果你以这种方式编写你的代码,那么拥有更多的计算单元将有助于你。
有一个注意事项,就是EC2计算单元是按每个实例详细说明的:http://aws.amazon.com/ec2/instance-types/。对于某些实例,你可以获得更多的“计算单元”每个虚拟核心。因此,如果你选择一个每个虚拟核心具有 2个计算单元的实例,而不是一个每个核心只有一个计算单元的实例,则你将能够在具有更多计算单元的CPU上执行node。然而,看起来在2个计算单元之后,计算功率会按核心分割,这意味着你不会从多个内核中获得任何好处。
亚马逊针对实例类型的总“EC2计算单元”概念并不直接映射到CPU或核心。它是每个核心在EC2计算单元(它们自己的相对度量)中的速度乘以核心数量。
亚马逊确实列出了每个实例类型有多少虚拟核心:
你最好的选择是使用所有的核心,正如其他人所指出的。然而,如果你最终采用单线程解决方案,那么你将需要关注各个核心的速度,而不是所有核心的总EC2计算单位。http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
是的,经过正确配置的apache/nginx将利用多CPU配置。正在开发可以利用这些配置的node.js服务器,详情请参见此处。在亚马逊上,需要程序支持多线程才能充分利用所有资源吗?
针对那些提出好观点的人,关于现代 Node.JS 的功能(旧帖子在这里),除了Node实现在V8和LibUV之上,并利用内部线程池外,你的JS代码实际上可以是多线程的。不仅仅是使用thread_workers API。很可能一些依赖项使用了C++ / V8 / NAPI绑定的JS并直接使用底层线程池。
例如: 您会发现npm上的标准bcrypt库是使用C ++中的多线程实现其blowfish实用程序。许多人没有正确阅读文档,因此对其他工作线程中库里的加密工作没有加速感到困惑。