有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. Erlang比简单Java慢多少(如果有的话)
    我在这里假设Java从网络上的shootout benchmarks开始会更快(Erlang做得不太好)。那么,我还需要多少CPU才能让Erlang超越单线程Java(在我的特定情况下,如下所示)

  2. 在阅读了一段关于Erlang的文章后,我发现了一些评论/帖子,其中说大多数大型Erlang系统都包含大量的C/C++
    这是出于速度原因(我的假设)还是其他原因?i、 e.为什么需要这样做

我已经读过关于大多数机器中处理器数量的上升和线程模型的困难(我同意),但我希望找出何时会跨越“界限”,以便我能在正确的时间改变语言/范式

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

计算通常非常简单(很少循环,只是很多算术运算),输入速度非常快(100/s)

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


共 (5) 个答案

  1. # 1 楼答案

    由于这是一个算术上繁重的工作负载,并且您已经完成了将代码拆分为单独的服务进程的工作,因此您不会从Erlang中获得太多好处。你的工作似乎很适合你。Erlang擅长于微小的事务——比如消息交换或服务静态或简单的动态网页。不是——在企业数字处理或数据库工作负载方面

    但是,您可以在外部数字库和数据库的基础上构建,并将Erlang用作MSG开关:D这就是Coach db的功能:p

    --编辑--

    1. 如果您将算术运算转移到Erlang异步IO驱动程序中,Erlang将与语言射击一样好——但是使用24个cpu可能不会有多大关系;erlang数据库是程序化的,而且速度非常快——可以在应用程序中利用它在每个事务上更新100个实体

    2. < P> Erlang运行时系统需要混合C和C++,因为(a)Erlang仿真器是用C/C++编写的(你必须从某处开始),(b)你必须和内核对话,以做异步文件IO和网络IO,(c)系统的某些部分需要快速起泡——例如数据库系统的后端(失忆)。p>

    --讨论--

    使用共享内存总线的6核*4 CPU拓扑中有24个CPU——您有4个NUMA实体(CPU)和一个中央内存。您需要对该范例保持明智,无共享多进程方法可能会扼杀您的内存总线

    要解决这个问题,您需要创建4个进程和6个处理线程,并将每个处理线程绑定到相应CPU中的相应内核。这6个线程需要执行协作多线程——Erlang和Lua天生就是这样——Erlang以一种硬核的方式执行,因为它有一个完整的调度程序作为其运行时的一部分,可以用来创建任意多个进程

    现在,如果您将任务划分为4个进程(每个物理CPU 1个),您将是一个快乐的人,但是您正在运行4个Java虚拟机(可能是)进行严肃的工作(很糟糕,原因很多)。这个问题需要用更好的切分能力来解决

    在Erlang OTP系统中,它是为冗余健壮的网络系统而设计的,但现在它正朝着同样的机器NUMA风格的CPU发展。它已经有了一个一流的SMP仿真器,并且很快也会变得NUMA感知。有了这种编程模式,您就有更好的机会在不破坏总线的情况下使强大的服务器饱和

    也许这种讨论是理论上的;但是,当您获得8x8或16x8拓扑时,您也将做好准备<所以,我的答案是,当你在主板上拥有更多的2——现代-物理CPU时,你应该考虑一个更好的编程范例。强>

    作为下面讨论的主要产品的一个示例:Microsoft's SQL Server is CPU-Level NUMA-aware in the SQL-OS layer,数据库引擎是在其上构建的

  2. # 2 楼答案

    您是否比较了新硬件的成本与在Erlang重新培训员工以及用新语言重新设计软件的成本

    我不会低估再培训自己(或他人)的费用,也不会低估雇佣熟悉Erlang的人(他们将比Java人更难找到)的成本。服务器在存储成本/电源/维护等方面的成本很明显,但它们仍然比合格的员工便宜得多。如果你能在使用现有技能的同时取得进步并保持可扩展性,我认为这是最务实的方法

  3. # 3 楼答案

    编程语言的速度问题是一个问题所能解决的最复杂的问题。Java倡导者可以指出许多领域,并声称自己是最快的,而且他们是100%正确的。Ruby/Python的倡导者指出了一组不同的参数,并声称速度更快,而且也是正确的。然后,Erlang的拥护者指出并发连接,并声称在处理数百或数千个并发连接或计算时速度最快,这也不会错

    查看有关项目的基本描述,我觉得Erlang非常适合您的需要。不知道细节,我会说这实际上是一个非常简单的Erlang程序,可以在很短的时间内完成

  4. # 4 楼答案

    这取决于几个因素。快速的答案是,您需要对每个不同的程序进行基准测试,以了解静止水印的位置

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

    1)计算依赖性:如果逻辑流对外部资源(DBMS、磁盘访问、网络)有许多依赖性。并发处理中可划分的计算依赖项越多,采用诸如erlang之类的分布式计算平台的好处就越大

    2)逻辑流原子性:如果您的程序必须在单个顺序同步流控制上花费大量的计算时间,并且不能在较小的逻辑代码段上进行分解。代码原子性越大,分解为CPU扩展流的代码就越少

    3)状态共享开销:必须分布在各个功能中的数据量越大,框架仅发送和接收状态所需的开销就越高。换言之,如果重复发送大量数据而不使用公共共享缓存区,好处将减少,尽管根据采用的编程模式不同,这有不同的方法

    因此,考虑到基于上述标准的巨大可能性和变化,不可能有一个适用于所有场景的通用估计

  5. # 5 楼答案

    如果你每秒有100次,但他们每次都有100次,那怎么可能保持下去呢?也许我误读了这一部分,但无论如何,除非每秒有数千或数百万个请求,否则您的同步代码不会花费太长时间。如果是,则表示您做错了,可能是在执行整个作业或其他操作时锁定了

    对于多线程代码,使用更高级的语言可能是一个错误。即使你在Erlang中编写应用程序部分,或者多线程应该是java,或者移动到C++,如果性能真的成为问题。p>