关于erlang的一些调优收集
以及个人的调优学习总结
EMQ调优总结 原文: 测试调优 (Tuning Guide)
Linux 操作系统参数 系统全局允许分配的最大文件句柄数:
1 2 3 4 # 2 millions system-wide sysctl -w fs.file-max=2097152 sysctl -w fs.nr_open=2097152 echo 2097152 > /proc/sys/fs/nr_open
允许当前会话/进程打开文件句柄数:
/etc/sysctl.conf 持久化 fs.file-max
设置到 /etc/sysctl.conf
文件:
/etc/systemd/system.conf
设置服务最大文件句柄数:
1 DefaultLimitNOFILE=1048576
/etc/security/limits.conf /etc/security/limits.conf
持久化设置允许用户/进程打开文件句柄数:
1 2 * soft nofile 1048576 * hard nofile 1048576
TCP 协议栈网络参数 并发连接 backlog 设置
什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 来源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # # # # # # # # # sysctl -w net.core.somaxconn=32768 # # # sysctl -w net.ipv4.tcp_max_syn_backlog=16384 # sysctl -w net.core.netdev_max_backlog=16384
可用知名端口范围 1 sysctl -w net.ipv4.ip_local_port_range='1000 65535'
TCP Socket 读写 Buffer 设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # socket缓冲区默认大小 # sysctl -w net.core.rmem_default=262144 # sysctl -w net.core.wmem_default=262144 # socket缓冲区最大值 # sysctl -w net.core.rmem_max=16777216 # sysctl -w net.core.wmem_max=16777216 # sysctl -w net.core.optmem_max=16777216 # TCP/IPV4内核参数 # # # # # # sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216' # # # sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216' sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
TCP 连接追踪设置 1 2 3 4 5 6 # sysctl -w net.nf_conntrack_max=1000000 # sysctl -w net.netfilter.nf_conntrack_max=1000000 # sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
TIME-WAIT Socket 最大数量、回收与重用设置 1 2 3 4 5 6 # sysctl -w net.ipv4.tcp_max_tw_buckets=1048576 # 注意: 不建议开启該设置,NAT模式下可能引起连接RST # net.ipv4.tcp_tw_recycle = 1 # net.ipv4.tcp_tw_reuse = 1
FIN-WAIT-2 Socket 超时设置 1 2 # sysctl -w net.ipv4.tcp_fin_timeout = 15
Erlang 虚拟机参数 优化设置 Erlang 虚拟机启动参数,配置文件 emqx/etc/emqx.conf
:
1 2 3 4 5 6 7 ## Erlang Process Limit ## 最大进程数量限制, 默认值: 262144 , 加大会导致vm初始内存增大 node.process_limit = 2097152 ## Erlang 虚拟机允许的最大 Port 数量, 默认值: 1024 ,一个 tcp连接消耗 1 个 Port,所以参数值 > 最大连接数 ## Sets the maximum number of simultaneously existing ports for this system node.max_ports = 1048576
Erlang 设计相关 来源
使用 Pool, Pool, Pool… 推荐 GProc 库:
异步,异步,异步消息…连接层到路由层异步消息,同步请求用于负载保护
避免进程 Mailbox 累积消息
消息流经的 Socket 连接、会话进程必须 Hibernate,主动回收 binary 句柄
多使用 Binary 数据,避免进程间内存复制
使用 ETS, ETS, ETS… Message Passing vs. ETS
避免 ETS 表非键值字段 select, match
避免大量数据 ETS 读写, 每次 ETS 读写会复制内存,可使用 lookup_element, update_counter
适当开启 ETS 表 {write_concurrency, true}
保护 Mnesia 数据库事务,尽量减少事务数量,避免事务过载(overload)
避免对 Mnesia 数据表非索引、或非键值字段 match, select
调优可能用到的参考质料 基础知识
Erlang官方文档
调优实践
工具
个人总结
调优前必须对计算机原理有深入了解
调优前必须对计算机网络设备和网络协议有深入了解
熟悉官方文档的配置参数,并了解其每个参数的作用,最好是一并了解其作用原理
调优前需要先分析业务的使用场景,选取最经常发生的使用场景下来进行调优
参考链接