有很多物联网设备通过 websocket 协议连接到服务器, 每个设备有一个唯一的 id (比如mac地址)
- 连接数
- 连接速率
- 过期连接删除速率
- 单机 100w websocket 长连接
- 单机 100w websocket 长连接 + 心跳检查, 过期连接删除 (doing... 预计 2021.04.03 前完成)
- 思考:
- 通过 tcp 发送心跳包
- 通过 udp 发送心跳包
- 负载均衡, 多线程处理心跳包
- 思考:
- nginx 前置代理/负载均衡 100w websocket 长连接
- 单机 1000w tcp 连接
- 单机 1000w websocket 长连接
- 打包
mvn clean package -DskipTests
- 启动 websocket 服务端
java -jar target/c10k-0.0.1.jar
- 启动 websocket 客户端
java -cp target/c10k-0.0.1.jar -Dloader.main=me.giraffetree.websocket.c10k.client.ClientStarter org.springframework.boot.loader.PropertiesLauncher
- 查看参数默认参数:
java -cp target/c10k-0.0.1.jar -Dloader.main=me.giraffetree.websocket.c10k.client.ClientStarter org.springframework.boot.loader.PropertiesLauncher --help
vi /etc/sysctl.conf
修改后使用sysctl -p
生效, 使用sysctl -a
查看当前配置- 操作系统可以打开的最大文件数
fs.file-max=1100000
- 单个进程可以打开的最大文件数
fs.nr_open=1050000
- 修改可用端口数
net.ipv4.ip_local_port_range = 5000 65000
- 操作系统可以打开的最大文件数
vi /etc/security/limits.conf
重新打开 bash 即可生效- 修改用户进程可以打开的最大文件数 请注意这个最大文件数不要大于
单个进程可以打开的最大文件数 fs.nr_open
root soft nofile 1010000
root hard nofile 1010000
- 修改用户进程可以打开的最大文件数 请注意这个最大文件数不要大于
- 连接数
- 4核16G的server端, 建立 100w websocket 长连接
- dmesg | tail -n 20
- dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。
- 我们可以用来检查系统 tcp 相关的异常
- 例如发现
nf_conntrack: table full, dropping packet
则需要修改/etc/sysctl.conf
中的net.netfilter.nf_conntrack_max = 1200000
进来的连接数超过这个值时,新连接的包会被丢弃。 - 例如发现
too many orphaned sockets
则表示 系统耗光了socket内存 , 需要调整一下tcp socket参数。在tcp_mem三个值分别代表low,pressure,high三个阈值vi /etc/sysctl.conf
net.ipv4.tcp_mem = 600000 800000 943718
- tcp_mem 中的单位是页,1页=4096字节, 由于我的机子是 2核4GB的, 这里最大我设定为3.6G的内存左右
net.ipv4.tcp_rmem = 4096 4096 6291456
- tcp_rmem,tcp_wmem单位是byte,所以最小socket读写缓存是4k。
net.ipv4.tcp_wmem = 4096 4096 6291456
- 例如发现
watch "ss -ant | grep ESTAB | wc -l"
- 计算 tcp 连接数
- 查看当前 tcp 连接数
netstat -pntl | head -n 10
netstat -nlt | grep 8090
- 查看当前最大文件数
cat /proc/sys/fs/file-max
cat /proc/sys/fs/file-nr
- 查看端口范围
cat /proc/sys/net/ipv4/ip_local_port_range