0%

Erlang 调优学习总结

关于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

允许当前会话/进程打开文件句柄数:

1
ulimit -n 1048576

/etc/sysctl.conf

持久化 fs.file-max 设置到 /etc/sysctl.conf 文件:

1
fs.file-max = 1048576

/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
## Tcp syn队列的最大长度,在进行系统调用connect时会发生Tcp的三次握手,
## server内核会为Tcp维护两个队列,Syn队列和Accept队列,
## Syn队列是指存放完成第一次握手的连接,Accept队列是存放完成整个Tcp三次握手的连接。
## [From](https://blog.csdn.net/wwh578867817/article/details/46707389)

## somaxconn参数决定Accept队列长度,在listen函数调用时backlog参数即决定Accept队列的长度,
## 该参数太小也会限制最大并发连接数,因为同一时间完成3次握手的连接数量太小,server处理连接速度也就越慢。
## 服务器端调用accept函数实际上就是从已连接Accept队列中取走完成三次握手的连接。
## Accept队列和Syn队列是listen函数完成创建维护的。
## 大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
sysctl -w net.core.somaxconn=32768

## 修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的网络连接。
## 注意此参数过大可能遭遇到Syn flood攻击,即对方发送多个Syn报文端填充满Syn队列,
## 使server无法继续接受其他连接。可参考此文http://tech.uc.cn/?p=1790
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缓冲区默认大小
## 该参数指定了接收(read)套接字缓冲区大小的缺省值(以字节为单位)
sysctl -w net.core.rmem_default=262144
## 该参数指定了发送(write)套接字缓冲区大小的缺省值(以字节为单位)
sysctl -w net.core.wmem_default=262144

# socket缓冲区最大值
## 该参数指定了接收(read)套接字缓冲区大小的最大值(以字节为单位)
sysctl -w net.core.rmem_max=16777216
## 该参数指定了发送(write)套接字缓冲区大小的最大值(以字节为单位)
sysctl -w net.core.wmem_max=16777216
## 每个socket的副缓冲区大小
sysctl -w net.core.optmem_max=16777216

# TCP/IPV4内核参数
## 该内核参数也是包括三个值,用来定义内存管理的范围,
## 第一个值的意思是当page数低于该值时,TCP并不认为他为内存压力,
## 第二个值是进入内存的压力区 域时所达到的页数,
## 第三个值是所有TCP sockets所允许使用的最大page数,超过该值后,会丢弃后续报文。
## page是以页面为单位的,为系统中socket全局分配的内存容量。
#sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'

## TCP socket的读写缓冲区的设置,每一项里面都有三个值
## 第一个值是缓冲区最小值,中间值是缓冲区的默认值,最后一个是缓冲区的最大值,
## 虽然缓冲区的值不受core缓冲区的值的限制,但是缓冲区的最大值仍旧受限于core的最大值。
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
## time_wait状态超时时间,超过该时间就清除该连接,保持不变
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

TIME-WAIT Socket 最大数量、回收与重用设置

1
2
3
4
5
6
##  该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除。
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
## 设置TIME_WAIT2进入CLOSED的等待时间。 默认值:60
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官方文档

调优实践

工具

个人总结

  • 调优前必须对计算机原理有深入了解
  • 调优前必须对计算机网络设备和网络协议有深入了解
  • 熟悉官方文档的配置参数,并了解其每个参数的作用,最好是一并了解其作用原理
  • 调优前需要先分析业务的使用场景,选取最经常发生的使用场景下来进行调优

参考链接

梦想基金
feng19 微信

微信

feng19 支付宝

支付宝

欢迎关注我的其它发布渠道