ntk*_*hov 20 amazon-ec2 node.js
看看节点是如何单线程的,如果我在具有4个EC2计算单元的亚马逊EC2实例上运行节点服务器,它将比我有2个EC2计算单元更快/处理更多负载吗?
亚马逊的CPU利用率是否需要多线程程序才能完全使用所有资源?
Dav*_*son 18
要充分利用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);
}
Run Code Online (Sandbox Code Playgroud)
hro*_*oss 12
对你的问题的简短回答是,如果你所做的只是编写"标准"单线程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计算单元总数.
归档时间: |
|
查看次数: |
8219 次 |
最近记录: |