[英]CPU utilization of Node.js on Amazon EC2
看看节点是如何单线程的,如果我在具有4个EC2计算单元的亚马逊EC2实例上运行节点服务器,它将比我有2个EC2计算单元运行更快/处理更多负载吗?
亚马逊的CPU利用率是否需要多线程程序才能完全使用所有资源?
要充分利用N个核心的计算资源,您至少需要N个线程才能完成有用的工作。 这与EC2无关; 这就是计算机的工作方式。 我假设您在m1.medium
和m1.large
实例类型之间进行选择,它们分别具有1个和2个专用内核( m1.small
是共享内核的一半, m1.xlarge
是完整的专用4芯盒)。 因此,您需要至少2个进程执行有用的工作才能使用更大的框(除非您只是想访问更多的内存/ io)。
每个Node.js进程都是单线程设计。 这使它提供了一个没有锁定语义的干净编程范例。 这非常符合设计。
要使Node.js应用程序使用多个核心,它必须生成多个进程。 然后,这些进程将使用某种形式的消息传递(管道,套接字等)进行通信 - 而不是“共享内存”,其中代码可以直接改变多个进程可见的内存位置,这需要锁定语义。
在实践中,这很容易设置。 回到Node.JS v0.6.X中,“集群”模块已集成到标准发行版中,从而可以轻松设置可以在单个端口上侦听的多个节点工作程序。 请注意,此“群集”模块与learnboost“群集”模块不同,后者具有不同的API并且在NPMjs注册表中拥有“群集”名称。
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来分叉节点进程,以便您可以利用多个CPU(核心): https : //nodejs.org/docs/latest/api/cluster.html 。 如果您以这种方式编写代码,那么拥有更多计算单元将对您有所帮助。
有一点需要注意,EC2计算单元是按实例详细说明的。 对于某些情况,您可以为每个虚拟核心获得更多“计算单位”。 因此,如果您选择每个虚拟核心具有2个计算单元的实例而不是每个核心具有一个 计算单元的实例,则您将能够在具有更多计算单元的CPU上执行节点。 但是,看起来在2个计算单元之后, 每个核心的计算能力被分割,这意味着您将无法从多个核心中获得任何好处。
亚马逊对实例类型的总“EC2计算单元”的概念不直接映射到CPU或核心。 它是核心数量乘以EC2计算单位中每个核心的速度(它们自己的相对测量值)。
亚马逊确实列出了每种实例类型具有的虚拟核心数:
http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html
您最好的选择是使用所有核心,正如其他人指出的那样。 但是,如果您最终使用单线程解决方案,那么您将需要关注单个核心的速度,而不是所有核心的EC2计算单元总数。
如果我在具有4个EC2计算单元的亚马逊EC2实例上运行节点服务器,它将比我有2个EC2计算单元运行更快/处理更多负载吗?
不,如果您在服务器容量中使用node.js,则只能访问单个核心。
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/');
产生一个单一的监听器,但这并不意味着只有一个连接。 Node.js以这种方式打破了传统思维。 除非您编码不正确,否则事件循环不会阻止连接。 这篇文章有助于解释事件循环以及理解它的重要性。 花了一些时间来真正“理解”这些含义。
亚马逊的CPU利用率是否需要多线程程序才能完全使用所有资源?
是的,正确配置的apache / nginx将利用多CPU配置。 正在开发 node.js服务器,它们也将利用这些配置。
在Node.js中, 您的代码是单线程的,但是例如访问文件系统或数据库服务器的调用不使用主node.js线程。 主线程继续执行,而其他线程正在等待4GB从磁盘读取到RAM或DB服务器返回响应。 一旦操作完成,提供的回调就被放入队列中以在主线程中执行。 或多或少,无论如何。
优点是在服务器情况下,您有一个非常快的线程,可以处理数千个并发请求,而不会完全保留任何一个请求或为每个客户端请求 - 响应周期生成OS线程。
更重要的是,您应该在EC2上对特定用例进行基准测试 - 如果应用程序执行大量IO,则在运行单个节点实例时,多个处理器可能很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.