【转载】关于 Erlang 和 SMP 的一些说明

以下是一些关于 Erlang SMP 实现细节、性能、伸缩性相关一些简单介绍。 

-=-=-=-=-=- 

      几周之内还有一个关于多核如何运作以及未来如何发展的更详细的介绍。我打算将一些内容放在我的报告中,将于 9 月 27 日的 ICFP2008,Erlang Workshop 在 Victoria BC 展示给大家。 
      没有 SMP 支持的 Erlang VM 只有 1 个运行在主处理线程中的调度器。该调度器从运行队列run-queue)中取出可以运行的 Erlang 进程以及 IO 任务,而且因为只有一个线程访问他们所以无须锁定任何数据。 而带有 SMP 支持的 Erlang VM 可以有一个或多个调度器,每个调度器运行在一个线程中。调度器从同一个公共运行队列中取出可运行的 Erlang 进程和 IO 任务。在 SMP VM 中所有的共享数据结构都会由锁进行保护,运行队列就是这样一个由锁保护的数据结构。 
      从 OTP R12B 开始,如果操作系统报告有多于 1 个的 CPU(或者核心),VM 的 SMP 版本会自动启动,并且根据 CPU 或者核心的数量启动同样数量的调度器。 
      你可以从“erl”命令打印出来的第一行看到它选择了哪些参数。例如: 

?


1

Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] ...

其中“[smp:4]”表示 SMP VM 运行了 4 个调度器。 
      默认值可以用“-smp [enable|disable|auto]”来替换,auto 是默认的。如果 smp 被启用了(-smp enable),要设置调度器的数量可以使用“+S Number”其中 Number 是调度器的数量(1 到 1024) 

注意1:运行多于 CPU 或核心总数的调度器不会有任何提升。 
注意2:在某些操作系统中一个进程可使用的 CPU 或者核心的数量可以被限制。例如,在 Linux 中,命令“taskset”就可以实现这个功能。Erlang VM 目前还只能探测 CPU 或者核心的总数,不会考虑“taskset”所设置的掩码。正因如此,例如可能会出现(已经出现过了)即使 Erlang VM 运行了 4 个调度器,也只使用了 2 个核心。OS 会进行限制因为它要考虑“taskset”所设置的掩码。 

每个 Erlang VM 的调度器都运行于一个 OS 线程上,是 OS 来决定线程是否执行在不同的核心上。一般来说 OS 会很好地处理这个问题并且会保证线程在执行期间运行于同一个核心上。 
Erlang 进程会被不同的调度器运行,因为他们是从一个公共运行队列中被取出,由首先可用的调度器运行。 

性能和伸缩性 

      只有一个调度器的 SMP VM 要比非 SMP 的 VM 稍微慢那么一点点。SMP VM 内部需要用到各种锁,不过只要不存在锁的争用,那么由锁引起的开销不会非常大(就是锁争用上面需要花时间)。这也解释了为何在某些情况下,运行多个只有一个调度器的 SMP VM 要比包含多个调度器的单一 SMP VM 更加高效。当然,运行多个 VM 要求应用可以按照多个并行任务的方式运行,并且之间没有或者几乎不通讯。 

      一个程序是否能在多核上的 SMP VM 中良好地进行提升很大程度上取决于程序的性质,某些程序可以保持线性提升至 8 核甚至 16 核,同时其他某些程序基本不能提升,连 2 核都不行。实际应用中很多程序都能在主流市场的核心数上得到提升,见下文。 

      若并行的持续“通话”由每个核心一个或多个 Erlang 进程来表示,实际的支持大量通话的电信产品已经显现出在双核和四核处理器上不俗的伸缩性。注意,这些产品是在 SMP VM 和多核处理器出现很久以前按照普通的 Erlang 风格来写的,他们也能无须任何修改甚至不需重新编译代码就能从 Erlang SMP VM 中获益。 

SMP性能得到持续改进 

SMP 实现正被不断改进以便能得到更好的性能和伸缩性。在每个服务发布版 R12B-1,2,3,4,5…,R13B 等等中,你都能发现新的优化。 

一些已知的瓶颈 

      单一的常见运行队列随着 CPU 或核心的数量的增加会成为一个显著的瓶颈。 这从 4 核开始往上就会显现出来,不过 4 核仍然可以为多数应用程序提供不错的性能。我们正在从事一个每个调度器一个运行队列的解决方法作为目前最重要的改进。 
      Ets 表格会引入锁。在 R12B-4 之前在每次对一个 ets-table 的访问中会用到两个锁,但是在 R12B-4 中 meta-table 的锁被优化过,可以显著减少争用(前面已经提到争用是有很大代价的)。如果很多 Erlang 进程访问同一个表格,就会有很多锁争用造成性能降低,尤其当这些进程主要工作是访问 ets-table 。锁存在于表级而非记录级注意!这也会影响到 Mnesia ,因为 Mnesia 用到了很多 ets-table 。 

我们关于SMP的策略 

      当我们开始实现 SMP VM 的最初,我们就确定了策略:“首先让它可以运行,然后测量,然后优化”。自从 2006 年五月我们发布了第一个稳定的 SMP VM(R11B)以来,我们一直遵循着这个策略。 
      还有更多已知的东西可以改进,我们会按照性能的收益大小先后各个击破。 
      我们将主要的精力放在多核(大于 4)上更好的连续伸缩性上。 

卓越典范 

      即使 SMP 系统有还有一些已知的瓶颈不过已经有不错的整体性能和伸缩性,同时我相信在让程序员利用多核机器事半功倍方面,我们是一个卓越的典范。 

原文:http://groups.google.com/group/erlang-questions/browse_thread/thread/7827f5e32681ca8e   

时间: 2024-10-03 16:35:20

【转载】关于 Erlang 和 SMP 的一些说明的相关文章

【转载】erlang 进程的 hibernate

简单的理解:   hibernate 可以令处于 idle 状态的 erlang 进程马上进行 gc,因为进程处于 receive 状态下是不会 gc 的. 在性能调优时发现,gc 对于消息发送速度的影响还是非常大的. 关于 erlang gc 问题也可以参看这个  Recently, as part of RabbitMQ server development, we ran into an interesting issue regarding Erlang's per-process ga

【转载】erlang 如何自定义 behaviour

什么是 behaviour ? 使用 erlang 编程的人都知道 OTP,而基于 OTP 框架创建进程的时候,常用的有四大 behaviour:  supervisor gen_server gen_fsm gen_event 那么什么是 behaviour?是做什么用的呢?        首先,写这篇文章之前我上谷歌查过人家对 behaviour 的定义,当然,是非官方定义,我一直没找着官方定义,如果有人有一个比较确切的定义,麻烦告诉我,大家共同学习嘛.       在 StackOverF

【转载】Syntax Highlighing for Erlang in NotePad++

Update: The definition has been updated to include support for atoms, variables and function names as well as additional file extensions.  Screen shot and downloadable content have been updated. Thus far I've done all of my Erlang development on Fedo

【转载】低成本和高性能的MySQL云数据库的实现淘宝 MySQL

低成本和高性能的MySQL云数据库的实现 作者: 鸣嵩/曹伟(集团技术专家) 本文刊登于<程序员>杂志2012年12期上,转载请注明         UMP(Unified MySQL Platform)系统是淘宝核心系统数据库团队开发的低成本和高性能的MySQL云数据方案,关键模块采用Erlang语言实现.系统中包含了controller服务器.proxy服务器.agent服务器.API/Web服务器.日志分析服务器.信息统计服务器等组件,并且依赖于Mnesia.LVS.RabbitMQ.Z

smp,numa和mpp体系结构总结

结构体系 SMP NUMA  MPP 说明 (Symmetric Multi-Processor)对称多处理系统(UMA:Uniform Memory Access) 一致存储器访问结构 (Non-Uniform Memory Access)非统一内存访问 (Massive Parallel Processing)大规模并行处理 技术特点 性能的提升依赖于cpu的速度.容易产生瓶颈.  难以实现,特别是交叉开关.(这也是为什么大型机一直被IBM等垄断)  益于实现,可使用廉价设备部署.重点在于软

erlang远程调用示例

下面的例子试用了erlang的分布式编程,从中可以看出像erlang这种基于消息的纯函数语言在分布式编程中的强大威力. 简单例子 在远程节点编写一个测试的模块 -module(distribution). -export([a/0]). a() ->     hello. 首先启动远程节点,并设置cookie,载入模块 $ erl -name remote -setcookie abc Erlang R16B03 (erts-5.10.4) [source] [64-bit] [async-th

【原创】Erlang 之 erl_crash.dump 生成

-=-=-=-=- 我是<我是歌手 >的分隔线 -=-=-=-=-  (以下为原文引用)        crashdump 对于 erlang 的系统来讲如同 core 对于 c/c++ 程序一样宝贵,对于系统问题的修复提供了最详细的资料.当然 erlang 很贴心了提供了网页版的 crashdump_view 帮助用户解读数据,使用方法如下: crashdump_viewer:start().       因为 crashdump 文本文件里面记录了大量系统相关的信息,这些信息对于分析系统的

Erlang open_port极度影响性能的因素

问题描述 Erlang的port相当于系统的IO,打开了Erlang世界通往外界的通道,可以很方便的执行外部程序. 但是open_port的性能对整个系统来讲非常的重要,我就带领大家看看open_port影响性能的因素.首先**open_port的文档: {spawn, Command} Starts an external program. Command is the name of the external program which will be run. Command runs o

研究Erlang 4000小时以后

问题描述 历经2年半,花了4000小时以后,对erlang的研究有了很大的进步,从原来的兴趣, 到现在的随意的crack, 调优,改进, 指导erlang程序架构的设计,中间经历了很多. 从一个有20年历史的网络程序身上我学到很多,包括高级服务器程序的架构,调度公平性,网络事件处理, 内存**, 锁**, SMP**, 平台移植, 虚拟机,语言的基本构件,用户交互,调试, 诊断, 调优,工具. 也学会了使用OS提供的工具如**tap, oprofile,内存, CPU工具来诊断,来定位问题,这个