开发消息推送服务器, 基于netty
主要引擎分4大组件: toolPooler, taskDispatcher, httpHandler, registerCenter
toolPooler, 任务池, 负责任务接收和保存
taskDispatcher, 任务派送器, 负责任务发送处理
httpHandler, http连接器, 负责处理netty上的所有websocket和ajax连接, 提供心跳支持
registerCenter 注册中心, 负责连接的注册信息(userId, devicerId), 以及心跳时间决定
3个人, 1个架构师, 1个4年,1个3年
前期架构师设计花了3天, 中期2个人各花10天, 后期集成调试3天
服务器开发完成, 在后期集成调试时, 做压力测试,
1.长连接测试: 不带消息处理, 只连接和心跳,
a.以一台2W块钱的服务器虚拟出来的wind8, 能支持1600个websocket同时在线并心跳后, 就很难再连接上了, 分析其原因, 打开其他页面, netty响应速度极慢(5s-30s)
b.以一台2W块钱的服务器虚拟出来的centos6, 能支持3000个websocket同时在线并心跳, 其实这个只是保持数量, 因为没有更多的客户端了...
2.消息推送测试: 同时在线100人, 每秒都给这100人发消息
a.win8的1600的能力被嫌弃, 只在centos6测试, 跑了30分钟, 程序就卡死了, 打开自己写的后台监控页面同样极慢(5s-30s-抓狂),
b.把程序回到开发机上, 下降压为每秒推30个消息, 打开jconsole监控, 如下图
现象: 线程直线上升, 到600个线程后, 线程数量一直上升没有回收(就像房价, 不像股市), 程序就出现访问简单页面卡死现象,
由此推出这个程序在centos6虚拟机的瓶颈是600个线程
分析: 消息推送, 在taskPooler里, 实现逻辑为:
收到消息 -> 存数据库 -> 发事件 -> 激活taskDispatcher的观察事件 ->
taskDispatcher处理: 判断推送的用户是否在线(通过registerCenter判断), 在线则调用httpHander把消息推出去, 否则无视
从图上分析, 线程数量直线上涨, 没有回落, 观察左右下角的panel, 有大量线程被阻塞, 主要入口在
receiveMsg (taskPooler.java:48)
即接收外面要推送消息, 最后追踪到自己的代码是
delete (taskPoolerImpl.java:135)
调试: 在delete前后加入时间日志
分析: 看出来删除记录花了8秒, 而每秒又会产生100个任务入库, 入库后推送又需要删除,
所以每个线程卡死在8秒, 造成堆压, 现有数据库的数据量为60W, mysql数据库
然后定位删除代码, 发现是通过
where deviceId=? and sent_to=?
去数据库, 发现是innoDB表引擎, 没有做任何索引
接着就是改索引, 改表引擎, 如下图
然后再更新到服务器去了, 跑99个一直稳定在28-22个线程并发数量, 如图
----------再作死, 加大压力----------
再加大压力, 跑198个, 线程又出现同样情况, 飚升到600后卡死, 但增加速度慢了很多
再走同样的排除法, 发现还是delete卡住,
以30人天开发的服务器, 能达到每秒99个消息推送的能力, 已经可以了, 到此为止,
赶紧跟其他子系统集成
后续(如果有的话):
1.深度优化数据库
2.现在已经在用连接池了, 后续不使用连接池, 直接长期保持delete专用连接
3.在接收消息时添加队列进去缓冲和拒绝
总结, JVM要做成房价那样就是失败了, 要做成股市那样就是成功了
- 大小: 114.6 KB
- 大小: 129.9 KB
- 大小: 85.1 KB
- 大小: 29.7 KB
- 大小: 27.2 KB
- 大小: 27.7 KB
- 大小: 67.5 KB
- 大小: 47.5 KB
- 大小: 52.8 KB
分享到:
相关推荐
### JConsole:观察与分析Java程序的运行 #### 一、JConsole简介 JConsole是自Java 5开始集成在JDK中的一个强大的性能监视和故障排除工具。它能够帮助开发者和运维人员监控Java应用程序的运行状态,并进行性能分析...
Java提供了一款强大的可视化监控工具——jconsole.jar,它可以帮助开发者和系统管理员实时查看和分析JVM(Java Virtual Machine)的状态,包括内存使用、线程状态、类加载情况以及垃圾收集等关键指标。本文将详细...
《使用xmanage远程开启Jconsole的详细步骤及原理解析》 在日常的Java应用程序管理中,Jconsole是一款非常实用的监控工具,它可以帮助我们实时监控Java应用的性能、内存使用情况以及线程状态等。然而,有时候在配置...
jvm检测工具,jconsole工具介绍,其他同类工具介绍
JConsole基于Swing构建,提供了一个图形用户界面(GUI),用于展示Java虚拟机(JVM)的各种性能指标,如内存使用、线程状态、类加载情况以及MBean服务器的信息。JConsole通过JMX接口与目标JVM进行通信,获取并展示...
《深入解析jconsole.1.8.0.jar及其在Java应用监控中的作用》 在Java开发和运维领域,工具的高效使用是提升工作效率的关键。jconsole作为Java平台提供的一款强大的性能监视工具,对于理解应用程序的运行状态至关重要...
JVisualVM和jconsole是两款由Oracle提供的强大工具,用于监控和分析Java应用程序的性能。本文将详细介绍JVisualVM以及jconsole中jtop插件的使用,特别是在JDK1.8环境下。 JVisualVM是一款集成化工具,它包含了多种...
通过提供丰富的图表和可视化界面,Jconsole可以帮助开发者和系统管理员深入了解Java应用程序的运行状况,包括内存使用、线程状态、类加载、垃圾收集等关键指标。 在配置Jconsole连接远程服务器上的Java应用,例如...
jconsole使用手册 jconsole是Java Development Kit(JDK)5.0中自带的一个性能监控工具,用于监控Java运行状态、线程数、进程数、对象、JVM内存信息、时间等性能信息。该工具可以帮助开发者和管理员实时监控Java...
1. **启动JConsole**:在命令行中,定位到JDK的bin目录下,运行`jconsole.exe`(Windows)或`jconsole`(Unix/Linux)。 2. **连接到应用程序**:JConsole启动后,可以选择本地进程或远程连接。对于本地进程,直接...
JDK(Java Development Kit)是Java开发者的必备工具,其中包含了编译器、调试器、性能分析工具等一系列用于Java应用程序开发和部署的组件。JDK8作为Java的一个重要版本,引入了许多新特性,提高了开发效率和运行...
JConsole 通常位于 JDK 的 bin 目录下,无需额外安装。在命令行中,可以通过以下命令启动 JConsole: ``` jconsole [options] ``` 其中 `<pid>` 是目标 Java 进程的进程ID,`options` 可以包括 `-J` 选项来传递给...
- **连接远程虚拟机**:在客户机上打开 `%JAVA_HOME%\bin` 目录下的 JConsole,然后在“远程进程”选项卡中输入 `192.168.1.101:1090` 并点击“连接”。 #### 3. JConsole 使用说明 一旦 JConsole 成功连接到远程 ...
### jconsole-tomcat配置详解 #### 一、引言 在现代软件开发与运维过程中,性能监控与故障排查是确保应用稳定运行的关键环节之一。作为一款广泛使用的Java应用服务器,Tomcat同样需要进行细致的监控与管理。而...
总的来说,JConsole是Java开发和运维过程中不可或缺的工具之一,它的强大功能使得我们可以实时监控和调试应用程序,从而更好地理解和优化我们的代码。通过熟练掌握JConsole的使用,开发者可以更加高效地诊断和解决...
jconsole.jar