Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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
               ...
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
...
强大的 PORT

• 仿照 Unix 的哲学 : 一切都是文件
• 管道通讯类似 CGI
• 支持可执行文件和动态库
   o fd_driver_entry vanilla_driver_entry spawn_driver_entry
•...
定时器

• 支持 time jump detection and correction
• Erlang 使用 timer 有 3 种方式:
  o   语法层面的 receive ... after ...
  o   BIF: erlan...
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 ...
系统调度
• 处理 timer 超时
• 处理子进程退出的情况
• 处理 port_task 事件,也就是 port 的 IO 事件
  o port_task 独立调度 有自己的调度队列
• 如果没有活跃的进程 就 sys_schdule 阻...
数据结构

• 用地址来区分数据类型
• pid <X, Y, Z>
• atom
   o     index 表示
   o     cache 传送的是 index
• binary bitstring
   o     非常高效 静态分...
bitstring 非线性数据处理

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

• 高效 compat
• 内部格式
• 外部格式
 o   erts/emulator/internal_doc/erl_ext_dist.txt 描述了 erlang ext
     term 的格式 , epmd 通讯的流程...
内存分配器
•   每个 CPU 一个内存池
•   自动配置
•   有 200 多个 alloc type
•   private Heap, hybrid heap
•   binary_alloc
•   std_alloc
•   e...
信号处理

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

• 完善的驱动程序开发接口 甚至可以多线程编程
• 文件驱动
 o   异步操作
• inet_drv 实现网络底层服务 如 tcp udp sctp
 o   丰富的 socket 选项
 o   支持常见的消息编解码
     ...
异步线程

• 完成驱动程序耗时操作
• 和调度器不相干
BIF trap 机制
  • distribution trap functions
      o dsend2_trap
      o dsend3_trap
      o dsend_nosuspend_trap
      o d...
透明分布
• 需要 net_kernel 的协助
• group_leader 的设计和用途
• 可替换的传输介质
  o   inet_tcp_dist
  o   inet_ssl_dist
• dist trap 透明的进行握手动作
  ...
beam 加载和代码的热部署

• 支持代码从 archive,inet,file 里面读取 实现无
  盘工作站
• 最小系统需要的 beam preload
    otp_ring0 init prim_inet prim_file z...
对系统的干预

•   内置强大的 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 ...
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
Nächste SlideShare
Wird geladen in …5
×

Inside the Erlang Vm

2.201 Aufrufe

Veröffentlicht am

Chinese version PPT

Veröffentlicht in: Technologie, News & Politik
  • Als Erste(r) kommentieren

Inside the Erlang Vm

  1. 1. Inside the Erlang VM Yu Feng mryufeng@gmail.com 2008/12/20 blog: http://mryufeng.javaeye.com
  2. 2. BEAM 的优势 • 高性能 • 多核心 SMP 的支持 • 透明分布的支持 • 轻量进程的支持 • 完善的监控信息 • 商业产品上经过时间的验证成熟
  3. 3. 为什么其他语言要移植到 Erlang 虚拟 机 • 语言 Reia 会成功吗 • 作者看中什么? o 框架 o 概念 o 成熟度 o 性能 o 模型
  4. 4. ERTS 的代码规模 • 200K 行 C 代码 几千行 Erlang 代码 o 同等的 ACE 框架 • 代码成熟度 • 尺寸很小 适合于嵌入式 o 1.5M • 也适合做桌面程序 如 p2p
  5. 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. 6. BEAM 的分类 • BEAM 分成不同版本的目的是提高性能 避免 不必要的开销 • beam.plain • beam.smp • beam.hybrid ( 目前支持的不好 )
  7. 7. ERTS 启动过程 • 概念模拟操作系统 • erl_exec • 系统资源初始化 • erl_first_process_otp opt_ring0 • 转入 Erlang 进程调度 开始执行 init:boot
  8. 8. ERTS 是个典型的网络服务器框架 • IO 处理 o kernel poll 如 epoll kqueue • 定时器处理 o timewheel • 逻辑处理处理 o process  coroutine  fiber o smp
  9. 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. 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. 11. SMP • 参见 EUC_SMP o http://www.erlang.se/euc/08/euc_smp.pdf
  12. 12. 多处理器利用技术 • 线程 o 调度器 o 异步线程 o driver 发起的线程 • 精巧的锁  process_lock  快速的 mutex • 进程 o PORT 管道通讯
  13. 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. 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. 15. 数据结构 • 用地址来区分数据类型 • pid <X, Y, Z> • atom o index 表示 o cache 传送的是 index • binary bitstring o 非常高效 静态分析 opcode 执行 o 非线性处理 • list o 单链表 表头加入 • tuple o 相当于数组
  16. 16. bitstring 非线性数据处理 • 和 scatter read, gather write 配对 • 静态分析 opcode 实现 bitstring 操作 • 减少内存搬动 大大提高操作效率 • 对程序员透明
  17. 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. 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. 19. 信号处理 • SIGCHLD • 用户信号 • 异步处理和 poll 结合
  20. 20. 驱动程序 • 完善的驱动程序开发接口 甚至可以多线程编程 • 文件驱动 o 异步操作 • inet_drv 实现网络底层服务 如 tcp udp sctp o 丰富的 socket 选项 o 支持常见的消息编解码  HTTP CDR ASN.1 等 o scatter read, gather write o 消息接收变通提高效率
  21. 21. 异步线程 • 完成驱动程序耗时操作 • 和调度器不相干
  22. 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. 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. 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. 25. 对系统的干预 • 内置强大的 shell • CTRL+C • 动态改变调度器的数目 • crash dumps
  26. 26. 异常处理 • 语法层面的实现 o link monitor • 详尽的日志 完善的日志系统 o error_logger • port 是进程隔离的
  27. 27. 自省机制 • trace • system_flag • system_info • system_profile • system_monitor • erts_debug • the erlang crash dumps
  28. 28. ETS 内存数据库 • hash 和 tree • match VM instruction • 不参与 GC
  29. 29. GC • 不能保证 real time, 特别是 root set 比较大的时 候 • mark-and-sweep copying collector • 分代算法 2 代 o old_heap heap
  30. 30. 稳定性 • heart 心跳检查 自动加载 • process crash 不会影响整个虚拟机 • 代码可热升级 容易修复 bug 回滚功能
  31. 31. 平台移植 • Windows o ( smp 支持的不好) • Unix • 关键语义屏蔽平台变化
  32. 32. Tips: 小心参数设置 • 大量的参数可以通过环境变量来配置 • 进程数目 • 最大文件句柄数
  33. 33. 谢谢大家 Q&A

×