Inside the Erlang Vm

2,093 views

Published on

Chinese version PPT

Published in: Technology, News & Politics
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,093
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
72
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

×