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