有很多物联网设备通过 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 1010000root 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.confnet.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 10netstat -nlt | grep 8090
- 查看当前最大文件数
cat /proc/sys/fs/file-maxcat /proc/sys/fs/file-nr
- 查看端口范围
cat /proc/sys/net/ipv4/ip_local_port_range