偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

性能優(yōu)化技巧之系統(tǒng)層次優(yōu)化

運(yùn)維 系統(tǒng)運(yùn)維
系統(tǒng)層次的優(yōu)化有很多方法,如利用Cache、 Lazy computing、Read ahead等等,對(duì)系統(tǒng)層次進(jìn)行優(yōu)化,效果也是比較明顯的。本文將會(huì)討論一些常見(jiàn)的系統(tǒng)優(yōu)化的方法。

編者按:系統(tǒng)層次的優(yōu)化有很多方法,如利用Cache、 Lazy computing、Read ahead等等,對(duì)系統(tǒng)層次進(jìn)行優(yōu)化,效果也是比較明顯的。本文將會(huì)討論一些常見(jiàn)的系統(tǒng)優(yōu)化的方法。

從系統(tǒng)層次去優(yōu)化系統(tǒng)往往有比較明顯的效果。但是,在優(yōu)化之前,我們先要問(wèn)一問(wèn),能否通過(guò)擴(kuò)展系統(tǒng)來(lái)達(dá)到提高性能的目的,比如:

  • Scale up: 用更強(qiáng)的硬件替代當(dāng)前的硬件
  • Scale out: 用更多的部件來(lái)增強(qiáng)系統(tǒng)的性能

使用更強(qiáng)的硬件當(dāng)然和優(yōu)化沒(méi)有半點(diǎn)關(guān)系,但是如果這是一個(gè)可以接受的方案,為什么不用這個(gè)簡(jiǎn)單易行的方案哪?替換硬件的風(fēng)險(xiǎn)要比改架構(gòu),改代碼的風(fēng)險(xiǎn)小多了,何樂(lè)而不為?

Scale out的方案就有一點(diǎn)麻煩。它要求系統(tǒng)本身是支持scale out,或者把系統(tǒng)優(yōu)化成可以支持scale out。不管是哪一種選擇,都不是一個(gè)簡(jiǎn)單的選擇。設(shè)計(jì)一個(gè)可以scale out的系統(tǒng)已經(jīng)超出了本文所要關(guān)注的范圍,但是,scale out應(yīng)該是系統(tǒng)優(yōu)化的一個(gè)重要方向。

下面會(huì)討論一些常見(jiàn)的系統(tǒng)優(yōu)化的方法,如果還有其他沒(méi)有提到的,也歡迎讀者指出來(lái)。

1) Cache

  • Cache是什么?Cache保存了已經(jīng)執(zhí)行過(guò)的結(jié)果。
  • Cache為什么有效?一是可以避免計(jì)算的開(kāi)銷(xiāo)(比如SQL查詢(xún)的開(kāi)銷(xiāo));二是離計(jì)算單元更近,所以訪(fǎng) 問(wèn)更快(比如CPU cache)。
  • Cache的難點(diǎn)在哪里?一是快速匹配,這涉及到匹配算法選擇(一般用哈希表),Cache容量(哈希表的容量影響查找速度);二是替換策略(一般使用LRU或者隨機(jī)替換等等)。
  • Cache在哪些情況下有效?毫無(wú)疑問(wèn),時(shí)間局部性,也就是當(dāng)前的結(jié)果后面會(huì)用到,如果沒(méi)有時(shí)間局部性,Cache就不能提高性能,反而對(duì)性能和系統(tǒng)架構(gòu)有害處。所以在系統(tǒng)設(shè)計(jì)之初,最好是審視一下數(shù)據(jù)流程,再?zèng)Q定是否引入Cache層。

2) Lazy computing

Lazy computing(延遲計(jì)算),簡(jiǎn)而言之,就是不要做額外的事情,特別是無(wú)用的事情。最常見(jiàn)的一個(gè)例子就是COW(copy on write),可以參考這個(gè)鏈接http://en.wikipedia.org/wiki/Copy-on-write。

  • COW是什么?寫(xiě)時(shí)復(fù)制。也就是說(shuō)fork進(jìn)程時(shí),子進(jìn)程和父進(jìn)程共享相同的代碼段和數(shù)據(jù)段,如果沒(méi)有寫(xiě)的動(dòng)作發(fā)生,就不要為子進(jìn)程分配新的數(shù)據(jù)段(通常在fork之后,會(huì)有exec,用新的代碼段和數(shù)據(jù)段替換原來(lái)的代碼段和數(shù)據(jù)段,所以復(fù)制父進(jìn)程的數(shù)據(jù)段是沒(méi)有用的)。
  • COW為什么有效?一是可以節(jié)省復(fù)制內(nèi)存的時(shí)間,二是可以節(jié)省內(nèi)存分配的時(shí)間(到真正需要時(shí)再分配,雖然時(shí)間不會(huì)減少,但是CPU的使用更加均勻,避免抖動(dòng))。
  • COW的難點(diǎn)在哪里?一是引用計(jì)數(shù),多個(gè)指針指向同一塊內(nèi)存,如果沒(méi)有引用計(jì)數(shù),內(nèi)存無(wú)法釋放;二是 如何知道哪塊內(nèi)存是可以共享的?(在fork的例子里面,父進(jìn)程,子進(jìn)程的關(guān)系非常明確,但是在有些應(yīng)用里面,需要查找能夠共享的內(nèi)存,查找需要花時(shí)間)

Lazy computing在哪些情況下有效?目前能想到的只有內(nèi)存復(fù)制。用時(shí)分配內(nèi)存算不算哪?用時(shí)分配內(nèi)存不能節(jié)省時(shí)間,但是可以節(jié)省空間。靜態(tài)內(nèi)存對(duì)時(shí)間性能有好處;動(dòng)態(tài)內(nèi)存對(duì)空間性能有好處。就看目標(biāo)是優(yōu)化哪個(gè)性能了。

3) Read ahead

Read ahead (預(yù)讀),也可以稱(chēng)之為pre-fetch(預(yù)取)。就是要提前準(zhǔn)備所需要的數(shù)據(jù),避免使用時(shí)的等待。

  • Read ahead是什么?可以參考http://en.wikipedia.org/wiki/Readahead,這個(gè)是講文件預(yù)讀的。CPU里面也有pre-fetch(CPU預(yù)取需要仔細(xì)安排,最好是能夠填充流水線(xiàn),所以需要多次嘗試才有結(jié)果)。
  • Read ahead為什么有效?Read ahead可以減少等待內(nèi)存的時(shí)間。其實(shí)相當(dāng)于把多個(gè)讀的動(dòng)作集合成一個(gè)。這個(gè)和網(wǎng)絡(luò)里面的buffering或者sliding window有異曲同工之妙。停-等協(xié)議是最簡(jiǎn)單的,但是效率也最低。
  • Read ahead的難點(diǎn)在哪里?預(yù)讀多少才合適?預(yù)讀窗口的大小需要根據(jù)負(fù)載,文件使用的多少等因素動(dòng)態(tài)調(diào)整。預(yù)測(cè)的成功與否關(guān)系的性能。所以這并不是一個(gè)簡(jiǎn)單的優(yōu)化方法。
  • Read ahead在哪些情況下有效?毫無(wú)疑問(wèn),空間局部性。沒(méi)有空間局部性,read ahead就失去了用武之地。用錯(cuò)了,反而會(huì)降低性能。

4) Hardware assist

Hardware assist (硬件輔助),顧名思義,就是用硬件實(shí)現(xiàn)某些功能。常見(jiàn)的,比如加密,解密;正則表達(dá)式或者DFA engine,或者規(guī)則查找,分類(lèi),壓縮,解壓縮等等。邏輯簡(jiǎn)單,功能確定,CPU intensive的工作可以考慮用硬件來(lái)代替。

  • Hardware assist為什么有效?協(xié)處理器可以減輕CPU的工作,而且速度比CPU做要快(這個(gè)要看情況,并不是任何情況下都成立)。Hardware assist和Hardware centric的設(shè)計(jì)完全不同,不能混為一談。在Hardware assist的設(shè)計(jì)里面,主要工作還是由軟件完成;而hardware centric就是基于A(yíng)SIC的設(shè)計(jì)方案,大部分工作是有硬件來(lái)完成。
  • Hardware assist的難點(diǎn)在哪里?一是采用同步還是異步的方式與硬件交互(通常是異步);二是如何使硬件滿(mǎn)負(fù)荷工作,同時(shí)又避免緩沖區(qū)溢出或丟棄(這個(gè)要安排好硬件和軟件的節(jié)奏,使之協(xié)調(diào)工作);還有就是硬件 訪(fǎng)問(wèn)內(nèi)存的開(kāi)銷(xiāo)(盡量硬件本身所帶的內(nèi)存,如果有的話(huà))。

5) Asynchronous

Asynchronous(異步)。同步,異步涉及到消息傳遞。一般來(lái)說(shuō),同步比較簡(jiǎn)單,性能稍低;而異步比較復(fù)雜,但是性能較高。

  • Asynchronous是什么?異步的含義就是請(qǐng)求和應(yīng)答分離,請(qǐng)求和應(yīng)答可以由不同的進(jìn)程或線(xiàn)程完成。比如在 TCP協(xié)議的實(shí)現(xiàn)里面,如果滑動(dòng)窗口是1,那么每次只能發(fā)送一個(gè)字節(jié),然后等待應(yīng)答;如果增加滑動(dòng)窗口,那么一次可以發(fā)送多個(gè)字節(jié),而無(wú)需等待前一個(gè)字節(jié)的應(yīng)答。這樣可以提高性能。
  • Asyncrhonous為什么有效?異步消除了等待的時(shí)間,可以更有效利用帶寬。
  • Asynchronous的難點(diǎn)是什么?一是如何實(shí)現(xiàn)分布式的狀態(tài)機(jī)?由于請(qǐng)求和應(yīng)答雙方是獨(dú)立的,所以要避免狀態(tài)之間有依賴(lài)關(guān)系,在無(wú)法消除狀態(tài)之間的依賴(lài)關(guān)系時(shí),必須使用同步消息(比如三次握手);二是應(yīng)答來(lái)了之后, 如果激活原來(lái)的執(zhí)行過(guò)程,使之能夠繼續(xù)執(zhí)行。
  • Asynchronous在哪些情況下有效?很明顯,狀態(tài)之間不能有依賴(lài)關(guān)系,同時(shí)需要足夠的帶寬(或者窗口)。

6) Polling

Polling(輪詢(xún))。Polling是網(wǎng)絡(luò)設(shè)備里面常用的一個(gè)技術(shù),比如Linux的NAPI或者epoll。與之對(duì)應(yīng)的是中斷,或者是事件。

  • Polling為什么有效?Polling避免了狀態(tài)切換的開(kāi)銷(xiāo),所以有更高的性能。
  • Polling的難點(diǎn)是什么?如果系統(tǒng)里面有多種任務(wù),如何在polling的時(shí)候,保證其他任務(wù)的執(zhí)行時(shí)間?Polling 通常意味著獨(dú)占,此時(shí)系統(tǒng)無(wú)法響應(yīng)其他事件,可能會(huì)造成嚴(yán)重后果。
  • Polling在哪些情況下有效?凡是能用事件或中斷的地方都能用polling替代,是否合理,需要結(jié)合系統(tǒng)的數(shù)據(jù)流程來(lái)決定。

7) Static memory pool

Static memory pool(靜態(tài)內(nèi)存)。如前所述,靜態(tài)內(nèi)存有更好的性能,但是適應(yīng)性較差(特別是系統(tǒng)里面有多個(gè) 任務(wù)的時(shí)候),而且會(huì)有浪費(fèi)(提前分配,還沒(méi)用到就分配了)。

  • Static memory pool為什么有效?它可以使內(nèi)存管理更加簡(jiǎn)單,避免分配和是否內(nèi)存的開(kāi)銷(xiāo),并且有利于調(diào)試內(nèi)存問(wèn)題。
  • Static memory pool的難點(diǎn)在哪里?分配多大的內(nèi)存?如何避免浪費(fèi)?如何實(shí)現(xiàn)O(1)的分配和釋放?如何初始化內(nèi)存?
  • Static memory pool在哪些情況下有效?一是固定大小的內(nèi)存需求(通常與系統(tǒng)的capacity有關(guān)),內(nèi)存對(duì)象的大小一致,并且要求快速的分配和釋放。

系統(tǒng)層次的優(yōu)化應(yīng)該還有很多方法,能想起來(lái)的就這么多了(這部分比較難,醞釀了很久,才想起來(lái)這么一點(diǎn)東西^-^),讀者如果有更好的方法,可以一起討論。性能優(yōu)化是關(guān)注實(shí)踐的工作,任何紙上談兵都是瞎扯,與讀者共勉。

原文:性能優(yōu)化的方法和技巧:系統(tǒng)

【編輯推薦】

  1. 性能優(yōu)化技巧之三個(gè)層次
  2. 性能優(yōu)化技巧之代碼層次優(yōu)化
  3. 新的技術(shù)產(chǎn)業(yè):Web性能優(yōu)化
  4. Linux網(wǎng)絡(luò)性能優(yōu)化方法簡(jiǎn)析
  5. 網(wǎng)站性能優(yōu)化最佳實(shí)踐
責(zé)任編輯:黃丹 來(lái)源: 彎曲評(píng)論
相關(guān)推薦

2011-06-14 11:14:10

性能優(yōu)化代碼

2011-07-11 15:26:49

性能優(yōu)化算法

2011-06-14 10:35:15

性能優(yōu)化

2011-06-14 14:32:46

性能優(yōu)化

2011-06-14 13:48:07

性能優(yōu)化工具

2011-03-11 15:53:02

LAMP優(yōu)化

2017-12-23 14:38:41

Android編程開(kāi)發(fā)優(yōu)化

2009-06-16 16:39:49

Hibernate性能

2011-03-11 15:52:57

LAMP優(yōu)化

2011-09-29 09:50:44

JavaScript

2021-07-29 14:20:34

網(wǎng)絡(luò)優(yōu)化移動(dòng)互聯(lián)網(wǎng)數(shù)據(jù)存儲(chǔ)

2013-06-08 14:19:05

性能優(yōu)化KVM

2019-08-21 10:53:29

.NET性能優(yōu)化

2024-10-09 23:32:50

2012-07-23 10:22:15

Python性能優(yōu)化優(yōu)化技巧

2009-12-09 17:33:22

PHP性能優(yōu)化

2019-02-25 07:07:38

技巧React 優(yōu)化

2018-11-20 10:50:00

Java性能優(yōu)化編程技巧

2022-02-16 14:10:51

服務(wù)器性能優(yōu)化Linux

2011-03-11 15:52:59

LAMP優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)