狠狠撸

狠狠撸Share a Scribd company logo
Inside the Erlang VM


   Yu Feng
   mryufeng@gmail.com
   2008/12/20
   blog: http://mryufeng.javaeye.com
BEAM 的优势

?   高性能
?   多核心 SMP 的支持
?   透明分布的支持
?   轻量进程的支持
?   完善的监控信息
?   商业产物上经过时间的验证成熟
为什么其他语言要移植到 Erlang 虚拟
机
? 语言 Reia 会成功吗
? 作者看中什么?
 o   框架
 o   概念
 o   成熟度
 o   性能
 o   模型
ERTS 的代码规模

? 200K 行 C 代码 几千行 Erlang 代码
 o   同等的 ACE 框架
? 代码成熟度
? 尺寸很小 适合于嵌入式
 o   1.5M
? 也适合做桌面程序 如 p2p
ERTS 的物理结构
                                     tty_sl
                                     ram_file_drvzl
                                     ib_drv
                                     udp_inet
                          emulator
                                     tcp_inet
                          driver
            beam                     efile
? erlexec                 sys
            beam.smp                 async
                          utilts
? escript   beam.hybird
? …


                                     unix
                                     windows
                                     …
BEAM 的分类

? BEAM 分成不同版本的目的是提高性能 避免
  不必要的开销
? beam.plain
? beam.smp
? beam.hybrid ( 目前支持的不好 )
ERTS 启动过程

?   概念模拟操作系统
?   erl_exec
?   系统资源初始化
?   erl_first_process_otp opt_ring0
?   转入 Erlang 进程调度 开始执行 init:boot
ERTS 是个典型的网络服务器框架

? IO 处理
 o   kernel poll 如 epoll kqueue
? 定时器处理
 o   timewheel
? 逻辑处理处理
 o   process
      ? coroutine
      ? fiber
 o   smp
强大的 PORT

? 仿照 Unix 的哲学 : 一切都是文件
? 管道通讯类似 CGI
? 支持可执行文件和动态库
   o fd_driver_entry vanilla_driver_entry spawn_driver_entry
? kernel poll 支持大量的句柄
   o 高度优化的 kpoll
       ? {lazy_updates,true},
         {pending_updates,0},
         {batch_updates,false},
         {concurrent_updates,true},
定时器

? 支持 time jump detection and correction
? Erlang 使用 timer 有 3 种方式:
  o   语法层面的 receive ... after ...
  o   BIF: erlang:send_after(Time, Dest, Msg)
      erlang:start_timer(Time, Dest, Msg)
  o   driver 层面的。
      ?? int driver_set_timer(ErlDrvPort port, unsigned long time);
SMP

? 参见 EUC_SMP
 o   http://www.erlang.se/euc/08/euc_smp.pdf
多处理器利用技术

? 线程
 o   调度器
 o   异步线程
 o   driver 发起的线程
? 精巧的锁
     ? process_lock
     ? 快速的 mutex
? 进程
 o   PORT 管道通讯
虚拟机部分

? 基于 register
? JIT
  o   Hipe native 代码执行 效率高好多
  o   语言速度评测中表现不俗
? opcode
  o   R12B 大概 200 条 goto 和 case 优化
  o   arithmetic, comparsions and boolean logic; manipulating
      strings, tuples and lists; stack and heap allocation and
      freeing; type tests for Erlang primitives (numbers, lists,
      process IDs, references, and so on); jumps, structured
      exception handling, and calls and returns; sending messages
      and reading from the process' mailbox; waiting and timeouts
系统调度
? 处理 timer 超时
? 处理子进程退出的情况
? 处理 port_task 事件,也就是 port 的 IO 事件
  o port_task 独立调度 有自己的调度队列
? 如果没有活跃的进程 就 sys_schdule 阻塞在底层的 IO
  中。
     ? check_io
? 根据 process 的优先级选出一个进程来调度。
  o PRIORITY_MAX
  o PRIORITY_HIGH
  o PRIORITY_NORMAL
  o PRIORITY_LOW
  o PRIORITY_LEVELS
数据结构

? 用地址来区分数据类型
? pid <X, Y, Z>
? atom
   o     index 表示
   o     cache 传送的是 index
? binary bitstring
   o     非常高效 静态分析 opcode 执行
   o     非线性处理
? list
   o     单链表 表头加入
? tuple
   o     相当于数组
bitstring 非线性数据处理

?   和 scatter read, gather write 配对
?   静态分析 opcode 实现 bitstring 操作
?   减少内存搬动 大大提高操作效率
?   对程序员透明
消息传递

? 高效 compat
? 内部格式
? 外部格式
 o   erts/emulator/internal_doc/erl_ext_dist.txt 描述了 erlang ext
     term 的格式 , epmd 通讯的流程协议和流程 同时还要 node
     间通讯的协议 PID 变换
 o   pid {X,Y,Z} 在发到网络的时候发出去的格式是 {sysname, Y,
     Z}
     因为节点之前互相联系过 所以互相知道对方的 sysname, 而
     且 sysname 在 dist_entry 里保存,当对端收到 dec_pid 的时
     候,用 peer sysname 的查到在自己 dist_entry 里面的索引,
     然后用这个 index 来构造新的 pid ,即 {index, Y, Z} 。
内存分配器
?   每个 CPU 一个内存池
?   自动配置
?   有 200 多个 alloc type
?   private Heap, hybrid heap
?   binary_alloc
?   std_alloc
?   ets_alloc
?   fix_alloc
?   eheap_alloc
?   ll_alloc
?   mseg_alloc
?   sl_alloc
?   temp_alloc
?   sys_alloc
信号处理

? SIGCHLD
? 用户信号
? 异步处理和 poll 结合
驱动程序

? 完善的驱动程序开发接口 甚至可以多线程编程
? 文件驱动
 o   异步操作
? inet_drv 实现网络底层服务 如 tcp udp sctp
 o   丰富的 socket 选项
 o   支持常见的消息编解码
      ? HTTP CDR ASN.1 等
 o   scatter read, gather write
 o   消息接收变通提高效率
异步线程

? 完成驱动程序耗时操作
? 和调度器不相干
BIF trap 机制
  ? distribution trap functions
      o dsend2_trap
      o dsend3_trap
      o dsend_nosuspend_trap
      o dlink_trap
      o dunlink_trap
      o dmonitor_node_trap
      o dgroup_leader_trap dexit_trap
      o dmonitor_p_trap
if the emulator wants to perform a distributed commandand%% a
connection is not established to the actual node the following %%
functions is called in order to set up the connection and then %%
reactivate the command.
透明分布
? 需要 net_kernel 的协助
? group_leader 的设计和用途
? 可替换的传输介质
  o   inet_tcp_dist
  o   inet_ssl_dist
? dist trap 透明的进行握手动作
  o   connect and handshake
? 名称登记和维护
  o   local
  o   global
? 维护网络全联通
  o   net tick
  o   nodeup nodedown
  o   erlsnoop 查看交互
beam 加载和代码的热部署

? 支持代码从 archive,inet,file 里面读取 实现无
  盘工作站
? 最小系统需要的 beam preload
   ? otp_ring0 init prim_inet prim_file zlib prim_zip
     erl_prim_loader erlang
? Erlang 的热部署包括 beam(.beam) 级别的和
  driver(.dll .so) 级别的 .
对系统的干预

?   内置强大的 shell
?   CTRL+C
?   动态改变调度器的数目
?   crash dumps
异常处理

? 语法层面的实现
 o   link monitor
? 详尽的日志 完善的日志系统
 o   error_logger
? port 是进程隔离的
自省机制

?   trace
?   system_flag
?   system_info
?   system_profile
?   system_monitor
?   erts_debug
?   the erlang crash dumps
ETS 内存数据库

? hash 和 tree
? match VM instruction
? 不参与 GC
GC

? 不能保证 real time, 特别是 root set 比较大的时
  候
? mark-and-sweep copying collector
? 分代算法 2 代
 o   old_heap heap
稳定性

? heart 心跳检查 自动加载
? process crash 不会影响整个虚拟机
? 代码可热升级 容易修复 bug 回滚功能
平台移植

? Windows
  o   ( smp 支持的不好)
? Unix
? 关键语义屏蔽平台变化
Tips: 小心参数设置

? 大量的参数可以通过环境变量来配置
? 进程数目
? 最大文件句柄数
谢谢大家


       Q&A

More Related Content

Inside the Erlang Vm

  • 1. Inside the Erlang VM Yu Feng mryufeng@gmail.com 2008/12/20 blog: http://mryufeng.javaeye.com
  • 2. BEAM 的优势 ? 高性能 ? 多核心 SMP 的支持 ? 透明分布的支持 ? 轻量进程的支持 ? 完善的监控信息 ? 商业产物上经过时间的验证成熟
  • 3. 为什么其他语言要移植到 Erlang 虚拟 机 ? 语言 Reia 会成功吗 ? 作者看中什么? o 框架 o 概念 o 成熟度 o 性能 o 模型
  • 4. ERTS 的代码规模 ? 200K 行 C 代码 几千行 Erlang 代码 o 同等的 ACE 框架 ? 代码成熟度 ? 尺寸很小 适合于嵌入式 o 1.5M ? 也适合做桌面程序 如 p2p
  • 5. ERTS 的物理结构 tty_sl ram_file_drvzl ib_drv udp_inet emulator tcp_inet driver beam efile ? erlexec sys beam.smp async utilts ? escript beam.hybird ? … unix windows …
  • 6. BEAM 的分类 ? BEAM 分成不同版本的目的是提高性能 避免 不必要的开销 ? beam.plain ? beam.smp ? beam.hybrid ( 目前支持的不好 )
  • 7. ERTS 启动过程 ? 概念模拟操作系统 ? erl_exec ? 系统资源初始化 ? erl_first_process_otp opt_ring0 ? 转入 Erlang 进程调度 开始执行 init:boot
  • 8. ERTS 是个典型的网络服务器框架 ? IO 处理 o kernel poll 如 epoll kqueue ? 定时器处理 o timewheel ? 逻辑处理处理 o process ? coroutine ? fiber o smp
  • 9. 强大的 PORT ? 仿照 Unix 的哲学 : 一切都是文件 ? 管道通讯类似 CGI ? 支持可执行文件和动态库 o fd_driver_entry vanilla_driver_entry spawn_driver_entry ? kernel poll 支持大量的句柄 o 高度优化的 kpoll ? {lazy_updates,true}, {pending_updates,0}, {batch_updates,false}, {concurrent_updates,true},
  • 10. 定时器 ? 支持 time jump detection and correction ? Erlang 使用 timer 有 3 种方式: o 语法层面的 receive ... after ... o BIF: erlang:send_after(Time, Dest, Msg) erlang:start_timer(Time, Dest, Msg) o driver 层面的。 ?? int driver_set_timer(ErlDrvPort port, unsigned long time);
  • 11. SMP ? 参见 EUC_SMP o http://www.erlang.se/euc/08/euc_smp.pdf
  • 12. 多处理器利用技术 ? 线程 o 调度器 o 异步线程 o driver 发起的线程 ? 精巧的锁 ? process_lock ? 快速的 mutex ? 进程 o PORT 管道通讯
  • 13. 虚拟机部分 ? 基于 register ? JIT o Hipe native 代码执行 效率高好多 o 语言速度评测中表现不俗 ? opcode o R12B 大概 200 条 goto 和 case 优化 o arithmetic, comparsions and boolean logic; manipulating strings, tuples and lists; stack and heap allocation and freeing; type tests for Erlang primitives (numbers, lists, process IDs, references, and so on); jumps, structured exception handling, and calls and returns; sending messages and reading from the process' mailbox; waiting and timeouts
  • 14. 系统调度 ? 处理 timer 超时 ? 处理子进程退出的情况 ? 处理 port_task 事件,也就是 port 的 IO 事件 o port_task 独立调度 有自己的调度队列 ? 如果没有活跃的进程 就 sys_schdule 阻塞在底层的 IO 中。 ? check_io ? 根据 process 的优先级选出一个进程来调度。 o PRIORITY_MAX o PRIORITY_HIGH o PRIORITY_NORMAL o PRIORITY_LOW o PRIORITY_LEVELS
  • 15. 数据结构 ? 用地址来区分数据类型 ? pid <X, Y, Z> ? atom o index 表示 o cache 传送的是 index ? binary bitstring o 非常高效 静态分析 opcode 执行 o 非线性处理 ? list o 单链表 表头加入 ? tuple o 相当于数组
  • 16. bitstring 非线性数据处理 ? 和 scatter read, gather write 配对 ? 静态分析 opcode 实现 bitstring 操作 ? 减少内存搬动 大大提高操作效率 ? 对程序员透明
  • 17. 消息传递 ? 高效 compat ? 内部格式 ? 外部格式 o erts/emulator/internal_doc/erl_ext_dist.txt 描述了 erlang ext term 的格式 , epmd 通讯的流程协议和流程 同时还要 node 间通讯的协议 PID 变换 o pid {X,Y,Z} 在发到网络的时候发出去的格式是 {sysname, Y, Z} 因为节点之前互相联系过 所以互相知道对方的 sysname, 而 且 sysname 在 dist_entry 里保存,当对端收到 dec_pid 的时 候,用 peer sysname 的查到在自己 dist_entry 里面的索引, 然后用这个 index 来构造新的 pid ,即 {index, Y, Z} 。
  • 18. 内存分配器 ? 每个 CPU 一个内存池 ? 自动配置 ? 有 200 多个 alloc type ? private Heap, hybrid heap ? binary_alloc ? std_alloc ? ets_alloc ? fix_alloc ? eheap_alloc ? ll_alloc ? mseg_alloc ? sl_alloc ? temp_alloc ? sys_alloc
  • 19. 信号处理 ? SIGCHLD ? 用户信号 ? 异步处理和 poll 结合
  • 20. 驱动程序 ? 完善的驱动程序开发接口 甚至可以多线程编程 ? 文件驱动 o 异步操作 ? inet_drv 实现网络底层服务 如 tcp udp sctp o 丰富的 socket 选项 o 支持常见的消息编解码 ? HTTP CDR ASN.1 等 o scatter read, gather write o 消息接收变通提高效率
  • 22. BIF trap 机制 ? distribution trap functions o dsend2_trap o dsend3_trap o dsend_nosuspend_trap o dlink_trap o dunlink_trap o dmonitor_node_trap o dgroup_leader_trap dexit_trap o dmonitor_p_trap if the emulator wants to perform a distributed commandand%% a connection is not established to the actual node the following %% functions is called in order to set up the connection and then %% reactivate the command.
  • 23. 透明分布 ? 需要 net_kernel 的协助 ? group_leader 的设计和用途 ? 可替换的传输介质 o inet_tcp_dist o inet_ssl_dist ? dist trap 透明的进行握手动作 o connect and handshake ? 名称登记和维护 o local o global ? 维护网络全联通 o net tick o nodeup nodedown o erlsnoop 查看交互
  • 24. beam 加载和代码的热部署 ? 支持代码从 archive,inet,file 里面读取 实现无 盘工作站 ? 最小系统需要的 beam preload ? otp_ring0 init prim_inet prim_file zlib prim_zip erl_prim_loader erlang ? Erlang 的热部署包括 beam(.beam) 级别的和 driver(.dll .so) 级别的 .
  • 25. 对系统的干预 ? 内置强大的 shell ? CTRL+C ? 动态改变调度器的数目 ? crash dumps
  • 26. 异常处理 ? 语法层面的实现 o link monitor ? 详尽的日志 完善的日志系统 o error_logger ? port 是进程隔离的
  • 27. 自省机制 ? trace ? system_flag ? system_info ? system_profile ? system_monitor ? erts_debug ? the erlang crash dumps
  • 28. ETS 内存数据库 ? hash 和 tree ? match VM instruction ? 不参与 GC
  • 29. GC ? 不能保证 real time, 特别是 root set 比较大的时 候 ? mark-and-sweep copying collector ? 分代算法 2 代 o old_heap heap
  • 30. 稳定性 ? heart 心跳检查 自动加载 ? process crash 不会影响整个虚拟机 ? 代码可热升级 容易修复 bug 回滚功能
  • 31. 平台移植 ? Windows o ( smp 支持的不好) ? Unix ? 关键语义屏蔽平台变化