隨著車聯(lián)網(wǎng)似将、智能家居获黔、智慧城市等業(yè)務(wù)的發(fā)展,IoT進(jìn)入了飛速發(fā)展期在验。由于要接入海量的硬件設(shè)備和傳感器玷氏,且協(xié)議多樣化,同時(shí)還要在極短的時(shí)間內(nèi)處理大量的數(shù)據(jù)腋舌,所以對(duì)服務(wù)端的協(xié)議接入和處理能力要求極高盏触。
1、海量長(zhǎng)連接接入面臨的挑戰(zhàn)
當(dāng)客戶端的并發(fā)連接數(shù)達(dá)到數(shù)十萬(wàn)或者數(shù)百萬(wàn)時(shí)块饺,系統(tǒng)一個(gè)較小的抖動(dòng)就會(huì)導(dǎo)致很嚴(yán)重的后果赞辩,例如服務(wù)端的GC,導(dǎo)致應(yīng)用暫停(STW)的GC持續(xù)幾秒授艰,就會(huì)導(dǎo)致海量的設(shè)備端設(shè)備掉線或者消息積壓辨嗽,一旦系統(tǒng)恢復(fù),會(huì)有海量的設(shè)備接入或者海量的數(shù)據(jù)發(fā)送淮腾,很可能瞬間就把服務(wù)器沖垮糟需。
IoT設(shè)備接入通常來說,有如下特點(diǎn):
- 使用的網(wǎng)絡(luò)主要是移動(dòng)網(wǎng)絡(luò)谷朝,網(wǎng)絡(luò)質(zhì)量不穩(wěn)定洲押,例如在一些偏遠(yuǎn)地區(qū)、丘陵地帶等信號(hào)很差圆凰,網(wǎng)絡(luò)容易閃斷杈帐;
- 海量的端測(cè)設(shè)備接入,而且通常使用長(zhǎng)連接专钉,服務(wù)端的壓力很大
- 不穩(wěn)定挑童,消息丟失,重復(fù)發(fā)送驶沼,延遲送達(dá)炮沐,過期發(fā)送時(shí)有發(fā)生
- 協(xié)議不統(tǒng)一,有各種私有協(xié)議回怜,開發(fā)和測(cè)試成本較高
要想實(shí)現(xiàn)海量設(shè)備的接入大年,需要對(duì)操作系統(tǒng)相關(guān)參數(shù)、Netty框架玉雾、JVM GC參數(shù)翔试,甚至業(yè)務(wù)代碼針對(duì)性的優(yōu)化,各種優(yōu)化要素互相影響复旬,設(shè)置或者組合不當(dāng)就容易導(dǎo)致性能問題垦缅,這也是服務(wù)端實(shí)現(xiàn)海量設(shè)備接入的最大挑戰(zhàn)。
2驹碍、操作系統(tǒng)參數(shù)調(diào)優(yōu)
要實(shí)現(xiàn)百萬(wàn)級(jí)的長(zhǎng)連接接入壁涎,首先需要對(duì)服務(wù)端的操作系統(tǒng)參數(shù)進(jìn)行性能優(yōu)化凡恍,如果保持出廠的默認(rèn)設(shè)置,性能是無(wú)法滿足業(yè)務(wù)需求怔球。
1嚼酝、文件描述符
- 設(shè)置系統(tǒng)最大文件句柄數(shù)
//查看
cat /proc/sys/fs/file-max
//修改
在 /etc/sysctl.conf 插入 fs.file-max = 1000000
//配置生效
sysctl -p
- 設(shè)置單進(jìn)程打開的最大句柄數(shù)
2、TCP/IP相關(guān)參數(shù)
3竟坛、多網(wǎng)卡隊(duì)列和軟中斷
3闽巩、Netty性能調(diào)優(yōu)
1、設(shè)置合理的線程數(shù)
boss線程池優(yōu)化
對(duì)于Netty服務(wù)端担汤,通常只需要啟動(dòng)一個(gè)監(jiān)聽端口用于端側(cè)設(shè)備接入涎跨,但是如果集群實(shí)例較少,甚至是單機(jī)部署崭歧,那么在短時(shí)間內(nèi)大量設(shè)備接入時(shí)隅很,需要對(duì)服務(wù)端的監(jiān)聽方式和線程模型做優(yōu)化,即服務(wù)端監(jiān)聽多個(gè)端口率碾,利用主從Reactor線程模型外构。由于同時(shí)監(jiān)聽了多個(gè)端口,每個(gè)ServerSocketChannel都對(duì)應(yīng)一個(gè)獨(dú)立的Acceptor線程播掷,這樣就能并行處理,加速端側(cè)設(shè)備的接人速度撼班,減少端側(cè)設(shè)備的連接超時(shí)失敗率歧匈,提高單節(jié)點(diǎn)服務(wù)端的處理性能。work線程池優(yōu)化(I/O工作線程池)
對(duì)于I/O工作線程池的優(yōu)化砰嘁,可以先采用系統(tǒng)默認(rèn)值(cpu內(nèi)核數(shù)*2)進(jìn)行性能測(cè)試件炉,在性能測(cè)試過程中采集I/O線程的CPU占用大小,看是否存在瓶頸矮湘,具體策略如下:
2斟冕、心跳優(yōu)化
心跳檢測(cè)周期通常不要超過60s,心跳檢測(cè)超時(shí)通常為心跳檢測(cè)周期的2倍
3缅阳、接收和發(fā)送緩沖區(qū)調(diào)優(yōu)
4磕蛇、合理使用內(nèi)存池
5、防止I/O線程被意外阻塞
通常情況下十办,我們是不能再Netty的I/O線程上做執(zhí)行時(shí)間不可控的操作秀撇,例如訪問數(shù)據(jù)庫(kù),調(diào)用第三方服務(wù)等向族。
6呵燕、I/O線程與業(yè)務(wù)線程分離
7、針對(duì)端測(cè)并發(fā)連接數(shù)的流控
無(wú)論服務(wù)端的性能優(yōu)化到多少件相,都需要考慮流控功能再扭,當(dāng)資源成為瓶頸氧苍,或者遇到端側(cè)設(shè)備的大量接入,
4泛范、JVM相關(guān)性能調(diào)優(yōu)
總結(jié):以上這些調(diào)優(yōu),都屬于小方法敦跌,小技巧澄干,如果系統(tǒng)對(duì)性能要求很高,最優(yōu)的還是采用分布式集群的方式來提升整個(gè)服務(wù)端的處理能力柠傍。