大(da)家(jia)都聽過這樣的(de)(de)(de)(de)(de)一(yi)(yi)句話(hua):在物聯網(wang)大(da)數據的(de)(de)(de)(de)(de)場景(jing)之下(xia),TDengine最(zui)大(da)的(de)(de)(de)(de)(de)優勢之一(yi)(yi),就是(shi)寫入(ru)速度——這是(shi)由于(yu)TDengine獨特設(she)計的(de)(de)(de)(de)(de)成果。但(dan)是(shi),一(yi)(yi)些用戶(hu)(hu)在初次使(shi)用TDengine的(de)(de)(de)(de)(de)時候會覺(jue)得寫入(ru)性能并沒有(you)達到自己的(de)(de)(de)(de)(de)預期。這些用戶(hu)(hu)中,有(you)的(de)(de)(de)(de)(de)是(shi)直接使(shi)用TDengine的(de)(de)(de)(de)(de)服(fu)務(wu)端,有(you)的(de)(de)(de)(de)(de)是(shi)使(shi)用了TDengine的(de)(de)(de)(de)(de)客戶(hu)(hu)端,還有(you)的(de)(de)(de)(de)(de)用戶(hu)(hu)使(shi)用各種不同的(de)(de)(de)(de)(de)連接器,可以說是(shi)形形色(se)色(se)不一(yi)(yi)而(er)同。
那么——究(jiu)竟要如何解決這些種類(lei)繁多的寫入“慢”呢(ni)?我們(men)提倡的思路就(jiu)是——在確(que)保(bao)服務端(duan)本身的參數和配置已經調整到最(zui)優的情況(kuang)下,逐(zhu)層向(xiang)外排查硬件軟件網(wang)絡等因素。
對(dui)于(yu)通過連(lian)接器(qi)使(shi)用(yong)TDengine的(de)(de)用(yong)戶來說(shuo),由于(yu)涉及了更(geng)多的(de)(de)模塊介入以及網絡問題(ti),遇到性(xing)能(neng)問題(ti)要(yao)稍微(wei)麻煩一(yi)些。但即便如此,也要(yao)對(dui)數據庫本身的(de)(de)做好(hao)性(xing)能(neng)相關的(de)(de)配置。而在(zai)此之前,用(yong)“我的(de)(de)xxxx連(lian)接器(qi)寫數據特別慢”是不(bu)(bu)精準且不(bu)(bu)利于(yu)排查問題(ti)的(de)(de)。
所以不論(lun)你(ni)的(de)場景多么復雜,我們都要首先去服(fu)務端(duan)檢測TDengine的(de)性能。而最省(sheng)時高效的(de)方法就(jiu)是(shi)(shi)使用官方的(de)工具taosdemo觀(guan)察寫入速度(du)是(shi)(shi)否(fou)大致相同。這(zhe)樣做的(de)好處(chu)是(shi)(shi),可(ke)以在第一時間定位(wei)問題(ti)是(shi)(shi)否(fou)出現在數據庫服(fu)務端(duan)本身。然后,我們就(jiu)可(ke)以針對性地排查其(qi)余因素。比如服(fu)務端(duan)與(yu)客(ke)戶(hu)端(duan)的(de)網(wang)絡通信,客(ke)戶(hu)端(duan)內部是(shi)(shi)否(fou)異常。
taosdemo的具(ju)體使用方式可以通過使用“taosdemo –help”來(lai)(lai)了解,這個工(gong)(gong)具(ju)可以通過設置表數量、表行(xing)數、數據(ju)(ju)類型(xing)、單批插入(ru)行(xing)數,甚至模擬亂(luan)序寫入(ru)等高級功能來(lai)(lai)模擬出你在工(gong)(gong)作使用中遇(yu)到的類似(si)場景。跑起來(lai)(lai)后(hou),taosdemo會自動(dong)生(sheng)成數據(ju)(ju)完成寫入(ru),并在最(zui)后(hou)給(gei)出性(xing)能數據(ju)(ju)。
如果在使用taosdemo依然性能很慢(man)的話(hua),我(wo)們就(jiu)可以做如下優化(hua)了:
1. 要(yao)提(ti)高(gao)(gao)寫(xie)入(ru)(ru)效率,不(bu)能(neng)一(yi)次insert只寫(xie)入(ru)(ru)一(yi)條(tiao)(tiao)記錄(lu),那樣將(jiang)是(shi)對(dui)資源的(de)浪費。建議(yi)一(yi)條(tiao)(tiao)SQL語句(ju)寫(xie)入(ru)(ru)多(duo)(duo)條(tiao)(tiao)記錄(lu),一(yi)次寫(xie)入(ru)(ru)的(de)記錄(lu)條(tiao)(tiao)數(shu)越多(duo)(duo),插入(ru)(ru)效率就越高(gao)(gao)。典(dian)型的(de)情況是(shi),一(yi)條(tiao)(tiao)SQL寫(xie)入(ru)(ru)多(duo)(duo)個表各(ge)一(yi)條(tiao)(tiao)記錄(lu),如:insert into tb1 values(….) tb2 values(….) tb3 values(…)。但一(yi)條(tiao)(tiao)記錄(lu)不(bu)能(neng)超(chao)過(guo)16K,一(yi)條(tiao)(tiao)SQL語句(ju)總長(chang)度不(bu)能(neng)超(chao)過(guo)64K(可(ke)通(tong)過(guo)參數(shu)maxSQLLength配置(zhi)(zhi),最大可(ke)配置(zhi)(zhi)為1M,具體內容官方文檔(dang)可(ke)查)。在使用(yong)taosdemo模(mo)擬的(de)時候,可(ke)以(yi)通(tong)過(guo)-r參數(shu)來(lai)指定單次insert的(de)寫(xie)入(ru)(ru)行數(shu),但是(shi)要(yao)注(zhu)意(yi)計(ji)算SQL長(chang)度不(bu)要(yao)超(chao)過(guo)maxSQLLength。
注:當前(qian)最新的版本(2.1.0)里taosdemo的默認(ren)maxSQLLength已經為1MB,無需自己調整(zheng)。
2.TDengine支持多線(xian)程(cheng)同時寫(xie)入,要進一(yi)步提(ti)高寫(xie)入速(su)度,一(yi)個(ge)12核CPU的客戶端可以打開20個(ge)以上的線(xian)程(cheng)同時寫(xie)。但線(xian)程(cheng)數(shu)達到一(yi)定數(shu)量后,速(su)度就無法再提(ti)高,甚至還會下(xia)降,因為線(xian)程(cheng)切(qie)頻(pin)繁切(qie)換,帶來(lai)(lai)額外開銷。在使用taosdemo模(mo)擬的時候,線(xian)程(cheng)數(shu)可以通(tong)過-T來(lai)(lai)指定,一(yi)般為cpu核數(shu)或二(er)倍核數(shu)為最佳。
3. 在大量數據涌入內存(cun)(cun)等待落(luo)盤(pan)的(de)(de)(de)時(shi)(shi)候,vnode虛擬(ni)數據節點的(de)(de)(de)內存(cun)(cun)大小設(she)置就(jiu)顯得(de)尤為(wei)重(zhong)要。cache和blocks這兩(liang)個參數分(fen)別代(dai)表著內存(cun)(cun)塊的(de)(de)(de)大小和塊數,他們(men)的(de)(de)(de)乘積便是(shi)vnode的(de)(de)(de)預留內存(cun)(cun)。對于很多場(chang)景,默認的(de)(de)(de)blocks數量是(shi)不(bu)夠的(de)(de)(de)。當(dang)寫入緩存(cun)(cun)不(bu)夠時(shi)(shi),數據不(bu)能(neng)一(yi)(yi)次落(luo)盤(pan),將會被寫入.last臨時(shi)(shi)文件,客觀上增(zeng)加(jia)磁盤(pan)的(de)(de)(de)IO操(cao)作。這就(jiu)需要根據你(ni)的(de)(de)(de)場(chang)景酌情增(zeng)加(jia)這個參數的(de)(de)(de)值(zhi)(3的(de)(de)(de)倍(bei)數),在觀察(cha)寫入速度是(shi)否提升的(de)(de)(de)同(tong)時(shi)(shi),觀察(cha)內存(cun)(cun)是(shi)否為(wei)性能(neng)瓶頸且保持在一(yi)(yi)個安全的(de)(de)(de)使用范(fan)圍(wei)內,直到找到最優解。
點擊,查看taosdemo的(de)使(shi)用手冊。
在(zai)這個(ge)過程中,大家要(yao)不停(ting)地控制變(bian)量,觀察自(zi)己的性能瓶頸出(chu)現在(zai)哪個(ge)環節。是(shi)預分配的內存(cun)不足,還是(shi)操(cao)作系統內存(cun)不足,抑或(huo)是(shi)CPU吃光,還是(shi)硬盤讀寫極限,然后做一個(ge)針對性的調整。
這樣調整過后(hou),對(dui)于(yu)一(yi)(yi)個直(zhi)接使用TDengine服務端的(de)(de)用戶來講(jiang),基本就算(suan)是(shi)(shi)足夠了(le)。值得(de)一(yi)(yi)提的(de)(de)是(shi)(shi),大家(jia)不用過于(yu)專注于(yu)TDengine每秒寫了(le)多(duo)少行(xing)(xing)。因為每行(xing)(xing)有(you)多(duo)少列(測點)和(he)每一(yi)(yi)列(測點)的(de)(de)數據類(lei)型都是(shi)(shi)不固定的(de)(de)。
而對于使用(yong)(yong)連接(jie)器(qi)或客戶(hu)端的用(yong)(yong)戶(hu)來(lai)說,如果以上(shang)操作(zuo)還(huan)沒有解決(jue)您的寫入(ru)性能(neng)問題,接(jie)下來(lai)我們再來(lai)排(pai)查網絡(luo)、客戶(hu)端、應(ying)用(yong)(yong)層面的因素。
由于服務端依靠網絡和應用或客戶端連接,所以網絡問題是性能問題上不可忽視的環節。這里可以給出一個很典型的代表案例:
某用戶(hu)在(zai)使用C接口(kou)插入數據的時(shi)候曾遇到這樣(yang)這樣(yang)的情況: 插入速度(du)時(shi)快時(shi)慢,整體上比預(yu)期速度(du)慢了不少。
于是,我們一(yi)起配置好了(le)(le)(le)內(nei)存,線程數和單條(tiao)SQL寫(xie)入(ru)行數。可是在那之(zhi)后(hou),問(wen)題(ti)卻依然存在。所以我們又(you)一(yi)起看(kan)了(le)(le)(le)日志發現了(le)(le)(le)一(yi)些關于網(wang)絡(luo)通信的(de)告警提示(shi),再結(jie)合服務器的(de)監控數據,我們初步診斷寫(xie)入(ru)很慢的(de)原因是網(wang)絡(luo)方(fang)面的(de)路由(you)阻塞(sai)。之(zhi)后(hou),該用戶便重新搭建了(le)(le)(le)網(wang)絡(luo)拓撲只使用本地虛(xu)擬機組(zu)成(cheng)局域網(wang),問(wen)題(ti)便消(xiao)失了(le)(le)(le)。
另外,由(you)于TDengine的(de)客(ke)戶端(duan)功能(neng)(neng)很多(負(fu)(fu)責獲(huo)取并緩存元(yuan)數據;將插(cha)入(ru)、查(cha)詢等請求轉發(fa)(fa)到(dao)正確的(de)數據節點;在把結(jie)果返(fan)回給應用時(shi),還需要負(fu)(fu)責最(zui)后(hou)一級的(de)聚合、排序(xu)、過濾等操作)所以(yi)很多時(shi)候(hou),TDengine的(de)性(xing)能(neng)(neng)問題并不是(shi)出在服務端(duan)而是(shi)客(ke)戶端(duan)。當(dang)你(ni)發(fa)(fa)現(xian)你(ni)的(de)性(xing)能(neng)(neng)遲(chi)(chi)遲(chi)(chi)上(shang)不去(qu)的(de)時(shi)候(hou),去(qu)看(kan)一下客(ke)戶端(duan)服務器的(de)后(hou)臺,興許會有驚人(ren)的(de)發(fa)(fa)現(xian)。萬萬沒想到(dao)——客(ke)戶端(duan)也(ye)會成為寫入(ru)性(xing)能(neng)(neng)的(de)瓶頸。這個時(shi)候(hou),就需要你(ni)酌情增加(jia)客(ke)戶端(duan)服務器性(xing)能(neng)(neng)或者(zhe)數量了。
最后,連接器由于(yu)在邏輯上是(shi)(shi)很(hen)薄(bo)的(de)一層,所以它的(de)性能通(tong)常(chang)是(shi)(shi)受相關(guan)語言(yan)自身特性影響,排除遇到bug的(de)情況(kuang)下(xia),一般是(shi)(shi)可以認為是(shi)(shi)沒有優化空間的(de),比如:Java就是(shi)(shi)會比C慢一些。
OK,大概(gai)就是這(zhe)樣了,讀(du)到(dao)這(zhe)里的用戶應(ying)該對(dui)于(yu)TDengine的寫入性能(neng)優化已經有(you)了一(yi)(yi)個(ge)初步(bu)的輪廓(kuo)。這(zhe)樣一(yi)(yi)來,日(ri)后即便是需要官方的技術支持也能(neng)做到(dao)精(jing)準提問,這(zhe)樣對(dui)雙方都將會(hui)是一(yi)(yi)種非常愉快的體驗。對(dui)于(yu)很多社(she)區(qu)版TDengine的新用戶來說,由于(yu)工作時(shi)間緊迫或(huo)者是其他原因,會(hui)導致大家沒(mei)有(you)耐心去一(yi)(yi)步(bu)一(yi)(yi)步(bu)地閱讀(du)文(wen)檔了解產品。
在(zai)這(zhe)個時候(hou),這(zhe)篇文章就(jiu)能(neng)夠發揮(hui)它該有的作用。


























