深入了解性能優(yōu)化

個(gè)人專題目錄


深入了解性能優(yōu)化

1.常用的性能評價(jià)/測試指標(biāo)

  • 響應(yīng)時(shí)間

    • 提交請求和返回該請求的響應(yīng)之間使用的時(shí)間,一般比較關(guān)注平均響應(yīng)時(shí)間。
  • 并發(fā)數(shù)

    • 同一時(shí)刻菜拓,對服務(wù)器有實(shí)際交互的請求數(shù)而克。
      和網(wǎng)站在線用戶數(shù)的關(guān)聯(lián):1000個(gè)同時(shí)在線用戶數(shù),可以估計(jì)并發(fā)數(shù)在5%到15%之間乌庶,也就是同時(shí)并發(fā)數(shù)在50~150之間。
  • 吞吐量

    • 對單位時(shí)間內(nèi)完成的工作量(請求)的量度
  • 相互之間的關(guān)系

    • 系統(tǒng)吞吐量和系統(tǒng)并發(fā)數(shù)以及響應(yīng)時(shí)間的關(guān)系:

    理解為高速公路的通行狀況:
    吞吐量是每天通過收費(fèi)站的車輛數(shù)目(可以換算成收費(fèi)站收取的高速費(fèi))契耿,
    并發(fā)數(shù)是高速公路上的正在行駛的車輛數(shù)目瞒大,
    響應(yīng)時(shí)間是車速。
    車輛很少時(shí)搪桂,車速很快透敌。但是收到的高速費(fèi)也相應(yīng)較少;隨著高速公路上車輛數(shù)目的增多踢械,車速略受影響酗电,但是收到的高速費(fèi)增加很快;
    隨著車輛的繼續(xù)增加内列,車速變得越來越慢撵术,高速公路越來越堵,收費(fèi)不增反降话瞧;
    如果車流量繼續(xù)增加嫩与,超過某個(gè)極限后,任務(wù)偶然因素都會導(dǎo)致高速全部癱瘓移稳,車走不動蕴纳,當(dāng)然后也收不著,而高速公路成了停車場(資源耗盡)个粱。

2.常用的性能優(yōu)化手段

  • 總原則

    • 避免過早優(yōu)化

      不應(yīng)該把大量的時(shí)間耗費(fèi)在小的性能改進(jìn)上古毛,過早考慮優(yōu)化是所有噩夢的根源。
      所以都许,我們應(yīng)該編寫清晰稻薇,直接,易讀和易理解的代碼胶征,真正的優(yōu)化應(yīng)該留到以后塞椎,等到性能分析表明優(yōu)化措施有巨大的收益時(shí)再進(jìn)行。
      但是過早優(yōu)化睛低,不表示我們應(yīng)該編寫已經(jīng)知道的對性能不好的的代碼結(jié)構(gòu)案狠。

    • 進(jìn)行系統(tǒng)性能測試

      所有的性能調(diào)優(yōu),都有應(yīng)該建立在性能測試的基礎(chǔ)上钱雷,直覺很重要骂铁,但是要用數(shù)據(jù)說話,可以推測罩抗,但是要通過測試求證拉庵。

    • 尋找系統(tǒng)瓶頸,分而治之套蒂,逐步優(yōu)化

      性能測試后钞支,對整個(gè)請求經(jīng)歷的各個(gè)環(huán)節(jié)進(jìn)行分析茫蛹,排查出現(xiàn)性能瓶頸的地方,定位問題烁挟,分析影響性能的的主要因素是什么婴洼?內(nèi)存、磁盤IO信夫、網(wǎng)絡(luò)窃蹋、CPU,還是代碼問題静稻?架構(gòu)設(shè)計(jì)不足警没?或者確實(shí)是系統(tǒng)資源不足?

  • 前端優(yōu)化手段

    • 瀏覽器/App

      • 減少請求數(shù)振湾;

      合并CSS杀迹,Js,圖片

      • 使用客戶端緩沖押搪;

      靜態(tài)資源文件緩存在瀏覽器中树酪,有關(guān)的屬性Cache-Control和Expires
      如果文件發(fā)生了變化,需要更新大州,則通過改變文件名來解決续语。

      • 啟用壓縮

      減少網(wǎng)絡(luò)傳輸量,但會給瀏覽器和服務(wù)器帶來性能的壓力厦画,需要權(quán)衡使用疮茄。

      • 資源文件加載順序

      css放在頁面最上面,js放在最下面

      • 減少Cookie傳輸

      cookie包含在每次的請求和響應(yīng)中根暑,因此哪些數(shù)據(jù)寫入cookie需要慎重考慮

      • 給用戶一個(gè)提示

      有時(shí)候在前端給用戶一個(gè)提示力试,就能收到良好的效果。畢竟用戶需要的是不要不理他排嫌。

      • CDN加速

      CDN畸裳,又稱內(nèi)容分發(fā)網(wǎng)絡(luò),本質(zhì)仍然是一個(gè)緩存淳地,而且是將數(shù)據(jù)緩存在用戶最近的地方怖糊。無法自行實(shí)現(xiàn)CDN的時(shí)候,可以考慮商用CDN服務(wù)颇象。

      • 反向代理緩存

      將靜態(tài)資源文件緩存在反向代理服務(wù)器上蓬抄,一般是Nginx。

      • WEB組件分離

      將js夯到,css和圖片文件放在不同的域名下∫鳎可以提高瀏覽器在下載web組件的并發(fā)數(shù)耍贾。因?yàn)闉g覽器在下載同一個(gè)域名的的數(shù)據(jù)存在并發(fā)數(shù)限制阅爽。

  • 應(yīng)用服務(wù)性能優(yōu)化

  • 存儲性能優(yōu)化

    • 選擇合適的數(shù)據(jù)結(jié)構(gòu)

    選擇ArrayList和LinkedList對我們的程序性能影響很大,為什么荐开?因?yàn)锳rrayList內(nèi)部是數(shù)組實(shí)現(xiàn)付翁,存在著不停的擴(kuò)容和數(shù)據(jù)復(fù)制。

    • 選擇更優(yōu)的算法

    舉個(gè)例子晃听,最大子列和問題:
    給定一個(gè)整數(shù)序列百侧,a0, a1, a2, …… , an(項(xiàng)可以為負(fù)數(shù)),求其中最大的子序列和能扒。
    如果所有整數(shù)都是負(fù)數(shù)佣渴,那么最大子序列和為0;
    例如(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時(shí)初斑,
    最大子段和為20辛润,子段為a[2],a[3],a[4]。
    最壞的算法:窮舉法见秤,所需要的的計(jì)算時(shí)間是O(n^3).
    一般的算法:分治法的計(jì)算時(shí)間復(fù)雜度為O(nlogn).
    最好的算法:最大子段和的動態(tài)規(guī)劃算法砂竖,計(jì)算時(shí)間復(fù)雜度為O(n)
    n越大,時(shí)間就相差越大鹃答,比如10000個(gè)元素乎澄,最壞的算法和最好的算法之間的差距絕非多線程或者集群化能輕松解決的。

    • 編寫更少的代碼

    同樣正確的程序测摔,小程序比大程序要快置济,這點(diǎn)無關(guān)乎編程語言。

3.應(yīng)用服務(wù)性能優(yōu)化

  • 緩存

    • 緩存的基本原理和本質(zhì)
      • 緩存是將數(shù)據(jù)存在訪問速度較高的介質(zhì)中避咆≈廴猓可以減少數(shù)據(jù)訪問的時(shí)間,同時(shí)避免重復(fù)計(jì)算查库。
    • 合理使用緩沖的準(zhǔn)則
      • 頻繁修改的數(shù)據(jù)路媚,盡量不要緩存,讀寫比2:1以上才有緩存的價(jià)值樊销。
      • 緩存一定是熱點(diǎn)數(shù)據(jù)整慎。
        應(yīng)用需要容忍一定時(shí)間的數(shù)據(jù)不一致。
      • 緩存可用性問題围苫,一般通過熱備或者集群來解決裤园。
      • 緩存預(yù)熱,新啟動的緩存系統(tǒng)沒有任何數(shù)據(jù)剂府,可以考慮將一些熱點(diǎn)數(shù)據(jù)提前加載到緩存系統(tǒng)拧揽。
      • 解決緩存擊穿:
        1、布隆過濾器,或者2淤袜、把不存在的數(shù)據(jù)也緩存起來 痒谴,比如有請求總是訪問key = 23的數(shù)據(jù),但是這個(gè)key = 23的數(shù)據(jù)在系統(tǒng)中不存在铡羡,可以考慮在緩存中構(gòu)建一個(gè)( key=23 value = null)的數(shù)據(jù)积蔚。
    • 分布式緩存與一致性哈希
      • 以集群的方式提供緩存服務(wù),有兩種實(shí)現(xiàn)烦周;
        • 需要更新同步的分布式緩存尽爆,所有的服務(wù)器保存相同的緩存數(shù)據(jù),帶來的問題就是读慎,緩存的數(shù)據(jù)量受限制漱贱,其次,數(shù)據(jù)要在所有的機(jī)器上同步贪壳,代價(jià)很大饱亿。
        • 每臺機(jī)器只緩存一部分?jǐn)?shù)據(jù),然后通過一定的算法選擇緩存服務(wù)器闰靴。常見的余數(shù)hash算法存在當(dāng)有服務(wù)器上下線的時(shí)候彪笼,大量緩存數(shù)據(jù)重建的問題。所以提出了一致性哈希算法蚂且。
      • 一致性哈希
        • 首先求出服務(wù)器(節(jié)點(diǎn))的哈希值配猫,并將其配置到0~232的圓(continuum)上
        • 然后采用同樣的方法求出存儲數(shù)據(jù)的鍵的哈希值,并映射到相同的圓上杏死。
        • 然后從數(shù)據(jù)映射到的位置開始順時(shí)針查找泵肄,將數(shù)據(jù)保存到找到的第一個(gè)服務(wù)器上。如果超過232仍然找不到服務(wù)器淑翼,就會保存到第一臺服務(wù)器上腐巢。
        • 一致性哈希算法對于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯(cuò)性和可擴(kuò)展性玄括。
        • 一致性哈希算法在服務(wù)節(jié)點(diǎn)太少時(shí)冯丙,容易因?yàn)楣?jié)點(diǎn)分部不均勻而造成數(shù)據(jù)傾斜問題,此時(shí)必然造成大量數(shù)據(jù)集中到Node A上遭京,而只有極少量會定位到Node B上胃惜。為了解決這種數(shù)據(jù)傾斜問題,一致性哈希算法引入了虛擬節(jié)點(diǎn)機(jī)制哪雕,即對每一個(gè)服務(wù)節(jié)點(diǎn)計(jì)算多個(gè)哈希船殉,每個(gè)計(jì)算結(jié)果位置都放置一個(gè)此服務(wù)節(jié)點(diǎn),稱為虛擬節(jié)點(diǎn)斯嚎。具體做法可以在服務(wù)器ip或主機(jī)名的后面增加編號來實(shí)現(xiàn)利虫。例如挨厚,可以為每臺服務(wù)器計(jì)算三個(gè)虛擬節(jié)點(diǎn),于是可以分別計(jì)算 “Node A#1”列吼、“Node A#2”幽崩、“Node A#3”、“Node B#1”寞钥、“Node B#2”、“Node B#3”的哈希值陌选,于是形成六個(gè)虛擬節(jié)點(diǎn):同時(shí)數(shù)據(jù)定位算法不變理郑,只是多了一步虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的映射,例如定位到“Node A#1”咨油、“Node A#2”您炉、“Node A#3”三個(gè)虛擬節(jié)點(diǎn)的數(shù)據(jù)均定位到Node A上。這樣就解決了服務(wù)節(jié)點(diǎn)少時(shí)數(shù)據(jù)傾斜的問題役电。在實(shí)際應(yīng)用中赚爵,通常將虛擬節(jié)點(diǎn)數(shù)設(shè)置為32甚至更大,因此即使很少的服務(wù)節(jié)點(diǎn)也能做到相對均勻的數(shù)據(jù)分布法瑟。
  • 集群

  • 異步

    • 同步和異步冀膝,阻塞和非阻塞
    • 常見異步的手段
      • Servlet異步
        • servlet3中才有,支持的web容器在tomcat7和jetty8以后霎挟。
      • 多線程
      • 消息隊(duì)列
      • 集群
        • 可以很好的將用戶的請求分配到多個(gè)機(jī)器處理窝剖,對總體性能有很大的提升
      • 程序代碼級別
  • 應(yīng)用相關(guān)

    • 代碼級別
      • 選擇合適的數(shù)據(jù)結(jié)構(gòu)
      • 選擇更優(yōu)的算法
      • 編寫更少的代碼
    • 并發(fā)編程
      • 充分利用CPU多核
      • 實(shí)現(xiàn)線程安全的類,避免線程安全問題
      • 同步下減少鎖的競爭
    • 資源的復(fù)用
      • 目的是減少開銷很大的系統(tǒng)資源的創(chuàng)建和銷毀酥夭,比如數(shù)據(jù)庫連接赐纱,網(wǎng)絡(luò)通信連接,線程資源等等熬北。
    • JVM
      • 對于程序來說疙描,通常只有一部分代碼被經(jīng)常執(zhí)行,這些關(guān)鍵代碼被稱為應(yīng)用的熱點(diǎn)讶隐,執(zhí)行的越多就認(rèn)為是越熱起胰。將這些代碼編譯為本地機(jī)器特定的二進(jìn)制碼,可以有效提高應(yīng)用性能整份。
    • 存儲性能優(yōu)化
      • 盡量使用SSD
      • 定時(shí)清理數(shù)據(jù)或者按數(shù)據(jù)的性質(zhì)分開存放
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末待错,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烈评,更是在濱河造成了極大的恐慌火俄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讲冠,死亡現(xiàn)場離奇詭異瓜客,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門谱仪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玻熙,“玉大人,你說我怎么就攤上這事疯攒∴滤妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵敬尺,是天一觀的道長枚尼。 經(jīng)常有香客問我,道長砂吞,這世上最難降的妖魔是什么署恍? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蜻直,結(jié)果婚禮上盯质,老公的妹妹穿的比我還像新娘。我一直安慰自己概而,他們只是感情好呼巷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著到腥,像睡著了一般朵逝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乡范,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天配名,我揣著相機(jī)與錄音,去河邊找鬼晋辆。 笑死渠脉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓶佳。 我是一名探鬼主播芋膘,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霸饲!你這毒婦竟也來了为朋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤厚脉,失蹤者是張志新(化名)和其女友劉穎习寸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傻工,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霞溪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年孵滞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯匹。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坊饶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殴蓬,到底是詐尸還是另有隱情匿级,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布科雳,位于F島的核電站根蟹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏糟秘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一球散、第九天 我趴在偏房一處隱蔽的房頂上張望尿赚。 院中可真熱鬧,春花似錦蕉堰、人聲如沸凌净。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冰寻。三九已至,卻和暖如春皿渗,著一層夾襖步出監(jiān)牢的瞬間斩芭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工乐疆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留划乖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓挤土,卻偏偏與公主長得像琴庵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子仰美,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.影響一個(gè)系統(tǒng)性能的方方面面 一個(gè)web應(yīng)用不是一個(gè)孤立的個(gè)體迷殿,它是一個(gè)系統(tǒng)的部分,系統(tǒng)中的每一部分都會影響整個(gè)...
    王偵閱讀 1,078評論 0 1
  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理咖杂,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 788評論 0 3
  • feisky云計(jì)算庆寺、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,846評論 0 5
  • 在服務(wù)器端程序開發(fā)領(lǐng)域止邮,性能問題一直是備受關(guān)注的重點(diǎn)这橙。業(yè)界有大量的框架、組件导披、類庫都是以性能為賣點(diǎn)而廣為人知屈扎。然而...
    dreamer_lk閱讀 1,010評論 0 17
  • 今早我一個(gè)在一間電影公司當(dāng)助理的朋友臨時(shí)發(fā)現(xiàn)她忘了印行程表(當(dāng)時(shí)已經(jīng)10.30了),所以回來宿舍印撩匕。由于她趕時(shí)間(...
    午夜里的街燈閱讀 125評論 0 0