## 基于java NIO開發的服務端,系統使用率過高
完成開發,高高興興系統要上線啦!但是發現,CPU使用率過高,基本維持在80%以上。

**不選擇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 獲取源碼