服务器状态 - 繁忙
- 服务端需要等待客户端连接
- 服务器需要等待接收客户端的消息
- 客户端等待接收服务端的消息
- 以上过程都是阻塞的所以使用了异步线程
服务器线程数量
- 每个客户端分别有接收消息线程和发送消息线程
- n个客户端线程数量:2n
- 服务端线程总数量:至少2n+4 (服务端主线程,服务器GC回收(垃圾回收)线程,监听客户端连接线程,服务端转发消息线程)
服务器压力测试
开启1000个客户端检测电脑CPU,内存和线程数量的状态
测试环境:Java VisualVM(java jdk bin目录)
电脑CPU:i5-6200U
测试代码:将客户端测试类和服务端主类打成jar包(如何打包详见博客中的另一篇文章),本地cmd运行两个jar包
测试流程:1.1000客户端连接下的CPU,内存和线程 2.服务端发送一条消息下的CPU,内存和线程
测试图解:
1000客户端连接下的CPU,内存和线程:
1.cpu基本无消耗(只是启动线程并没有消息处理)
2.内存随线程数量增加逐渐增加,1000线程全部启动后保持在60M-85M之间
3.线程数量从0逐渐增加到1000(无消息传输1000条消息发送线程并未启动,只启动了消息接收线程)
扫描二维码关注公众号,回复:
5932083 查看本文章
服务端发送消息下的CPU,内存和线程:
1.cpu使用增加到5%左右
2.内存波动频率增加,使用略增,到65M-90M之间
3.线程数量猛增至2000条
服务器性能数据分析
- cpu:取决于数据的频繁性、数据转发的复杂性(本案例cpu仅需要扫描所有客户端,把消息发送给除了自己的其他客户端)
- 内存:取决于客户端的数量、客户端发送数据的大小
- 线程:取决于连接的客户端数量
服务器优化案例分析
- 1000线程消耗已经很多了,客户端若想达到十万百万级别,必须要优化服务器
- 减少线程数量
- 增加线程执行的繁忙状态而非一直等待
- 客户端Buffer复用机制
代码
相对于之前的代码,更改了TCPServer、ClientHandle、Client、TCPClient的内容,使之可以适应ClientTest类的Socket创建
链接: 百度网盘 提取码: vakd