单机百万连接调优
准备两台Linux服务器,一个充当服务端,一个充当客户端。
服务端
- 操作系统:CentOS 7
- 配置:4核8G
- IP:192.168.118.138
客户端
- 操作系统:CentOS 7
- 配置:4核8G
- IP:192.168.118.139
服务端和客户端均要配置java环境,基于jdk1.8。
如何模拟百万连接#
如果服务端只开一个端口,客户端连接的时候,端口号是有数量限制的(非root用户,从1024到65535,大约6w),所以服务端开启一个端口,客户端和服务端的连接最多6w个左右。
为了模拟单机百万连接,我们在服务端开启多个端口,例如8000~8100,一共100个端口,客户端还是6w的连接,但是可以连接服务端的不同端口,所以就可以模拟服务端百万连接的情况。
准备服务端程序#
服务端程序的主要逻辑是:
绑定8000端口一直到8099端口,一共100个端口,每2s钟统计一下连接数。
channelActive触发的时候,连接+1, channelInactive触发的时候,连接-1。
代码见:Server.java
准备客户端程序#
客户端程序的主要逻辑是:
循环连接服务端的端口(从8000一直到8099)。
代码见:Client.java
准备好客户端和服务端的代码后,打包成Client.jar和Server.jar并上传到客户端和服务端的/data/app目录下。打包配置参考pom.xml
服务端和客户端在/data/app下分别准备两个启动脚本,其中服务端准备的脚本为startServer.sh, 客户端准备的脚本为startClient.sh,内容如下:
startServer.sh
java -jar server.jar -Xms6.5g -Xmx6.5g -XX:NewSize=5.5g -XX:MaxNewSize=5.5g -XX:MaxDirectMemorySize=1g
startClient.sh
java -jar client.jar -Xms6.5g -Xmx6.5g -XX:NewSize=5.5g -XX:MaxNewSize=5.5g -XX:MaxDirectMemorySize=1g
脚本文件见:startServer.sh 和 startClient.sh
先启动服务端
cd /data/app/
./startServer.sh
查看日志,待服务端把100个端口都绑定好以后。
在启动客户端
cd /data/app/
./startClient.sh
然后查看服务端日志,服务端在支撑了3942个端口号以后,报了如下错误:
Caused by: java.io.IOException: Too many open files
at sun.nio.ch.FileDispatcherImpl.init(Native Method)