在Erlang比单线程Java更快之前需要多少CPU

Dav*_*veC 10 java erlang performance multithreading multicore

我目前正在使用Java,我在网上读了很多关于Erlang的内容,我有两大问题:

  1. Erlang会比简单的Java慢多少(如果有的话)?
    我在这里假设Java将从网络上的枪战基准更快(Erlang不那么好).那么,我需要多少CPU才能让Erlang超越单线程Java(在我的特殊情况下,如下所示)?

  2. 在阅读了有关Erlang一段时间之后,我发表了大量评论/帖子,说大多数大型Erlang系统包含大量的C/C++.
    这是出于速度原因(我的假设)还是别的什么?即为什么需要这个?

我已经读过大多数机器的处理器数量上升和线程模型很难(我同意)但是我想找出什么时候会越过"线"以便我可以在右边改变语言/范例时间.

一些背景/上下文:
我在Java服务上使用服务器端,这些服务非常受CPU限制并且很容易并行.这通常是由于单个传入更新(通过TCP)触发对多个(100个)输出的更改.

计算通常非常简单(几个循环,只需很多算术),输入速度非常快(100/s).

目前,我们在4台CPU机器上运行,并在每台机器上运行多项服务(因此多线程非常无意义,Java似乎运行得更快,没有同步块等,使其成为多线程).现在有一个强大的速度推动,我们现在可以访问24台处理器机器(如果需要,每个进程),所以我想知道如何最好地继续 - 大规模多线程Java或更容易编码的东西,如Erlang.

Has*_*yed 7

因为这是一个算术繁重的工作负载,并且你已经完成了将代码拆分成单独的服务进程的工作,所以你不会从Erlang中获得太多收益.你的工作似乎很适合Java.Erlang擅长微小交易 - 例如msg切换或提供静态或简单动态的网页.不是 - 在企业数字运算或数据库工作负载方面.

但是,您可以在外部数值库和数据库的基础上构建并使用Erlang作为MSG开关:D这就是couch-db所做的:P

- 编辑 -

  1. 如果你将你的算术运算转移到一个Erlang async-IO驱动程序中,那么erlang和语言输出的东西一样好 - 但是有24个cpu可能并不重要; erlang数据库是程序性的,因此非常快 - 这可以在您的应用程序中利用,在每个事务上更新100个实体.

  2. 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感知功能.


Bri*_*new 6

您是否比较了新硬件的成本与Erlang中再培训员工的成本以及用新语言重新构建软件的成本?

我不会低估自己再培训(或其他),并雇人在二郎精通(谁是要成为一个成本的支出很多很难找到比Java的人).服务器显然在存储成本/电力/维护等方面成本很高,但它们仍然比合格的员工便宜很多.如果您可以在使用当前技能组合的同时取得进步并保持可扩展性,我怀疑这是最实用的方法.

  • 有趣的是,我们尝试了内部再培训.我们在3周内与Erlang组建了一支4人达到(合理?)速度的团队.建立了一个模拟交易交易系统,似乎足以证明这一点.我个人认为再培训问题是FUD与让人们真正深入理解多线程编程及其陷阱(其中我遇到的很少)的人相比. (17认同)
  • 我同意DaveC,一旦你和Erlang一起滚动......我相信这是切片面包以来最好的东西.Java和C#,即使它们已经内置了用于多编程的原语和习惯用法 - 它不太适合C或C++(并且你需要大师用这些语言正确地完成它:/).Erlang使用新的SMP光束消除了所有这些废话 - 并且提供了您所需的库中的需求,或者您让开发人员贡献您所缺少的东西 - 您将看到Armstrong赞扬的10倍加速:D (7认同)
  • 我不得不反对Erlang是复杂的,或者它的来源难以阅读.对于很长一段时间的C程序员来说,第一次看Java是困难的.在一本书,一些截屏和2-3周后,我已经开始为开源项目提供补丁和更改.我已经开始使用连接到我们的Asterisk服务器的套接字编程做一些相当复杂的事情.关键在于,如果他们无法学习新事物,那么你所谓的"合格员工"就没有资格.一个人不应该是"Java程序员"而只是程序员. (6认同)
  • @Brian Agnew:我并没有声称你参加了某种FUD任务.:)但我会说,如果这些是巨大的问题,那么你可能会遇到更大的问题.这意味着您的公司是静态的,无法进行微小的更改以最好地解决手头的问题.对于公司来说,让一些程序员学习不同语言的基础知识并不是一件昂贵的事情.如果这是一个问题,那么你可能只是说程序员不够.什么汽车修理厂会雇用一个只能与1985年道奇公羊合作的机械师? (2认同)
  • @Jon - 是的,但*有*与此相关的成本(无论多么微小).这是你必须确定和考虑的事情(无论是OReilly书的成本,学习课程,雇用导师,还是3个人工作周的生产力损失). (2认同)