1. 程式人生 > >Netty的高效能及NIO的epoll空輪詢bug

Netty的高效能及NIO的epoll空輪詢bug

Selector BUG出現的原因

若Selector的輪詢結果為空,也沒有wakeup或新訊息處理,則發生空輪詢,CPU使用率100%,

Netty的解決辦法

  • 對Selector的select操作週期進行統計,每完成一次空的select操作進行一次計數,

  • 若在某個週期內連續發生N次空輪詢,則觸發了epoll死迴圈bug。

  • 重建Selector,判斷是否是其他執行緒發起的重建請求,若不是則將原SocketChannel從舊的Selector上去除註冊,重新註冊到新的Selector上,並將原來的Selector關閉。

Netty的高效能之道

1.Netty心跳

(1)定義:心跳其實就是一個簡單的請求,

  • 對於服務端:會定時清除閒置會話inactive(netty5)channelclose(netty3)

  • 對於客戶端:用來檢測會話是否斷開,是否重來,檢測網路延遲!

(2)idleStateHandler類 用來檢測會話狀態

例:

public class IdleStateHandlerInitializer extends ChannelInitializer<Channel> {

    @Override
    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new
IdleStateHandler(0, 0, 60, TimeUnit.SECONDS)); //1 pipeline.addLast(new HeartbeatHandler()); } public static final class HeartbeatHandler extends ChannelInboundHandlerAdapter { private static final ByteBuf HEARTBEAT_SEQUENCE = Unpooled.unreleasableBuffer( Unpooled.copiedBuffer("HEARTBEAT"
, CharsetUtil.ISO_8859_1)); //2 @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate()) .addListener(ChannelFutureListener.CLOSE_ON_FAILURE); //3 } else { super.userEventTriggered(ctx, evt); //4 } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

分析:

• IdleStateHandler 將通過 IdleStateEvent 呼叫 userEventTriggered

• 如果連線沒有接收或傳送資料超過60秒鐘,則心跳傳送到遠端

• 傳送的心跳並新增一個偵聽器,如果傳送操作失敗將關閉連線

• 若事件不是 IdleStateEvent ,就將它傳遞給下一個處理程式

2.無鎖化的序列設計理念

(1)通過序列化設計,即訊息的處理儘可能在同一個執行緒內完成,期間不進行執行緒切換,這樣就避免了多執行緒競爭和同步鎖。

(2)Netty的應用

Netty採用了序列無鎖化設計,在IO執行緒內部進行序列操作,避免多執行緒競爭導致的效能下降。表面上看,序列化設計似乎CPU利用率不高,併發程度不夠。但是,通過調整NIO執行緒池的執行緒引數,可以同時啟動多個序列化的執行緒並行執行,這種區域性無鎖化的序列執行緒設計相比一個佇列-多個工作執行緒模型效能更優。

圖解:

這裡寫圖片描述

分析:NioEventLoop讀取到訊息之後,直接呼叫ChannelPipeline的fireChannelRead(Object msg)方法,只要使用者不主動切換執行緒,一直會由NioEventLoop呼叫到使用者的Handler,期間不進行執行緒切換。

3.Netty的可靠性

(1)鏈路有效性檢測:鏈路空閒檢測機制:讀/寫空閒超時機制

圖解:

這裡寫圖片描述

(2)記憶體保護機制:通過記憶體池重用ByteBuf;ByteBuf的解碼保護

(3)優雅停機:

  • 不再接收新訊息

  • 退出前的預處理操作

  • 資源的釋放操作

圖解:

這裡寫圖片描述

4.Netty安全性

(1)Netty支援的安全協議:SSL V2和V3,TLS,SSL單向認證、雙向認證和第三方CA認證。

(2)SSL的三種認證方式

  • 單向認證:客戶端只驗證服務端的合法性,服務端不驗證客戶端。

  • 雙向認證:與單向認證不同的是服務端也需要對客戶端進行安全認證。這就意味著客戶端的自簽名證書也需要匯入到服務端的數字證書倉庫中。

  • CA認證:基於自簽名的SSL雙向認證,只要客戶端或者服務端修改了金鑰和證書,就需要重新進行簽名和證書交換,這種除錯和維護工作量是非常大的。因此,在實際的商用系統中往往會使用第三方CA證書頒發機構進行簽名和驗證。我們的瀏覽器就儲存了幾個常用的CA_ROOT。每次連線到網站時只要這個網站的證書是經過這些CA_ROOT簽名過的。就可以通過驗證了。

5.Netty的高效併發程式設計的體現

(1)volatile的大量、正確使用;

(2)CAS和原子類的廣泛使用;

(3)執行緒安全容器的使用;

(4)通過讀寫鎖提升併發效能。

6.IO通訊效能三原則

(1)三原則:傳輸(AIO)、協議(Http)、執行緒

(2)傳統的RPC框架缺點

  • 網路傳輸方式(一請求一應答),當併發量大時,會出現控制代碼溢位,執行緒堆溢位等問題。

  • 序列化效能差:碼流大、無法跨語言、CPU佔用率高。

  • 執行緒模型:同步阻塞I/O效能差

7.Netty的TCP引數配置

(1)定義:合理設定TCP引數在某些場景下對於效能的提升可以起到顯著的效果,

(2)主要的TCP引數含義

  • SO_RCVBUF和SO_SNDBUF:通常建議值為128K或者256K;

  • SO_TCPNODELAY:NAGLE演算法通過將緩衝區內的小封包自動相連,組成較大的封包,阻止大量小封包的傳送阻塞網路,從而提高網路應用效率。但是對於時延敏感的應用場景需要關閉該優化演算法;

  • 軟中斷:如果Linux核心版本支援RPS(2.6.35以上版本),開啟RPS後可以實現軟中斷,提升網路吞吐量。RPS根據資料包的源地址,目的地址以及目的和源埠,計算出一個hash值,然後根據這個hash值來選擇軟中斷執行的cpu,從上層來看,也就是說將每個連線和cpu繫結,並通過這個hash值,來均衡軟中斷在多個cpu上,提升網路並行處理效能。

8.流量整型的作用(變壓器)

(1)防止由於上下游網元效能不均衡導致下游網元被壓垮,業務流中斷

(2)防止由於通訊模組接受訊息過快,後端業務執行緒處理不及時導致撐死問題

圖解: 
這裡寫圖片描述

相關推薦

Netty高效能NIO的epollbug

Selector BUG出現的原因 若Selector的輪詢結果為空,也沒有wakeup或新訊息處理,則發生空輪詢,CPU使用率100%, Netty的解決辦法 對Selector的select操作週期進行統計,每完成一次空的select操作進行一次計數, 若在某個週期內連續發生N次空輪詢,則

Epollbug

開發十年,就只剩下這套架構體系了! >>>   

Java nio bug到底是什麼

編者注:Java nio 空輪詢bug也就是Java nio在Linux系統下的epoll空輪詢問題。 epoll機制是Linux下一種高效的IO複用方式,相較於select和poll機制來說。其高效的原因是將基於事件的fd放到核心中來完成,在核心中基於紅黑樹+連結串列資料結構來實現,連結串列存放有事件發

netty原始碼分析(十六)Channel選擇器工廠與演算法註冊底層實現

上一節說到註冊的入口,即 MultithreadEventLoopGroup: public ChannelFuture register(Channel channel) { return next().register(chann

WebSocket 入門概念基礎 HTTP簡介

WebSocket 是一種網路通訊協議,很多高階功能都需要它。 百度百科解析: WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給客戶端。 目錄 一、為什麼需要

libev+nanomsg實現多執行緒通訊事件例項demo

概述:        在我們剛接觸程式編碼的時候,我們要輪詢資料有沒有發過來,我們最多的可能還是使用while+sleep這樣的組合,這對於處理來說是一個效率很低的方法同時還消耗cpu,那麼在多執行緒程式設計中使用libev+nanomsg會不會提高效率呢

《連載 | 物聯網框架ServerSuperIO教程》- 5.通訊模式開發注意事項。附:網友製作的類庫說明(CHM)

目       錄 5. 輪詢通訊模型開發及注意事項... 2 4.1           概述... 2 4.2           通訊機制說明... 2 4.3           裝置驅動開發注意事項... 3 4.3.1    實時傳送資料... 3 4.3.2 

squid正反向代理平衡

squid正向代理 原理:一臺不能上網的機器通過代理可以訪問不能訪問的網站 這裡我拿我的真機來做代理,虛擬機器通過代理訪問網站 真機Operating System: Red Hat Ente

Linux網路程式設計學習筆記(7)---5種I/O模型select

本文主要介紹5種I/O模型,select函式以及利用select實現C/S模型。 1、5種I/O模型 (1)阻塞I/O: 一直等到資料到來,才會將資料從核心中拷貝到使用者空間中。 (2)非阻塞I/O: 每過一段時

2、高效能web架構之DNS負載均衡(LVS-DR+keepalived實現DNS和web

LVS-DR+keepalived+DNS實現DNS高可用性: 一、介紹: 結合上一章的DNS主從複製,按現在大多數公司的需求是滿足不了的。DNS配置雖然簡單易用,但是它在網路中起到了主導作用。 如果客戶端設定的這臺首選DNS伺服器剛好宕機,即使客戶端還設定了備用DNS

Dubbo加權負載均衡的原始碼和Bug,瞭解一下?

      本文是對於Dubbo負載均衡策略之一的加權隨機演算法的詳細分析。從2.6.4版本聊起,該版本在某些情況下存在著比較嚴重的效能問題。由問題入手,層層深入,瞭解該演算法在Dubbo中的演變過程,讀懂它的前世今生。   之前也寫了Dubbo的負載均衡策略: 《

十四.nginx,web,反向代理,調用加權算法,nfs服務

文件夾 是否 觀察 查看 方式 har sys 重新啟動 chm 一.部署nginx反向代理web服務,調度算法使用加權輪詢: 1.首先配置一個nginx服務端,三個web客戶端。用vmware 新建虛擬機完成,並用xshell連接 2.在服務端和3個web客戶端都下載e

2017-5-5 QQ面板 (用戶控件、timer控件,實現聊天功能)

賬號 reat foreach friend ext 分享 label nec back using System; using System.Collections.Generic; using System.ComponentModel; using System.

ajax 和 php長連接

create model usleep enc mon 沒有 for intval func php 部分 public function get_comment(){ $post_id = I(‘get.post_id‘,0,‘intval‘); $

調bug心得一個非常二的bug

obj pan scrip ole 設置 snippet parent scripts sage 有時候執行結果錯誤,可是vs沒拋異常。這時能夠用trycatch來幫我們捕捉異常。 比如:bug的情況是treeview僅僅顯示一個根節點和一個子節點,還不報錯。我擦

springBoot(18):多賬號發送郵件

spring boot 多賬號 一、添加依賴<!-- mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

OSChinaclient源代碼學習(3)--機制的實現

man data 本地變量 其它 失敗 cbo cancel seh ref 主要以OSChina Androidclient源代碼中Notice的輪詢機制進行解讀。 一、基礎知識 一般IM(即使通訊)的實現有兩種方式:推送和輪詢,推送就是se

【58沈劍架構系列】lvs為何不能完全替代DNS

loading 生效 keepalive dfp 這一 常用 mage 服務層 nginx 上一篇文章“一分鐘了解負載均衡的一切”引起了不少同學的關註,評論中大家爭論的比較多的一個技術點是接入層負載均衡技術,部分同學持這樣的觀點: 1)nginx前

漢化 的 指針 bug

ase java tool lte event open awt 漢化 arch 韓夢飛沙 韓亞飛 [email protected] yue31313 han_meng_fei_sha nulljava.lang.NullPointerException

ajax短+php與服務器交互制作簡易即時聊天網站

could 是我 滾動 name blog 四個文件 復制 pan value 主流的Web端即時通訊方案大致有4種:傳統Ajax短輪詢、Comet技術、WebSocket技術、SSE(Server-sent Events)。 本文主要介紹ajax短輪詢的簡易實現方式。