服务器性能优化

一、性能监测工具

1、jconsole

jdk的bin目录,jconsole可以查看当前进程所消耗的资源

2、jvisualvm

jvisualvm不仅可以调试本地,还可以调试远程

服务器性能优化

 

2.1 同时运行客户端和服务器

服务器性能优化

2.2 查看server进程的监视器

双击server.jar进程,在弹出的界面中选择监视选项卡

右下角可以看到线程是1012

服务器性能优化

 

2.3 通过线程选项卡可以查看具体的线程

为什么不是2n,因为发送使用的是单线程池,线程池在没有发送任何数据的情况下是不会初始化,也就是0.

当前只是处于一个等待读取状态

服务器性能优化

 

2.4 内存

内存消耗在55到120之间

服务器性能优化

执行垃圾回收后,内存最大在55左右,可以认为内存最低消耗是55左右

 

2.5 cpu基本没怎么消耗

从图中左上角可以看到cpu基本没怎么消耗

 

2.6  开启发送数据线程

当客户端开始回复消息时,线程数量变为2012

服务器性能优化

 

内存最低大概是80M左右

服务器性能优化

为什么内存占用并没有太多?

数据是一批一批发送到服务端的,并且立刻把它转发走了,并且转发没有受到阻塞。所以内存几乎没有堆积内存的存在,仅是读取数据的buffer消耗。

不发送内存是55M,发送内存是82M,可以认为发送和不发送之间的内存消耗是27M左右。

消耗最大的是线程。线程虽然可以创建很多,但是当创建2000个线程的时候,效率其实是比较低效的。因为电脑资源是有限的,如果花费大量的时间进行线程之间的切换,其实是不划算的。应该把这个时间花费在真实数据的传输上。

 

当结束客户端后数据信息如何?

当结束客户端后,线程下降为9个,创建的线程全部消耗。

CPU几乎降为零。

内存降为5M左右。也就是说,实现1000个客户端的稳定传输,内存消耗大概达到95M左右,那如果连接10000个,内存消耗大概950M,如果20000个呢?如果日活达到百万级别,又该是多少?那么此时的内存和CPU是严重不够的,在1000个客户端的时候,内存消耗大概占了33%。以及消耗了50%的CPU量,如果CPU占用达到30%以上,就认为消耗是比较高的。

服务器性能优化

 

 

三、服务器性能分析

CPU:取决于数据的频繁性、数据的转发复杂性

内存:取决于客户端的数量、客户端发送的数据大小

线程:取决于连接的客户端的数量

 

四、服务器优化方案

减少线程数量

增加线程执行繁忙状态

客户端Buffer复用机制