百万 Netty Socket.IO 调优

前言

Socket.IO 单机性能调优

服务器的参数调优

服务器配置: CPU:8核,内存:32G

TCP/IP 参数配置

修改文件 /etc/sysctl.conf 配置网络参数:

1
2
3
net.ipv4.tcp_wmem = 4096 87380 4161536
net.ipv4.tcp_rmem = 4096 87380 4161536
net.ipv4.tcp_mem = 786432 2097152 3145728

发送缓存:tcp_wmem:min default max

  1. min:TCP socket 预留用于发送缓冲的内存最小值
  2. default:TCP socket 预留用于发送缓冲的内存数量,一般要低于 net.core.wmem_default 的值
  3. max: TCP socket 发送缓冲的内存最大值

接收缓存:tcp_rmem:min default max

  1. min:缓冲区分配的最少字节数
  2. default:缓冲区在系统负载不重的情况下可以增长到这个值;
  3. max:缓冲区空间的最大字节数(该值会被rmem_max覆盖)。

TCP读取缓冲区:tcp_mem:low pressure high

  1. low:当 TCP 使用了低于该值的内存页面数时,TCP 不会考虑释放内存
  2. pressure:进入 “memory pressure” 压力模式上限
  3. high:内存使用的上限,在这个层次上可以将报文丢弃,从而减少对内存的使用
设置 Linux 打开文件描述符(文件句柄)的最大值

获取系统打开文件描述符最大值:

1
2
3
4
5
$ sysctl -a | grep file
fs.file-max = 3270333
fs.file-nr = 18656 0 3270333
fs.xfs.filestream_centisecs = 3000

修改为如下内容:

编辑 /etc/sysctl.conf 文件,增加 fs.file-max = 1048576

获取进程最大打开文件描述符最大值:

1
2
3
$ ulimit -n
524288

修改为如下内容:

编辑 /etc/security/limits.conf 文件,增加 * - nofile 1048576

或增加:

1
2
3
4
* hard nofile 1048576
* soft nofile 1048576
root hard nofile 1048576
root soft nofile 1048576

注意: hard limit 不能大于 /proc/sys/fs/nr_open 值

查看当前系统使用的打开文件描述符数,可以使用下面的命令:

1
2
3
$ cat /proc/sys/fs/file-nr
18528 0 3270333

18528:为当前系统已分配使用的打开文件描述符数,0:为分配后已释放的(目前已不再使用),3270333:等于 file-max

总结

需要设置的值如下:

1
2
3
4
5
6
7
8
$ echo "* - nofile 1048576" >> /etc/security/limits.conf
$ echo "fs.file-max = 1048576" >> /etc/sysctl.conf
$ echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_mem = 786432 2097152 3145728" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_rmem = 4096 4096 16777216" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_wmem = 4096 4096 16777216" >> /etc/sysctl.conf

应用运行时调优

Java 应用内存调优

使用 12G 内存,吞吐率优先的垃圾回收器:

1
JAVA_OPTS="-Xms12G -Xmx12G -Xss1M -XX:+UseParallelGC"
客户端调优

要根据具体情况来,再此不多说

结果

  1. 建立120万个连接,不发送消息,内存剩余12G未用
  2. 每分钟给120万个websocket发送一条消息,消息内容为当前的服务器的时间。单线程发送,服务器发送完120万个总用时15秒左右
  3. 发送消息时进程消耗的 CPU 时间百分比在1~3%,网络带宽占用基本在 10M 左右

使用 CPU 性能监控工具: dstat

扩展阅读

Sysctl 高性能配置
开箱即用Ubuntu服务器优化

----本文结束 感谢您的阅读----