Dav*_*veC 10 java erlang performance multithreading multicore
我目前正在使用Java,我在网上读了很多关于Erlang的内容,我有两大问题:
Erlang会比简单的Java慢多少(如果有的话)?
我在这里假设Java将从网络上的枪战基准更快(Erlang不那么好).那么,我需要多少CPU才能让Erlang超越单线程Java(在我的特殊情况下,如下所示)?
在阅读了有关Erlang一段时间之后,我发表了大量评论/帖子,说大多数大型Erlang系统包含大量的C/C++.
这是出于速度原因(我的假设)还是别的什么?即为什么需要这个?
我已经读过大多数机器的处理器数量上升和线程模型很难(我同意)但是我想找出什么时候会越过"线"以便我可以在右边改变语言/范例时间.
一些背景/上下文:
我在Java服务上使用服务器端,这些服务非常受CPU限制并且很容易并行.这通常是由于单个传入更新(通过TCP)触发对多个(100个)输出的更改.
计算通常非常简单(几个循环,只需很多算术),输入速度非常快(100/s).
目前,我们在4台CPU机器上运行,并在每台机器上运行多项服务(因此多线程非常无意义,Java似乎运行得更快,没有同步块等,使其成为多线程).现在有一个强大的速度推动,我们现在可以访问24台处理器机器(如果需要,每个进程),所以我想知道如何最好地继续 - 大规模多线程Java或更容易编码的东西,如Erlang.
因为这是一个算术繁重的工作负载,并且你已经完成了将代码拆分成单独的服务进程的工作,所以你不会从Erlang中获得太多收益.你的工作似乎很适合Java.Erlang擅长微小交易 - 例如msg切换或提供静态或简单动态的网页.不是 - 在企业数字运算或数据库工作负载方面.
但是,您可以在外部数值库和数据库的基础上构建并使用Erlang作为MSG开关:D这就是couch-db所做的:P
- 编辑 -
如果你将你的算术运算转移到一个Erlang async-IO驱动程序中,那么erlang和语言输出的东西一样好 - 但是有24个cpu可能并不重要; erlang数据库是程序性的,因此非常快 - 这可以在您的应用程序中利用,在每个事务上更新100个实体.
erlang运行时系统需要是C和C++的混合,因为(a)erlang模拟器是用C/C++编写的(你必须从某处开始),(b)你必须与内核交谈来做异步文件io和网络io,以及(c)系统的某些部分需要快速起泡 - 例如,数据库系统的后端(失忆症).
- 讨论 -
使用共享内存总线的6核*4 CPU拓扑中的24个CPU - 您有4个NUMA实体(CPU)和一个中央内存.你需要对范式有所了解,无共享的多进程方法可能会扼杀你的记忆.
要解决这个问题,您需要创建4个具有6个处理线程的进程,并将每个处理线程绑定到相应CPU中的相应核心.这6个线程需要进行协作多线程 - Erlang和Lua天生就有这个 - Erlang以硬核方式完成它,因为它有一个完整的调度程序作为其运行时的一部分,它可以用来创建尽可能多的你想要的过程.
现在,如果你要在4个进程中划分任务(每个物理CPU 1个),那么你将是一个快乐的人,但是你正在运行4个Java VM正在做(可能是)认真的工作(因为很多原因而烦恼).需要通过更好的切割和切割问题的能力来解决问题.
在Erlang OTP系统中,它是为冗余的强大网络系统而设计的,但现在它正朝着同一台机器的NUMA-esque CPU发展.它已经有一个kick-ass SMP模拟器,很快就会成为NUMA.使用这种编程模式,您可以更好地使强大的服务器饱和而不会终止您的总线.
也许这个讨论是理论上的; 但是,当您获得8x8或16x8拓扑时,您也可以使用它.所以我的答案是当你的主板上有超过2个 - 现代 - 物理CPU时,你应该考虑一个更好的编程范例.
作为此后讨论的主要产品的示例:Microsoft的SQL Server在构建数据库引擎的SQL-OS层中具有CPU级NUMA感知功能.
您是否比较了新硬件的成本与Erlang中再培训员工的成本以及用新语言重新构建软件的成本?
我不会低估自己再培训(或其他),并雇人在二郎精通(谁是要成为一个成本的支出很多很难找到比Java的人).服务器显然在存储成本/电力/维护等方面成本很高,但它们仍然比合格的员工便宜很多.如果您可以在使用当前技能组合的同时取得进步并保持可扩展性,我怀疑这是最实用的方法.