高性能是什么?其本質(zhì)是什么東東?
高性能涉及的東西有很多,該怎么才能記住呢?
我覺得這是一個很有代表性的問題,相信很多人都有類似的困惑,所以決定寫篇文章來好好聊聊這個問題。
確實是這樣,當(dāng)初在準(zhǔn)備高性能相關(guān)的面試問題時,也是同樣的感受,有好多東西啊,該想個什么辦法把它們都串起來呢?
計算機運行的本質(zhì),或者說程序執(zhí)行的本質(zhì),就是CPU不斷取出內(nèi)存中的指令,然后執(zhí)行它。
在這個過程中,CPU需要與內(nèi)存打交道,因為程序指令在這里面;還需要與硬盤、網(wǎng)卡等一些外部設(shè)備打交道,存儲數(shù)據(jù)、傳輸數(shù)據(jù)。
CPU、內(nèi)存、外部設(shè)備,這三個是計算機最主要的三個東西,所以我們在思考高性能的問題時,圍繞這三個東西,就可以把很多技術(shù)串起來。
1、讓CPU執(zhí)行指令更快一點
程序是CPU在執(zhí)行,最容易想到的當(dāng)然就是讓CPU跑的更快一些。這方面主要是涉及硬件技術(shù),跟軟件關(guān)系不大。
比如提高CPU主頻、指令流水線技術(shù)、亂序執(zhí)行、分支預(yù)測等等。
2、使用緩存
程序運行經(jīng)常需要讀取和加載數(shù)據(jù),當(dāng)程序經(jīng)常需要從一個慢速設(shè)備讀取數(shù)據(jù)時,性能勢必會受到影響。所以,可以先把數(shù)據(jù)緩存到一個能快速獲取的地方,加快數(shù)據(jù)加載速度,然后選擇適當(dāng)?shù)臅r機來更新緩存中的數(shù)據(jù)。
緩存技術(shù)在計算機中無處不在,CPU中有存放數(shù)據(jù)和指令的一二三級緩存,還有存放內(nèi)存地址翻譯的TLB緩存。
操作系統(tǒng)中的文件系統(tǒng)管理硬盤數(shù)據(jù)也使用了頁緩存Page Cache。
后端服務(wù)為了快速獲取數(shù)據(jù),使用Redis/Memcache作為內(nèi)存數(shù)據(jù)緩存,避免每次都從數(shù)據(jù)庫中查詢。
瀏覽器中為了加快渲染速度,也有前端資源的緩存,避免每次都找網(wǎng)站服務(wù)器請求。
網(wǎng)站服務(wù)器為了提高響應(yīng)速度,也有CDN緩存。
3、減少CPU被打斷次數(shù)
CPU在運行過程中不是一直埋頭執(zhí)行程序,它時不時的會被打斷,這就是中斷。
最典型的就是網(wǎng)絡(luò)數(shù)據(jù)包處理,如果在很大網(wǎng)絡(luò)流量下,網(wǎng)卡每來一個數(shù)據(jù)包都通過中斷告訴CPU,那CPU一天別干活了,煩都要煩死了。
所以Linux內(nèi)核中的NAPI技術(shù)通過輪詢網(wǎng)卡,減少中斷次數(shù)就能顯著提高性能。
另外DMA技術(shù)通過把數(shù)據(jù)傳輸?shù)墓ぷ魍獍鋈?,解放CPU,也是這一思想的應(yīng)用。
4、減少內(nèi)存拷貝
很多時候,程序需要頻繁拷貝數(shù)據(jù),但拷貝數(shù)據(jù)的過程時比較耗時的,如果能減少拷貝的次數(shù),無疑會提高程序性能。
比如內(nèi)存映射、零拷貝技術(shù)就屬于這一類技術(shù)。
另外高性能抓包技術(shù)DPDK,讓應(yīng)用程序直接讀取網(wǎng)卡,減少數(shù)據(jù)拷貝也是這種思想的體現(xiàn)。
5、并行與并發(fā)
這個思想很直接,一個人干活忙不過來,那就多找?guī)讉€人一起干。并行與并發(fā)的思想同樣在計算機領(lǐng)域無處不在。
如CPU的多核技術(shù),超線程技術(shù)、單指令多數(shù)據(jù)技術(shù)SIMD等。
多線程技術(shù)、NUMA技術(shù)、多節(jié)點負(fù)載均衡技術(shù)等。
后端服務(wù)開發(fā)中的I/O多路復(fù)用技術(shù)(select/poll/epoll)。
6、減少鎖的競爭
前面提到多線程技術(shù),而提到多線程就離不開鎖。很多時候,線程在鎖的競爭上浪費了太多時間,上下文的切換這些都需要有開銷。
所以減少鎖的競爭也是提高性能的一種方式,這方面的技術(shù)有原子操作、無鎖編程等。
7、資源池化技術(shù)
很多程序運行啟動時就預(yù)先分配好資源,而不是在需要的時候才去分配,這也是一種提高性能的方法。最常見的有線程池、內(nèi)存池。
8、減少I/O次數(shù)
程序運行的時候經(jīng)常要從硬盤上讀取數(shù)據(jù),而這類操作是非常耗時的,如果能減少I/O的次數(shù),合并I/O次數(shù),對性能的提升將是巨大的。
體現(xiàn)這類思想的技術(shù)有B+樹、SQL批量執(zhí)行等。
9、良好的數(shù)據(jù)結(jié)構(gòu)與算法
程序的靈魂是數(shù)據(jù)結(jié)構(gòu)與算法,前面說了那么多,即便都做到了,但如果你的數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計的一塌糊涂那也是白搭。
良好的數(shù)據(jù)結(jié)構(gòu)與算法能夠從根本上解決高性能的問題。
這方面思想的體現(xiàn)有哈希表、B+樹、跳表等。
總結(jié)
上面這幾個點不是孤立存在的,很多時候都是互相交織在一起的綜合應(yīng)用。比如零拷貝技術(shù),既是減少內(nèi)存拷貝的思想,也是減少打擾CPU的思想。在I/O多路復(fù)用epoll中,既是并發(fā)思想體現(xiàn),也有減少內(nèi)存拷貝思想的體現(xiàn)。
最后來總結(jié)一下,下次回答提高性能可以從四個增加、四個減少、一個良好來展開:
增加CPU速度、增加緩存、增加并行度、增加資源池
減少內(nèi)存拷貝、減少I/O次數(shù)、減少CPU被打斷次數(shù)、減少鎖競爭
良好的數(shù)據(jù)結(jié)構(gòu)與算法
本文使用 文章同步助手 同步