服务器性能优化
一、性能监测工具
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复用机制