1、springboot项目聚合websockert代码。代码如下:
1 | java复制代码/** |
我用的是gradle项目。当然别忘记了引入websocket的jar
附上gradle的jar.
1 | arduino复制代码 implementation ("org.springframework.boot:spring-boot-starter-websocket:2.3.0.RELEASE") { |
maven项目 jar
1 | xml复制代码<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>${websocket.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions></dependency> |
下面开始重点总结:
一开始这个项目发布到服务器上面,只能支持一万的长连接。top命令看了linux的参数,发现CPU内存都还有很大空闲。那么就瓶颈就不在CPU。又看了网络带宽之类的参数,都没有问题。最终锁定发现springboot项目默认的启动容器是tomcat,而tomcat默认支持1W的连接数量。超过就会拒绝。既然问题出在tomcat,那么现在就有两个方案。1、调大tomcat的连接数量。2、容器换成jetty。对于需要保持数十万的长连接,jetty无疑更适合作为启动容器。
启动容器替换成jetty,只需要在jar引用的的时候排除掉tomcat,并且加上jetty的jar.附上jar引用代码
gradle项目jar
1 | sql复制代码 implementation("org.springframework.boot:spring-boot-starter-web") { |
maven项目 jar
1 | xml复制代码<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>${websocket.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions></dependency> |
这里有个坑,引入websocket jar的时候一定也要排除tomcat的依赖。不然启动容器依然是tomcat。
现在这个代码放上linux服务器。按理来说应该可以支持起码好几万的长连接了吧。但是事与愿违,经过测试,发现居然只能建立1.6W+长连接。但是服务器的内存跟cpu明显还有空余。那么问题出在哪里?既然替换了容器,这个项目现在支持的长连接应该是看服务器的配置的。问题应该不在于框架了。那会不会是linux本身有什么限制。导致只能维持1.6W+的长连接呢?
ulimit -a 参看linux的各种参数限制。
max locked memory (kbytes, -l) 16384
这个参数跟长连接的数量及其相似,初步猜测是不是这个参数的问题。
ulimit -l unlimited 把这个参数调成了无限制。现在再来测试长连接的数量。
已经可以达到5W+。因为测试工具的原因。没有做更高的压测,但是初步观察。保持10万的长连接应该是支持的。
附上永久修改 max locked memory 的命令
1 | markdown复制代码 1)、解除 Linux 系统的最大进程数和最大文件打开数限制: |
本文转载自: 掘金