erlang 应用 优化 指南

29
Erlang 应应应应应应 e [email protected] http://yufeng.info 2009/10/10

Upload: crevan

Post on 23-Feb-2016

218 views

Category:

Documents


0 download

DESCRIPTION

Erlang 应用 优化 指南. e [email protected] http://yufeng.info 2009/10/10. 优化的层次. 选型 操作系统 Erlang VM 语言 集群 业务. Erlang 适合做什么?. IO 密集型 高度优化完备的 IO 高性能网络服务器 多年的开发 非常完善 类似于一个操作系统 很好的处理掉了 Seven Sins 轻松 C10K 计算 先进的 SMP 调度器更好的利用 CPU . 2.Erlang 和操作系统比较. Unix 操作系统 用 c++ 做例子 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Erlang 应用 优化 指南

Erlang 应用优化指南[email protected]

http://yufeng.info2009/10/10

Page 2: Erlang 应用 优化 指南

优化的层次选型操作系统Erlang VM语言集群业务

Page 3: Erlang 应用 优化 指南

Erlang 适合做什么?• IO 密集型– 高度优化完备的 IO

• 高性能网络服务器– 多年的开发 非常完善 类似于一个操作系统– 很好的处理掉了 Seven Sins 轻松 C10K

• 计算– 先进的 SMP 调度器更好的利用 CPU

Page 4: Erlang 应用 优化 指南

2.Erlang 和操作系统比较• Unix 操作系统 用 c++ 做例子– 函数 (void f() {})– 类 (class xxx{};)– 模块 (xxx.cpp)– 可执行文件(编译器,机器指令)– 应用程序包括数据文件– OS 启动,系统进程(抢占式调度 )– IPC 通讯– 监控工具 (Top)

Page 5: Erlang 应用 优化 指南

Erlang 呢?• Erlang 系统类比– 函数 (fun () -> ok end)– 模块( module xxx. xxx.erl)– Beam 文件(编译器, opcode)– Application (beam+ 数据文件)– VM bootstrap, erlang 进程 ( 抢占调度 )– 消息, Port, IPC 通讯– etop

Page 6: Erlang 应用 优化 指南

ERTS 内部结构

Page 7: Erlang 应用 优化 指南

操作系统层面的优化• 操作系统的选择– 32 位系统 vs 64 位系统• 没有内存空间限制• 64 位比较慢

– RHEL 上游厂商 致力于高性能操作系统• Vdso• RhelRt

– 重新用 ICC 编译内核和 glibc – VM 和 TCP 协议栈的优化

Page 8: Erlang 应用 优化 指南

Cont

– 降低 swapness– 资源倾斜

Page 9: Erlang 应用 优化 指南

Erlang 运行期层面优化• 新版本的 OTP 致力于 smp 方面的改进

– 更细粒度的锁– 更好的内存分配器

• Hipe ( Erlang 的 Jit )– 全面启用 preloaded otp 库

• Crack 系统– 减少无必须的系统调用 短链接

• 参数微调– Effective guide

• 未公开的特性– 调度器绑定

Page 10: Erlang 应用 优化 指南

语言层面优化• 减少 GC 开销• 进程字典• 加大 min_heap_size• Hibernate• Cache• Lazy eval• Record 动态和静态的分开

Page 11: Erlang 应用 优化 指南

Cont

• 模式匹配– 相同的标签尽可能的放在一起 排序 二分查找

• 避免创建无用的中间变量• 数据结构设计尽可能的每个调度器一个• Erl +”’S’” mod.erl• Bin_opt_info• 直接函数调用 vs 异步消息

Page 12: Erlang 应用 优化 指南

集群层面优化• 节点间通讯– Inet_tcp

• 节点管理成本– Nettick

• EI

Page 13: Erlang 应用 优化 指南

业务层面的优化• 尽可能的简单 能够并行计算• Small message, big computation• 为业务估算要消耗的资源 提早分配– 内存– Cpu

Page 14: Erlang 应用 优化 指南

内存和 CPU 的平衡• 部署– 计算密集型 IO 密集性在同一台物理机器资源互补

• Plain Vs smp– Plain 适合做简单的 IO 操作– Smp 适合做密集计算

• Hibernate– 根据业务的特点 定时来做– 快速打扫战场 释放资源

Page 15: Erlang 应用 优化 指南

数据组织• 进程和物理世界的对象 1:1 • Ets• Tuple list array• Dict Gb_dict process dict• 无锁结构– 有限的调度器 每个调度器一个 slot

Page 16: Erlang 应用 优化 指南

进程调度原理• 上下文切换– Context_switch

• 消息传递的开销– 消息拷贝

Page 17: Erlang 应用 优化 指南

Port 调度原理• 延迟• Busy_port• 水位线 • Buffer• 锁• 同进程的关系

Page 18: Erlang 应用 优化 指南

测量什么?• 热点– Erlang 代码的热点– Erts 的热点– OS 的热点

• 延迟– 调度排队

• 抖动–不是绝对的公平

Page 19: Erlang 应用 优化 指南

测量工具• OS 层面– SystemTap– oprofile– Dstat– Top– Iptraf– Wireshark– /proc

Page 20: Erlang 应用 优化 指南

Erlang 工具• Etop• Pman• Instrument• Lockcounter• Dbg• Stat• Info• Erts_debug

Page 21: Erlang 应用 优化 指南

Cont

• Monitor• Os_monitor• Profile ×prof

Page 22: Erlang 应用 优化 指南

可视化消息跟踪系统

Page 23: Erlang 应用 优化 指南

Tips

• List comprehension 编译器优化• 多利用 iolist gather write • Binary• Hipe_bif• 避免昂贵的 bif 如 now() io_lib:format等

Page 24: Erlang 应用 优化 指南

Cpu亲缘性• 大量减少锁的竞争 futex• spinlock• Scheduler• Sct db

Page 25: Erlang 应用 优化 指南

操作系统 native 特性• Futex• Vdso• Tcp 协议栈– Send_file – DEFER_ACCPEPT

Page 26: Erlang 应用 优化 指南

可诊断的系统• 提供内部状态的信息 完善的日志系统– 调优的依据

• 关键参数可动态调整• 过程工具化 自动化• 高压力测试

Page 27: Erlang 应用 优化 指南

尽可能的利用 erts 的优势• Port整合不同的语言和系统• 性能苛刻 可以考虑用 driver 改写关键部分• 尽可能的利用高级特性如 {packet, 2}• 设计的协议什么的尽可能的方便 erlang 处理– Big end

• 工业标准的协议– Asn.1

• Leex 和 yecc

Page 28: Erlang 应用 优化 指南

资源竞争• 锁还是存在– 下移到了 erts– 操作在不同的调度器都要锁

• 减少再减少– 设计方面考虑

Page 29: Erlang 应用 优化 指南

多谢大家

Q&A 时间