### 多線程、協(xié)程并行化
雖然硬件架構(gòu)的復(fù)雜化對(duì)程序開發(fā)提出了更高的要求,但編寫充分利用多CPU多核特性的程序能獲得令人驚嘆的收益,所以,在同樣硬件規(guī)格下,基于多線程/協(xié)程的并行化改造依然值得嘗試 。
多線程不可避免要面臨資源競爭的問題,我們的設(shè)計(jì)目標(biāo)應(yīng)該是充分利用硬件多執(zhí)行核心的優(yōu)勢(shì),減少等待,讓多個(gè)執(zhí)行流暢快的奔跑起來 。
對(duì)于多線程模型,如果把每一個(gè)要干的活抽象為一個(gè)task,把干活的線程抽象為worker,那么,有兩種典型的設(shè)計(jì)思路,一種是對(duì)task類型做出劃分,讓一類或者一個(gè)worker去干特定的task,另一種是讓所有worker去干所有task 。
第一種劃分,能減少數(shù)據(jù)爭用,編碼實(shí)現(xiàn)也更簡單,只需要識(shí)別有限的競爭,就能讓系統(tǒng)工作的很好,缺點(diǎn)是任務(wù)的工作量很可能不同,有可能導(dǎo)致有些worker忙碌而另一些空閑 。
第二種劃分,優(yōu)點(diǎn)是能均衡,缺點(diǎn)是編碼復(fù)雜性高,數(shù)據(jù)競爭多 。
有時(shí)候,我們會(huì)綜合上述兩種模式,比如讓單獨(dú)的線程去做IO(收發(fā)包)+反序列化(產(chǎn)生protocol task),然后啟動(dòng)一批worker線程去處理包,中間通過一個(gè)task queue去連接,這即是經(jīng)典的生產(chǎn)者消費(fèi)者模型 。
協(xié)程是一種用戶態(tài)的多執(zhí)行流,它基于一個(gè)假設(shè),即用戶態(tài)的任務(wù)切換成本低于系統(tǒng)的線程切換 。
### 通知替代輪詢
輪詢即不停詢問,就像你每隔幾分鐘去一趟宿管那里查看是否有信件,而通知是你告訴宿管阿姨,你有信的時(shí)候,她打電話通知你,顯然輪詢耗費(fèi)CPU,而通知機(jī)制效率更高 。
### 添加緩存
緩存的理論依據(jù)是局部性原理 。
一般系統(tǒng)的寫入請(qǐng)求遠(yuǎn)少于讀請(qǐng)求,針對(duì)寫少讀多的場(chǎng)景,很適合引入緩存集群 。
在寫數(shù)據(jù)庫的時(shí)候同時(shí)寫一份數(shù)據(jù)到緩存集群里,然后用緩存集群來承載大部分的讀請(qǐng)求,因?yàn)榫彺婕汉苋菀鬃龅礁咝阅?,所以,這樣的話,通過緩存集群,就可以用更少的機(jī)器資源承載更高的并發(fā) 。
緩存的命中率一般能做到很高,而且速度很快,處理能力也強(qiáng)(單機(jī)很容易做到幾萬并發(fā)),是理想的解決方案 。
CDN本質(zhì)上就是緩存,被用戶大量訪問的靜態(tài)資源緩存在CDN中是目前的通用做法 。
### 消息隊(duì)列
消息隊(duì)列、消息中間件是用來做寫請(qǐng)求異步化,我們把數(shù)據(jù)寫入MessageQueue就認(rèn)為寫入完成,由MQ去緩慢的寫入DB,它能起到削峰填谷的效果 。
消息隊(duì)列也是解耦的手段,它主要用來解決寫的壓力 。
### IO與邏輯分離、讀寫分離
IO與邏輯分離,這個(gè)前面已經(jīng)講了 。讀寫分離是一種數(shù)據(jù)庫應(yīng)對(duì)壓力的慣用措施,當(dāng)然,它也不僅限于DB 。
### 批處理與數(shù)據(jù)預(yù)取
批處理是一種思想,分很多種應(yīng)用,比如多網(wǎng)絡(luò)包的批處理,是指把收到的包攢到一起,然后一起過一遍流程,這樣,一個(gè)函數(shù)被多次調(diào)用,或者一段代碼重復(fù)執(zhí)行多遍,這樣i-cache的局部性就很好,另外,如果這個(gè)函數(shù)或者一段里要訪問的數(shù)據(jù)被多次訪問,d-cache的局部性也能改善,自然能提升性能,批處理能增加吞吐,但通常會(huì)增大延遲 。
另一個(gè)批處理思想的應(yīng)用是日志落盤,比如一條日志大概寫幾十個(gè)字節(jié),我們可以把它緩存起來,攢夠了一次寫到磁盤,這樣性能會(huì)更好,但這也帶來數(shù)據(jù)丟失的風(fēng)險(xiǎn),不過通常我們可以通過shm的方式規(guī)避這個(gè)風(fēng)險(xiǎn) 。
指令預(yù)取是CPU自動(dòng)完成的,數(shù)據(jù)預(yù)取是一個(gè)很有技巧性的工作,數(shù)據(jù)預(yù)取的依據(jù)是預(yù)取的數(shù)據(jù)將在接下來的操作中用到,它符合空間局部性原理,數(shù)據(jù)預(yù)取可以填充流水線,降低訪存等待,但數(shù)據(jù)預(yù)取會(huì)侵害代碼,且并不總?cè)珙A(yù)期般有效 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- seo白帽和黑帽區(qū)別 seo白帽優(yōu)化技術(shù)
- vray常用材質(zhì)參數(shù)大全 vray玻璃材質(zhì)怎么調(diào)
- SEO重要的標(biāo)簽 seo標(biāo)簽怎么優(yōu)化
- 經(jīng)常用酵母蒸饅頭到底好不好 經(jīng)常用酵母蒸饅頭好嗎
- SEO關(guān)鍵詞排名優(yōu)化 有哪些網(wǎng)站可以推廣
- 常用Linux網(wǎng)絡(luò)命令匯總 linux打開網(wǎng)頁命令
- 酒店常用的滅火器有哪些呢
- 超詳細(xì)的 JS 數(shù)組方法 js的數(shù)組有哪些常用方法
- excel最常用的八個(gè)函數(shù) 函數(shù)的應(yīng)用知識(shí)點(diǎn)
- 住酒店日常英語口語對(duì)話 酒店常用英語口語
