摘要:所謂高并發(fā),就是同一時間有很多流量通常指用戶訪問程序的接口頁面及其他資源,解決高并發(fā)就是當(dāng)流量峰值到來時保證程序的穩(wěn)定性。索引多主多從分布式數(shù)據(jù)庫緩存連接池消息隊(duì)列等是從數(shù)據(jù)庫方便考慮如何優(yōu)化性能。
所謂高并發(fā),就是同一時間有很多流量(通常指用戶)訪問程序的接口、頁面及其他資源,解決高并發(fā)就是當(dāng)流量峰值到來時保證程序的穩(wěn)定性。
我們一般用QPS(每秒查詢數(shù),又叫每秒請求數(shù))來衡量程序的綜合性能,數(shù)值越高越好,一般需要壓測(ab工具)得到數(shù)據(jù)。
假設(shè)我們的一個進(jìn)程(也可以是線程或者協(xié)程)處理一次請求花費(fèi)了50毫秒(業(yè)內(nèi)達(dá)標(biāo)范圍一般是20毫秒至60毫秒),那么1秒鐘就可以處理20個請求,一臺服務(wù)器是可以開很多這樣的進(jìn)程并行去處理請求的,比如開了128個,那么這臺機(jī)器理論上的QPS=2560。
千萬不要小瞧這個數(shù)字,當(dāng)你的QPS真有這么高的時候意味著你的DAU(用戶日活)有2560*200=51.2萬,業(yè)內(nèi)一般是放大200倍計(jì)算,有這樣的日活說明做得很不錯了。
一臺服務(wù)器能夠達(dá)到的最大QPS受很多因素的影響,比如機(jī)器參數(shù)配置、機(jī)房地理位置、CPU性能、內(nèi)存大小、磁盤性能、帶寬大小、程序語言、數(shù)據(jù)庫性能、程序架構(gòu)等,我們一一細(xì)說。
1.機(jī)器參數(shù)配置這個很好理解,比如服務(wù)器最大可以開啟128個進(jìn)程,你設(shè)置了最大只開啟100個,這屬于服務(wù)器調(diào)優(yōu)。
2.機(jī)房地理位置如果你做海外用戶,服務(wù)器機(jī)房應(yīng)該選擇國外的,反之應(yīng)該選擇國內(nèi)的,因?yàn)闄C(jī)房距離用戶越近,在傳輸上的時間損耗就越低。
3.CPU性能CPU性能越好,處理速度就越快,核心數(shù)越多,能夠并行開啟的進(jìn)程就越多。
4.內(nèi)存大小內(nèi)存越大,程序就能把更多的數(shù)據(jù)直接放到內(nèi)存,從內(nèi)存讀取數(shù)據(jù)比從磁盤讀取數(shù)據(jù)的速度快很多。
5.磁盤性能這個不用多說吧,一般固態(tài)硬盤的性能比機(jī)械硬盤的性能好很多,性能越好讀寫數(shù)據(jù)的速度就越快。
6.帶寬大小服務(wù)器的帶寬一般指流出帶寬,單位為Mb/S,比如帶寬為8Mb/S即1MB/S,如果提供文件下載服務(wù),可能一個用戶的下載行為就把服務(wù)器帶寬用完了。
一般把圖片、視頻、css文件、JavaScript腳本等資源放到第三方的CDN去,按流量計(jì)費(fèi),這樣就不占用服務(wù)器帶寬了。
如果用戶規(guī)模小,基本上一臺服務(wù)器就好了,這個時候一般會選按固定帶寬大小計(jì)費(fèi)。
如果用戶規(guī)模很大了,基本上會用到負(fù)載均衡器來分流,即把流量按照一定的規(guī)則分配到不同的服務(wù)器上,負(fù)載均衡器一般會按流量來計(jì)費(fèi)。
如果平均一次請求返回的數(shù)據(jù)大小為50KB,為了達(dá)到1000QPS這個指標(biāo),需要的帶寬峰值=1000*50*8/1024=390.625Mb/S。
我們在設(shè)計(jì)接口的時候應(yīng)該盡量減少返回的數(shù)據(jù)大小,比如user_id就可以簡化為uid,像圖片、視頻、css等文件壓縮的目的就是減少數(shù)據(jù)的大小。
7.程序語言編譯型語言的性能一般好于解釋型語言的性能,比如go語言性能就好于php語言性能,當(dāng)語言短期不會替換時,可以通過堆機(jī)器解決高并發(fā)問題。
8.數(shù)據(jù)庫性能一臺服務(wù)器上部署的數(shù)據(jù)庫總是有一個瓶頸的,比如每秒查詢數(shù)、每秒寫入數(shù)。
我們可以通過增加很多從庫解決查詢(select語句)的瓶頸,稱之為多從庫模型,需要注意的是主從同步數(shù)據(jù)可能有延遲,當(dāng)修改數(shù)據(jù)后馬上需要查詢時需要設(shè)置強(qiáng)制從主庫讀取。
我們可以將業(yè)務(wù)拆分,讓某些表存儲在一個數(shù)據(jù)庫實(shí)例上,另一些表存儲在其他數(shù)據(jù)庫實(shí)例上,雖然一個數(shù)據(jù)庫實(shí)例有自己的瓶頸,但是很多的數(shù)據(jù)庫實(shí)例堆積起來性能就會大大改善,多個數(shù)據(jù)庫實(shí)例的方案稱之為多主庫模型,主要是為了解決寫入瓶頸(insert語句、update語句、delete語句)。
如果你有多個主庫又有多個從庫,你就實(shí)現(xiàn)了多主多從模型。
如果一個表存儲的數(shù)據(jù)量很大,這個時候就要考慮分表了(一般用中間件實(shí)現(xiàn)),比如按時間分表或者按用戶分表,當(dāng)把一個表的所有分表都放在一個數(shù)據(jù)庫實(shí)例上都滿足不了要求的時候,你應(yīng)該把某些分表存儲在新的數(shù)據(jù)庫實(shí)例上,這個時候一個表的數(shù)據(jù)分布到了不同的數(shù)據(jù)庫實(shí)例上,這就是所謂的分布式數(shù)據(jù)庫方案了,你需要處理的事情就很復(fù)雜了,比如處理分布式事務(wù)。
數(shù)據(jù)庫的并發(fā)連接數(shù)也是有限制的,我們可以用連接池技術(shù)來應(yīng)對,就是保持一定數(shù)量的和數(shù)據(jù)庫的連接不斷開的長連接,需要連接數(shù)據(jù)庫的時候就從池子里選擇一個連接,用完放回去就好了,這個一般也是用中間件來實(shí)現(xiàn)。
好的索引也能提高數(shù)據(jù)庫的性能,有時候比堆多個從庫的方案還要好。
如果能夠減少數(shù)據(jù)庫的讀寫,也算間接提高了數(shù)據(jù)庫的性能,比如我們用redis來做緩存,用消息隊(duì)列異步落庫等。
有時候某些數(shù)據(jù)用數(shù)據(jù)庫來計(jì)算需要很長時間,可以取到元數(shù)據(jù)(最小粒度的數(shù)據(jù))用程序來計(jì)算,這稱之為用內(nèi)存換時間。
9.程序架構(gòu)比如實(shí)現(xiàn)同樣的功能,初級程序員寫的程序需要循環(huán)100次,而高級程序員寫的程序只需要循環(huán)10次,效果肯定不一樣。
總結(jié)一般大型項(xiàng)目基本是前后端分離的,從性能方面說就是為了將頁面渲染的處理在客戶端運(yùn)行,降低服務(wù)器的壓力。
從帶寬層面考慮,css、圖片、視頻、JavaScript等文件資源能用CDN的就用CDN,能壓縮的就盡量壓縮,接口能減小返回?cái)?shù)據(jù)的大小就盡量減小。
為了解決編程語言的不足或者單臺服務(wù)器的瓶頸,可以先堆機(jī)器應(yīng)對。
索引、多主多從、分布式數(shù)據(jù)庫、緩存、連接池、消息隊(duì)列等是從數(shù)據(jù)庫方便考慮如何優(yōu)化性能。
有時候程序的低耦合性比程序的高性能更重要,不要一味地追求高性能。
TODO持續(xù)更新
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29616.html
摘要:背景在開發(fā)好頁面后,如何讓頁面更快更好的運(yùn)行,是區(qū)分一個程序猿技術(shù)水平和視野的一個重要指標(biāo)。在對這些環(huán)節(jié)進(jìn)行優(yōu)化之前,我們需要知道如何監(jiān)控這些環(huán)節(jié)花費(fèi)了多少時間。為了優(yōu)化鏈接的環(huán)節(jié),前端這里還需要對資源使用,雪碧圖,代碼合并等手段。 背景 在開發(fā)好頁面后,如何讓頁面更快更好的運(yùn)行,是區(qū)分一個程序猿技術(shù)水平和視野的一個重要指標(biāo)。所以面試時,面試官總會問你一個問題,如何進(jìn)行性能優(yōu)化呢? 如...
摘要:目前是剛到美國個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。國內(nèi)說到關(guān)系,大多是負(fù)面的,但是美國這邊叫,他們確實(shí)對這個很推崇的。 前言:先自我介紹一下,我是新晉前端小白白,15年畢業(yè)之后,在相關(guān)領(lǐng)域工作3年,但一直都在自我提升階段。目前是剛到美國2個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。愿同道中人共同進(jìn)步!有...
摘要:目前是剛到美國個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。國內(nèi)說到關(guān)系,大多是負(fù)面的,但是美國這邊叫,他們確實(shí)對這個很推崇的。 前言:先自我介紹一下,我是新晉前端小白白,15年畢業(yè)之后,在相關(guān)領(lǐng)域工作3年,但一直都在自我提升階段。目前是剛到美國2個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。愿同道中人共同進(jìn)步!有...
摘要:目前是剛到美國個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。國內(nèi)說到關(guān)系,大多是負(fù)面的,但是美國這邊叫,他們確實(shí)對這個很推崇的。 前言:先自我介紹一下,我是新晉前端小白白,15年畢業(yè)之后,在相關(guān)領(lǐng)域工作3年,但一直都在自我提升階段。目前是剛到美國2個多月,分享在美國求職的經(jīng)歷,目前已有面試進(jìn)入背調(diào)階段,把我期間的準(zhǔn)備分享給大家。愿同道中人共同進(jìn)步!有...
閱讀 1192·2021-11-23 10:10
閱讀 1525·2021-09-30 09:47
閱讀 909·2021-09-27 14:02
閱讀 2987·2019-08-30 15:45
閱讀 3031·2019-08-30 14:11
閱讀 3625·2019-08-29 14:05
閱讀 1832·2019-08-29 13:51
閱讀 2215·2019-08-29 11:33