關於高效能的那點事

2021-09-06 18:54:53 字數 2043 閱讀 1975

園子裡面很多關於高效能,大併發,還有什麼日pv百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求(含db、redis、mongo、mq等)。幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。

找了半天沒有找到那張圖,關於各個元件到cpu的時間週期,我用文字描述一下,l1>l2>memory>disk>internet。

有人說redis效能高,做大併發,大資料訪問必須要用,有人說mongo效能高,什麼zeromq等等一系列的,其實都是渣。

先說網路請求,關於tcp/ip:

大家都知道ip是逐跳協議,也就是說我只能從乙個路由器,到下乙個路由器,再到下乙個路由器,如果你的電腦到伺服器,中途要經過很多個路由器,那時間週期就會長很多很多恨多。為什麼要做cdn、p2p等也是這個考慮,縮短網路的路徑(降低頻寬承載也是一方面)。

再說redis、mongo:

那麼問題來了:怎麼解決呢?

把資料放在記憶體裡面,直接從記憶體取,然後foreach。大部分的應用優化到這裡,基本上應付所謂的日pv百萬,就不是什麼問題了。

到了這一步,那麼問題來了,對於內部應用,比如分布式檔案儲存,資料分析,任務排程。腫麼破?

對於大資料,其實一直是乙個偽命題,資料量太大屬於硬傷。所有的做大資料處理的,都是把資料分成小資料,然後分塊來處理,最後再合併。其實從mysql,oracle,mssql等一系列rmdb的分割槽,分庫上的處理就可以看出來。想要提高效能,必須要做到,每個模組處理的資料量,都是細分到了一定粒度的。這個時候index, group, hash等的重要性,在這裡就體現出來了。

舉個簡單的例子:我有乙個業務系統,每天的日誌大約是10個g,乙個月就大約是300g,一季度大約1t,我需要看每小時/每天/每週/每月/每季度的各種報表,每次都去數t裡面去找,肯定是不可能的。

那麼問題來了:怎麼解決呢?

按業務分析每分鐘的資料,10g/24/60大約7m,然後生成乙個分析後的結果檔案,大約幾k,1小時就是60個檔案,需要檢視每小時的資料,則將60個檔案的結果合併。具體粒度可按具體業務定製,這個是比較簡單的分組的例子。

那我需要檢視某乙個使用者,最近10天來的所有操作/訂單,那原分組方式,已經無法滿足,這個時候怎麼辦呢?

在插入使用者資料的時候,可以按照一定規則,比如使用者編號的後兩位取摸,去儲存在某乙個檔案裡面,10g的資料,則可以相對平均的分配到100個檔案裡面去,需要檢視某使用者時,則可以針對使用者編號取摸,直接定位到那個檔案,然後再去裡面查詢資料。這個是比較簡單的gourp+index。這一塊想明白以後,你就可以在這個基礎上面,寫個定製化的簡單的fs了(當然了,實際情況需要考慮的會更多,包括記憶體換入換出等,不在本文列舉)。

經常聽到有人說,多執行緒的程式還不如單執行緒的程式效能高。那如何編寫乙個能合理利用cpu資源的多執行緒程式?

大家都知道,執行緒切換是需要額外的開銷,所以在編寫多執行緒程式的時候,就需要盡可能的避免共享式資源,這樣就可以在保證資料一致性的同時,而又避開執行緒等待的時間。

舉個簡單的例子:

我有個大的字典(dictionary/map)存放使用者的會話資料,每個執行緒,去這個字典裡面去讀/寫資料的時候,都需要去上鎖,才能保證資料的一致性,如果兩個(更多)執行緒同時去讀/寫資料,其他的執行緒就需要去等待當前執行緒釋放資源,執行緒越多,則等待的機率越大,效能則越差,多執行緒處理變成了單執行緒處理,且等待完了以後,能否再切換回來這個執行緒繼續執行,又是另外乙個開銷,這一部分屬於系統拖託管,屬於不可控的。

那麼問題來了:怎麼解決呢?

根據硬體和實際測試資料,合理分配執行緒資源,比如,我初始化了8個執行緒,每個使用者的請求,對於執行緒總數取摸,保證每個使用者的請求,入同乙個執行緒處理,則可以在每個執行緒內部,存放這些使用者資料,每個執行緒在自己內部進行訪問,避開了lock,也避開了執行緒等待/切換帶來的資源開銷。不取模,隨機分配執行緒,然後用乙個hash表來存放,也可。讓每個執行緒,專注於做自己的事情,任務排程作業,也大是基於這個處理。把執行緒處理機制,放大到虛擬機器/物理機之間的訊息分發,也大是如此。

還有很多很多,不一一枚舉,具體業務,視具體情況而定。

總體來說,避開網路開銷,避開海量資料,避開資源爭奪 是所有高效能的幾個基本要素。

本人對**不做任何智財權限制,也不保證所有的**皆為原創。

關於高效能的那點事

園子裡面很多關於高效能,大併發,還有什麼日pv 百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求 含db redis mongo mq 等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。關於各個元件到cpu 的時...

關於高效能的那點事

園子裡面很多關於高效能,大併發,還有什麼日pv百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求 含db redis mongo mq等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。找了半天沒有找到那張圖,關於各...

關於高效能的那點事

園子裡面很多關於高效能,大併發,還有什麼日pv百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求 含db redis mongo mq等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。找了半天沒有找到那張圖,關於各...