简单聊天室的服务器状态分析

服务器状态 - 繁忙

  • 服务端需要等待客户端连接
  • 服务器需要等待接收客户端的消息
  • 客户端等待接收服务端的消息
  • 以上过程都是阻塞的所以使用了异步线程

服务器线程数量

  • 每个客户端分别有接收消息线程和发送消息线程
  • 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条消息发送线程并未启动,只启动了消息接收线程)                       

                  

                 服务端发送消息下的CPU,内存和线程:

                        1.cpu使用增加到5%左右

                        2.内存波动频率增加,使用略增,到65M-90M之间

                        3.线程数量猛增至2000条

                 

服务器性能数据分析

  • cpu:取决于数据的频繁性、数据转发的复杂性(本案例cpu仅需要扫描所有客户端,把消息发送给除了自己的其他客户端)
  • 内存:取决于客户端的数量、客户端发送数据的大小
  • 线程:取决于连接的客户端数量

服务器优化案例分析

  • 1000线程消耗已经很多了,客户端若想达到十万百万级别,必须要优化服务器
  • 减少线程数量
  • 增加线程执行的繁忙状态而非一直等待
  • 客户端Buffer复用机制

代码

相对于之前的代码,更改了TCPServer、ClientHandle、Client、TCPClient的内容,使之可以适应ClientTest类的Socket创建

链接: 百度网盘 提取码: vakd 

猜你喜欢

转载自blog.csdn.net/weixin_42089175/article/details/89163170