一、標(biāo)準(zhǔn)的netty線程模型
雙池合璧:

1、連接線程池:
連接線程池專門負(fù)責(zé)監(jiān)聽客戶端連接請(qǐng)求,并完成連接的建立(包括諸如握手、安全認(rèn)證等過(guò)程)。
連接的建立本身是一個(gè)極其復(fù)雜、損耗性能的過(guò)程,此處使用線程池,能夠極大的增加處理客戶端連接的能力。
2、I/O線程池:
連接線程池會(huì)將成功建立的連接注冊(cè)到后端I/O線程池,由I/O線程池負(fù)責(zé)對(duì)相應(yīng)連接的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行讀寫、編解碼處理。
在實(shí)際應(yīng)用中,我們通常會(huì)定義相應(yīng)的業(yè)務(wù)消息協(xié)議,并選擇合適的序列化機(jī)制,netty I/O線程池部分根據(jù)預(yù)設(shè)的規(guī)則進(jìn)行數(shù)據(jù)的編解碼。
二、延伸的業(yè)務(wù)線程池

其實(shí)我們這里說(shuō)的業(yè)務(wù)線程池不在網(wǎng)絡(luò)層處理邏輯里。處理到I/O線程池部分,所需要的請(qǐng)求數(shù)據(jù)已經(jīng)處理完畢,涉及具體的業(yè)務(wù)處理邏輯,比較復(fù)雜的,或者時(shí)間、性能消耗特別大的,通常我們會(huì)單獨(dú)設(shè)置相應(yīng)的線程池來(lái)處理。
三、netty的極致性能設(shè)計(jì)
1、無(wú)鎖化設(shè)計(jì)
I/O線程的內(nèi)部串行化:

局部無(wú)鎖化串行處理,避免多線程切換帶來(lái)的復(fù)雜性及性能損耗(鎖競(jìng)爭(zhēng)、CPU資源分配)。至于對(duì)于處理能力的考慮,可以通過(guò)調(diào)整I/O線程池容量來(lái)平衡。
盡量避免I/O線程和業(yè)務(wù)線程混淆及切換。
2、直接內(nèi)存使用
TCP接收和發(fā)送使用直接內(nèi)存代替堆內(nèi)存,避免了數(shù)據(jù)在堆內(nèi)存和主內(nèi)存之間的復(fù)制消耗,提升了I/O讀取和寫入的性能。

3、transferTo
依賴于操作系統(tǒng)零拷貝特性直接將緩沖區(qū)數(shù)據(jù)發(fā)送到相應(yīng)的通道。

傳統(tǒng)的方式,先將源文件拷貝到內(nèi)存,然后由內(nèi)存寫到目的文件。
netty 利用 NIO FileChannel transferTo方法,通道對(duì)通道寫數(shù)據(jù)。
4、CompositeByteBuf
組合緩存使用可以像操作單個(gè)緩存一樣操作多個(gè)緩存,避免了傳統(tǒng)的操作方式帶來(lái)的內(nèi)存復(fù)制性能消耗。

5、內(nèi)存池使用
netty支持通過(guò)內(nèi)存池的方式循環(huán)利用ByteBuf,避免了頻繁的創(chuàng)建,銷毀ByteBuf帶來(lái)的資源及性能損耗。
ByteBuf byte數(shù)據(jù)緩沖區(qū),是NIO編程的主要對(duì)象。高負(fù)載情景下,ByteBuf內(nèi)存池使用,可以有效降低GC頻率。
PoolArena netty的內(nèi)存池實(shí)現(xiàn)類。PoolArena 是由多個(gè)Chunk組成的大塊內(nèi)存區(qū)域,每個(gè)Chunk由一個(gè)多個(gè)Page組成。
Chunk:組織管理Page的內(nèi)存分配和釋放,Page被構(gòu)建為二叉樹形式:

PoolSubpage:對(duì)于小于Page的內(nèi)存使用,直接在Page中完成分配,每個(gè)Page切分為大小相同的多個(gè)存儲(chǔ)塊兒,存儲(chǔ)塊兒的大小由第一次申請(qǐng)的內(nèi)存塊兒大小決定。
回收:netty使用狀態(tài)位標(biāo)識(shí)Chunk及Page內(nèi)存可用性,Chunk標(biāo)識(shí)二叉樹Page節(jié)點(diǎn)使用狀態(tài);Page標(biāo)識(shí)內(nèi)部?jī)?nèi)存塊兒的使用狀態(tài)。
6、線程安全優(yōu)化
合理的使用線程安全容器、原子類等,提升系統(tǒng)的并發(fā)處理能力,
7、引用計(jì)數(shù)器
通過(guò)引用計(jì)數(shù)器及時(shí)的申請(qǐng)釋放不再引用的對(duì)象,細(xì)粒度的內(nèi)存管理降低了GC的頻率,減少GC帶來(lái)的時(shí)延增大和CPU損耗。
Netty 4中 ByteBuf 和 ByteBufHolder 引入引用計(jì)數(shù)器功能(實(shí)現(xiàn)ReferenceCounted接口),在特定的對(duì)象上跟蹤引用的數(shù)目。
引用計(jì)數(shù)器初始為1。如果對(duì)象活動(dòng)的引用計(jì)數(shù)器大于0,則不會(huì)被釋放。當(dāng)引用計(jì)數(shù)減少到0,實(shí)例將會(huì)被釋放。這也是 PooledByteBufAllocator 內(nèi)存池應(yīng)用的核心特性。
作者:WindWant
來(lái)源:https://www.cnblogs.com/niejunlei/p/13070107.html