## 基于java NIO开发的服务端,系统使用率过高
完成开发,高高兴兴系统要上线啦!但是发现,CPU使用率过高,基本维持在80%以上。
![](https://img.kancloud.cn/e0/e5/e0e59c7d324c627017c323fd86f526d5_544x32.png)
**不选择Java原生NIO编程的原因**
> 引用自《Netty权威指南 第2版》中作者对该问题的解答。
1. NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。
2. 需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。
3. 可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐的工作量和难度都非常大。
4. JDKNIO的BUG,例如臭名昭著的epollbug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK 1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有得到根本性解决。
该BUG以及与该BUG相关的问题单可以参见以下链接内容。
以此来看,难道是epollbug导致的Selector空轮询导致的CPU 100%?可我们使用的JDK版本已经是JDK8的最新版本了。在这里留个小悬念,让我们用Netty实现服务端之后,我们再做一下性能上的对比。
linux系统会爆出:
```
[root@localhost ~]#
Message from syslogd@localhost at May 23 23:24:20 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [chronyd:643]
```
这是linux系统发生了内核软死锁(soft lockup)。主要原因之一就是:**CPU高负载时间过长**。
### 性能瓶颈
1. java NIO CPU使用率过高;
2. Server端接收到数据之后直接进行插库,数据库的IO可能会成为瓶颈;
> 遇到问题见招拆招。天下武功,没有完美的招式。
针对问题1,我们可以使用Netty方案代替;
针对问题2,结合rabbitMQ进行削峰填谷;数据库分库;
- 第一章 开篇寄语
- 1-1 技术选型要点
- 1-2 认识905.4王国的交流规范
- 1-3 联系作者
- 第二章 Socket编程的基础知识
- 2-1 Socket家族的基石
- 2-2 byte数组基础
- 2-3 缓冲区基础
- 2-4 NIO Socket通讯的工作原理
- 第三章 905.4规范解读
- 3-1 基于通道选择器的Socket长连接及消息读写框架
- 3-2 严格的信件收发员
- 3-3 负责消息处理的一家子
- 3-4 负责认证的大儿子(AuthWorker)
- 3-5 哑巴老二(PingWoker)
- 3-6 勤奋的定位汇报员老三(LocationReportWorker)
- 3-7 精明的老四(BusinessReportWorker)
- 3-8 数据检察官——CRC16-CCITT校验
- 3-11 数据的加密官
- 3-12 头尾标识转义
- 第四章 测试方法
- 4-1 测试数据样例
- 4-2 客户端链路保持功能实现
- 4-3 使用Socket短连接进行功能测试
- 4-4 NIO服务端性能分析
- 4-5 http测试方法(推荐)
- 第五章 从NIO到netty
- 5-1 编程进阶——Netty核心基础
- 5-2 Netty使用常见问题
- 5-3 使用Netty重写Server端
- 5-4 Netty之链路管理
- 5-5 netty堆外内存泄漏如何应对?
- 第六章 统计与监控
- 6-1 Grafana监控面板
- 第七章 售后服务
- 7-1 勘误与优化
- 7-2 获取源码