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

10

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

  1. Erlang会比简单的Java慢多少(如果有差异)?
    我假设这里Java将比Erlang更快,因为从网上的基准测试结果来看,Erlang表现不佳。那么,在我的特定情况下,我需要多少个CPU才能使Erlang在单线程Java之上脱颖而出呢?

  2. 在了解Erlang一段时间后,我发现大多数大型Erlang系统都包含相当数量的C/C++代码。
    这是出于速度原因吗(我的想法),还是其他原因?即为什么需要这样做?

我了解到大多数计算机中处理器数量正在增加,线程模型变得困难(我同意),但我希望知道何时会"跨越界限",这样我就可以在正确的时候更改语言/范例。

一些背景/上下文信息:
我正在工作的是Java服务端,非常依赖于CPU,并且容易进行并行处理。这是因为通常一个单一的入站更新(通过TCP)会触发多个(100个)输出的更改。

计算通常非常简单(少量循环,大量算术运算),而且输入速度很快(每秒100次)。

目前我们正在4个CPU的机器上运行,并在每个机器上运行多个服务(因此多线程处理毫无意义,并且使用同步块等要求使其多线程化的操作会导致Java运行得更快)。现在有了加速的强烈推动力度,我们现在可以访问24个处理器的机器(如果需要,每个进程都可以拥有这些处理器),所以我想知道最佳方案是什么:是使用大规模多线程的Java,还是像Erlang这样更容易编码的语言。


2
我已经阅读了你的完整问题,并编辑了我的答案,为你提供一份讨论,让你看到决策的关键所在。 - Hassan Syed
5个回答

7
由于这是一个算术密集型工作量,而且您已经将代码拆分为单独的服务进程,所以使用Erlang不会带来太多好处。您的工作似乎很适合Java。Erlang擅长小事务--例如消息切换或提供静态或简单动态网页。并不是天生用于企业数值计算或数据库工作负载。
然而,您可以建立外部数值库和数据库,并使用Erlang作为MSG开关:D这就是couch-db所做的:P
- 编辑 -
1.如果您将算术操作移入Erlang异步IO驱动程序,则Erlang将与语言shoot-out stuff一样好--但使用24个CPU可能不会有太大影响;Erlang数据库是过程化的,因此非常快速--这可以在每个事务中更新100个实体时利用于您的应用程序。
2.Erlang运行时系统需要是C和C ++的混合,因为(a) Erlang仿真器是用C / C ++编写的(您必须从某个地方开始),(b)您必须与内核通信才能进行异步文件io和网络io,以及(c)系统的某些部分需要极快的速度,例如数据库系统的后端(Amnesia)。

-- 讨论 --

在一个6核 * 4 CPU拓扑结构中,使用共享内存总线,配备24个CPU,您将拥有4个NUMA实体(即CPU)和一个中央内存。您需要明智地选择范例,共享无内容多进程方法可能会损坏您的内存总线。

为了解决这个问题,您需要创建4个进程,每个进程有6个处理线程,并将每个处理线程绑定到相应的CPU中的相应核心。这6个线程需要进行协作式多线程处理--Erlang和Lua本质上都具备此功能--Erlang以硬核方式执行,因为它拥有完整的调度程序作为其运行时的一部分,可以使用它来创建任意数量的进程。

现在,如果您将任务分配给4个进程(每个物理CPU一个),您将是一个快乐的人,但是您正在运行4个Java VM,做着(可能是)严肃的工作(出于许多原因,这很糟糕)。这个问题需要通过更好的切片和切割问题来解决。

介绍Erlang OTP系统,它旨在设计冗余鲁棒的网络系统,但现在它也朝着同一机器NUMA-CPU的方向发展。它已经拥有一个强大的SMP模拟器,并且很快也将意识到NUMA。采用这种编程范式,您有更好的机会充分利用服务器的性能而不损坏总线。

也许这次讨论是理论性的,但当您获得8x8或16x8拓扑结构时,您也将准备好应对它。因此,我的答案是,当您的主板上有超过2个现代物理CPU时,您应该考虑更好的编程范式。

以下是一个主要产品的例子,遵循本文中的讨论: Microsoft的SQL Server在SQL-OS层面上实现了CPU级别的NUMA感知,数据库引擎就是基于此构建的。


6
你是否比较了购买新硬件和重新培训员工学习Erlang语言以及用新语言重新设计软件的成本呢?
我认为重新培训自己(或他人)以及雇佣熟悉Erlang语言的员工的费用不容小觑(相对于Java人员,这些人会更难找到)。服务器在存储成本、功耗、维护等方面肯定会产生费用,但它们仍然比合格的员工便宜得多。如果你能够在使用当前技能的同时取得进展并保持可扩展性,我认为这是最实用的方法。

17
有趣的是,我们尝试在公司内部进行再培训。我们在3周内组建了一个由4人组成的团队,让他们达到了(合理的?)Erlang速度。构建了一个仿真交易所系统,似乎已经足够证明了这一点。我个人认为,与寻找真正深入理解多线程编程及其陷阱的Java人才相比,重新培训的问题是无稽之谈(而我遇到的这类人非常少)。 - DaveC
7
我也同意DaveC的观点,一旦你开始使用Erlang……我相信它是自面包切片以来最棒的东西。尽管Java和C#内置了多编程的基本元素和惯用语法,但它们比C或C++不太适合多编程(即使你对这些语言也需要专家才能正确完成:/)。Erlang通过新的SMP beam使所有这些烦恼消失了,只要你的需求在提供的库范围内,或者你有开发人员为你提供缺失的内容,你就会看到Armstrong所大肆赞扬的10倍加速:D。 - Hassan Syed
6
我不同意Erlang很复杂或者它的源代码难以阅读。对于一个长期使用C语言的程序员来说,学习Java也并不比学习Erlang更加困难。通过一本书、几个视频教程和2-3周的学习,我已经开始为开源项目做出贡献和修改,并且已经开始进行与我们的Asterisk服务器连接的套接字编程等相当复杂的工作。关键是,如果员工无法学习新事物,那么你所谓的“合格员工”实际上并不合格。一个人不应该只是“Java程序员”,而应该是一个全面的程序员。 - Jon Gretar
2
@Brian Agnew:我并不是在说你有什么恶意。:) 但我认为,如果这些都是巨大的问题,那么你可能会面临更大的问题。这意味着你的公司是静态的,无法对手头的问题进行小的改变以最好地解决它们。对于一家公司来说,让几个程序员学习一门不同的语言的基础知识,既不应该成本高昂,也不应该难以实现。如果这是一个问题,那么你可能只是拥有不足够的程序员而已。哪家汽车修理店会雇佣一个只能修1985年道奇Ram的机械师呢? - Jon Gretar
2
@Jon - 是的,但是这个问题是有成本的(虽然很小)。这是你必须确定和考虑的事情(无论是购买一本OReilly书籍的费用,参加学习课程的费用,雇佣导师的费用,还是三周的生产力损失)。 - Brian Agnew
显示剩余4条评论

2
当涉及到编程语言速度的问题时,这个问题非常复杂。Java的支持者可以指出很多领域并声称是最快的,他们是100%正确的。Ruby / Python的支持者则会指向不同的参数并声称更快,他们也是正确的。然后,Erlang的支持者指出并发连接并声称在处理数百或数千个并发连接或计算时最快,他们也没有错。
从问题的基本描述来看,我认为Erlang非常适合您的需求。不知道细节,我会说这实际上是一个相当简单的Erlang程序,并且可以在很短的时间内完成。

0

这取决于几个因素。简单的答案是,您需要对每个不同的程序进行基准测试,以了解静默水印在哪里。

以下是可能影响效益比率的一些相关方面:

1)计算依赖性:如果逻辑流具有许多对外部资源(DBMS、磁盘访问、网络)的依赖关系。可在并发处理中分配的计算依赖性越高,采用Erlang等分布式计算平台的好处就越大。

2)逻辑流原子性:如果您的程序必须花费大量计算时间在单个顺序同步流控制上,并且无法将其分解为更小的逻辑代码段。您的代码原子性越大,它就越难以分解成CPU扩展流。

3)状态共享开销:要分布在各种函数之间的数据量越大,框架所需的开销就越高,仅用于传输和接收状态。换句话说,如果您重复发送大量数据而没有共享缓存区,则效益将降低,尽管这具有不同的方法,具体取决于采用的编程模式。

因此,考虑到基于上述标准的广泛可能性和变化,不可能有一个对所有情况都可接受的通用估计。

-6

如果你每秒钟得到100个请求,但每个请求需要100秒,那么它怎么可能跟得上呢?也许我误读了那部分内容,但无论如何,除非每秒有数千或数百万个请求,否则您的同步代码不应该花费太长时间。如果是这样,您可能做错了什么,可能在执行整个作业时锁定了某些东西。

对于多线程代码,使用更高级别的语言可能是一个错误。即使您将应用程序部分编写为Erlang或其他语言,多线程应该使用Java或者如果性能真正成为问题,则转移到C++。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接