下面的每一條戒律都將有效地影響代碼的性能和可伸縮性。換句話說,盡可能不要照著戒律去做!下面,我將解釋如何破壞他們以便提高性能和可伸縮性。
下面的每一條戒律都將有效地影響代碼的性能和可伸縮性。換句話說,盡可能不要照著戒律去做!下面,我將解釋如何破壞他們以便提高性能和可伸縮性。
1、應(yīng)該分配和釋放多個對象
你應(yīng)該盡量避免過量分配內(nèi)存,因?yàn)閮?nèi)存分配可能是代價高昂的。釋放內(nèi)存塊可能更昂貴,因?yàn)榇蠖鄶?shù)分配算符總是企圖連接臨近的已釋放的內(nèi)存塊成為更大的塊。直到Windows NT? 4.0 service pack 4.0,在多線程處理中,系統(tǒng)堆通常都運(yùn)行得很糟。堆被一個全局鎖保護(hù),并且在多處理器系統(tǒng)上是不可擴(kuò)展的。
2.不應(yīng)該考慮使用處理器高速緩存
大多數(shù)人都知道由虛擬內(nèi)存子系統(tǒng)導(dǎo)致的hard 頁錯誤代價很高,最好避免。但是許多人認(rèn)為其他內(nèi)存訪問方法沒有什么區(qū)別。自從80486以后,這一觀點(diǎn)就不對了。現(xiàn)代的CPUs比RAM要快得多, RAM至少需要兩級內(nèi)存緩存 ,高速L1 緩存能保存8KB數(shù)據(jù)和8KB指令,而較慢的L2 緩存能保存幾百KB的數(shù)據(jù)和代碼,這些數(shù)據(jù)和代碼混合在一起。
L1 緩存中內(nèi)存區(qū)域的一個引用需要一個時鐘周期,L2 緩存的引用需要4到7個時鐘周期,而主內(nèi)存的引用需要許多個處理器時鐘周期。后一數(shù)字不久將會超過100個時鐘周期。在許多方面,緩存像一個小型的,高速的,虛擬內(nèi)存系統(tǒng)。
至于和緩存有關(guān)的基本內(nèi)存單元不是字節(jié)而是緩存列。Pentium 緩存列有32個字節(jié)寬。Alpha 緩存列有64個字節(jié)寬。這意味著在L1 緩存中只有512個slot給代碼和數(shù)據(jù)。如果多個數(shù)據(jù)一起使用(時間位置)而并不存儲在一起(空間位置),性能會很差。數(shù)組的空間位置很好,而相互連接的列表和其他基于指針的數(shù)據(jù)結(jié)構(gòu)的位置往往很差。
把數(shù)據(jù)打包到同一個緩存列中通常會有利于提高性能,但是它也會破壞多處理器系統(tǒng)的性能。內(nèi)存子系統(tǒng)很難協(xié)調(diào)處理器間的緩存。如果一個被所有處理器使用的只讀數(shù)據(jù),和一個由一個處理器使用并頻繁更新的數(shù)據(jù)共享一個緩存列,那么緩存將會花費(fèi)很長時間更新這個緩存列的拷貝。這個Ping-Pong高速游戲通常被稱為"緩存 sloshing"。如果只讀數(shù)據(jù)在一個不同的緩存 列中,就可以避免sloshing。
對代碼進(jìn)行空間優(yōu)化比進(jìn)行速度優(yōu)化效率更高。代碼越少,代碼所占的頁也越少,這樣需要的運(yùn)行設(shè)置和產(chǎn)生的頁錯誤也會更少,同時占據(jù)的緩存 列也會更少。然而,某些核心函數(shù)應(yīng)該進(jìn)行速度優(yōu)化??梢岳胮rofiler去識別這些函數(shù)。
3.決不要緩存頻繁使用的數(shù)據(jù)。
軟件緩存可以被各種應(yīng)用程序使用。當(dāng)一個計算代價很高時,你會保存結(jié)果的一個拷貝。這是一個典型的時空折中方法:犧牲一些存儲空間以節(jié)省時間。如果做得好,這種方法可能非常有效。
你必須正確地進(jìn)行緩存。如果緩存了錯誤數(shù)據(jù),就會浪費(fèi)存儲空間。如果緩存得太多,其他操作可以使用的內(nèi)存將會很少。如果緩存得太少,效率又會很低,因?yàn)槟惚仨氈匦掠嬎惚痪彺孢z漏的數(shù)據(jù)。如果將時間敏感數(shù)據(jù)緩存得時間過長,這些數(shù)據(jù)將會過時。一般,服務(wù)器更關(guān)心的是速度而不是空間,所以他們要比桌面系統(tǒng)進(jìn)行更多的緩存。一定要定期去除不用的緩存,否則將會有運(yùn)行設(shè)置問題。
4.應(yīng)該創(chuàng)建多個線程,越多越好。
調(diào)整服務(wù)器中起作用的線程數(shù)目是很重要的。如果線程是I/O-bound的,將會花費(fèi)很多時間用來等待I/O的完成-一個被阻塞的線程就是一個不做任何有用工作的線程。加入額外的線程可以增加通量,但是加入過多的線程將會降低服務(wù)器的性能,因?yàn)樯舷挛慕粨Q將會成為一個重大的overhead。上下文交換速度應(yīng)該低的原因有三個:上下文交換是單純的overhead,對應(yīng)用程序的工作沒有任何益處;上下文交換用盡了寶貴的時鐘周期;最糟的是,上下文交換將處理器的緩存填滿了沒用的數(shù)據(jù),替換這些數(shù)據(jù)是代價高昂的。
有很多事情是依靠你的線程化結(jié)構(gòu)的。每個客戶端一個線程是絕對不合適的。因?yàn)閷τ诖罅坑脩舳耍臄U(kuò)展性不好。上下文交換變得難以忍受, Windows NT用盡了資源。線程池模型會工作得更好,在這種方法中一個工人線程池將處理一條請求列,因?yàn)閃indows 2000提供了相應(yīng)的APIs,如QueueUserWorkItem。
5.應(yīng)該對數(shù)據(jù)結(jié)構(gòu)使用全局鎖
使數(shù)據(jù)線程安全的最簡單方法是把它套上一把大鎖。為簡單起見,所有的東西都用同一把鎖。這種方法會有一個問題:序列化。為了得到鎖,每一個要處理數(shù)據(jù)的線程都必須排隊(duì)等候。如果線程被一把鎖阻塞,它沒有在做任何有用的事。當(dāng)服務(wù)器的負(fù)載較輕時,這個問題并不常見,因?yàn)橐淮慰赡苤挥幸粋€線程需要鎖。在負(fù)載很重的情況下,對鎖的激烈爭奪可能就會成為一個大問題。
設(shè)想在多車道高速公路上發(fā)生了一個意外事故,這條高速公路上的所有車輛都被轉(zhuǎn)向一條狹窄的道路。如果車輛很少,這一轉(zhuǎn)換對交通流的速率的影響可以忽略。如果車輛很多,當(dāng)車輛慢慢并入那條單通道時,交通阻塞會延伸幾英里。
有幾種技術(shù)能夠減少鎖競爭。
· 不要過分保護(hù),也就是說,不是非常必要不要鎖住數(shù)據(jù)。只有需要時才去持有鎖,而且時間不要過長。不要在大段代碼周圍或頻繁執(zhí)行的代碼中沒必要地使用鎖,這一點(diǎn)很重要。
· 對數(shù)據(jù)進(jìn)行分割,使它能夠用一套獨(dú)立的鎖保護(hù)。例如,一個符號表可以按標(biāo)識符的第一個字母分割,這樣在修改名字以Q開頭的符號的值時,就不會去讀名字以H開頭的符號的值。
· 使用APIs的Interlocked 系列(InterlockedIncrement,InterlockedCompareExchangePointer等)自動修改數(shù)據(jù)而不需要鎖。
· 當(dāng)數(shù)據(jù)不是經(jīng)常被修改時可以使用多讀者/單作者(multi-reader/single-writer)鎖。你將獲得更好的并發(fā)性,盡管鎖操作的代價將更高并且你可能會冒餓死作者的危險。
· 在關(guān)鍵部分使用循環(huán)計數(shù)器。參見Windows NT 4.0 service pack 3中的SetCriticalSectionSpinCount API。
· 如果你不能得到鎖,使用TryEnterCriticalSection并做一些其他的有用的工作。
高競爭導(dǎo)致serialization,serialization導(dǎo)致降低CPU的利用率,這促使用戶加入更多的線程,結(jié)果事情變得更糟。
6.不必注意多處理器機(jī)器
你的代碼在多處理器系統(tǒng)上比在單處理器系統(tǒng)上運(yùn)行得還要糟,這可能是件令人惡心的事。一個很自然的想法是,在一個N維系統(tǒng)上運(yùn)行N次會更好。性能很差的原因是競爭:鎖競爭,總線競爭,和/或緩存列競爭。處理器都在是爭奪共享資源的所有權(quán),而不是做更多的工作。
如果你一定要編寫多線程應(yīng)用程序的話,你應(yīng)該在多處理器盒上對你的應(yīng)用程序進(jìn)行強(qiáng)度測試和性能測試。單處理器系統(tǒng)通過時間分片地執(zhí)行線程而提供一個并發(fā)性的假象。多處理器盒具有真正的并發(fā)性,競爭環(huán)境和競爭更容易發(fā)生。
7.應(yīng)該始終使用模塊化調(diào)用;他們很有趣。
利用同步模塊化調(diào)用來執(zhí)行I/O操作對大多數(shù)桌面應(yīng)用程序來說是合適的。但是,他們不是使用服務(wù)器上的CPU(s)的好方法。I/O操作要花費(fèi)上百萬個時鐘周期來完成,這些時鐘周期本來可以被更好地利用。利用異步I/O你能得到顯著提高的用戶請求率和I/O通量,不過增加了額外的復(fù)雜性。
如果你有需要花費(fèi)很長時間的模塊化調(diào)用或I/O操作,你應(yīng)該考調(diào)撥多少資源給他們。你想使用所有的線程還是有個限制?一般地,使用有限的幾個線程要好些。構(gòu)建一個小的線程池和隊(duì)列,利用隊(duì)列來安排線程的工作完成模塊化調(diào)用。這樣,其他線程就可以拾取和處理你的非模塊化的請求。
8.不要進(jìn)行測量
當(dāng)你能夠測量你所談?wù)摰氖虑椴⒂脭?shù)字表達(dá)它時,這就表示你對他有了一定的了解;但是如果你不能用數(shù)字表達(dá)時,你的知識是貧瘠的不能令人滿意的;這可能是知識的開始,但這時你簡直不可能將你的思想提高到科學(xué)的水平。
- Lord Kelvin (William Thomson)
如果不測量你就不能了解應(yīng)用程序的特性。你在黑暗中摸索,一半是靠猜測。如果不識別性能問題,你就不能做任何改進(jìn)或做出工作量計劃。
測量包括黑匣子測量和profiling。黑匣子測量的意思是收集由性能計數(shù)器(內(nèi)存使用,上下文交換,CPU利用等)和外部檢測工具(通量,反映時間等)所顯示的數(shù)據(jù)。為了profile你的代碼,你編譯代碼的一個工具版,然后在各種條件下運(yùn)行它,并收集關(guān)于執(zhí)行時間和過程調(diào)用頻率的統(tǒng)計數(shù)據(jù)。
測量如果不用于分析的話就一點(diǎn)用都沒有。測量將不僅告訴你有問題,而且甚至能幫助你找到問題發(fā)生在哪,但它不能告訴你為什么會有問題。對問題進(jìn)行分析以便你能正確地改正他們。要從根本上解決問題而不是停留在表面現(xiàn)象。
當(dāng)你進(jìn)行改動后,要重新測量。你要知道你的改動是否有效。改動也可能會暴露其他性能問題,測量-分析-改正-再測量的循環(huán)就會重新開始。你也必須要有規(guī)律地進(jìn)行測量,以便發(fā)現(xiàn)性能衰退問題。
9.應(yīng)該使用單一用戶,單一請求的測試方法。
書寫ASP和ISAPI應(yīng)用程序的一個通病是只用一個瀏覽器去測試應(yīng)用程序。當(dāng)他們在Internet上應(yīng)用他們的程序時,他們才發(fā)現(xiàn)他們的應(yīng)用程序不能處理高負(fù)載,并且通量和反應(yīng)時間另人可憐。
用一個瀏覽器測試是必要的但是不夠的。如果瀏覽器反應(yīng)得不夠快,你就知道你有麻煩了。但即使它在使用一個瀏覽器時很快,你也不知道它處理負(fù)載的能力如何。如果十幾個用戶同時請求會發(fā)生什么事?一百個呢?你的應(yīng)用程序能容忍什么樣的通量?它能提供什么樣的反應(yīng)時間?在輕載時這些數(shù)字會怎樣?中等負(fù)載呢?重載呢?在多處理器機(jī)器上你的應(yīng)用程序會如何?對你的應(yīng)用程序進(jìn)行強(qiáng)度測試,這對于找出bugs發(fā)現(xiàn)性能問題來說是基本的。
類似的負(fù)載測試考慮適用于所有的服務(wù)器應(yīng)用程序。
10.不應(yīng)使用實(shí)際環(huán)境。
人們往往只在幾個特定的,人工的環(huán)境(如下benchmarks)下調(diào)整應(yīng)用程序。選擇和實(shí)際情況相對應(yīng)的各種情況,并為針對各種操作進(jìn)行優(yōu)化,這一點(diǎn)很重要。如果你不這樣做,你的用戶和評論家一定會這樣做,并且他們將依此來評判你的應(yīng)用程序的好壞。
重慶中技互聯(lián)網(wǎng)信息咨詢有限公司
重慶網(wǎng)站建設(shè)事業(yè)部官方網(wǎng):www.tmsmall666.cn
電子商務(wù)建站事業(yè)部咨詢電話:023-67742189
門戶網(wǎng)站品牌加盟推廣電話:023-67742189
7*24小時服務(wù)電話:023-67742189
媒體合作電話:13883323406
投資合作電話:13896068183
QQ及郵件地址:446515345@qq.com
企業(yè)網(wǎng)站建設(shè)解決方案 營銷型網(wǎng)站建設(shè)解決方案 行業(yè)門戶網(wǎng)站建設(shè)解決方案 外貿(mào)網(wǎng)站解建設(shè)決方案 品牌形象網(wǎng)站建設(shè)解決方案 購物商城網(wǎng)站建設(shè)解決方案 政府網(wǎng)站建設(shè)解決方案 手機(jī)網(wǎng)站建設(shè)解決方案 教育培訓(xùn)網(wǎng)站建設(shè)解決方案 珠寶高端奢飾品網(wǎng)站建設(shè)解決方案 房地產(chǎn)、地產(chǎn)項(xiàng)目網(wǎng)站建設(shè)解決方案 集團(tuán)、上市企業(yè)網(wǎng)站建設(shè)解決方案 數(shù)碼、電子產(chǎn)品網(wǎng)站建設(shè)解決方案 美容、化妝品行業(yè)網(wǎng)站建設(shè)解決方案
10年專業(yè)互聯(lián)網(wǎng)服務(wù)經(jīng)驗(yàn) 重慶最專業(yè)網(wǎng)站團(tuán)隊(duì) 資深行業(yè)分析策劃 B2C營銷型網(wǎng)站建設(shè)領(lǐng)先者 最前沿視覺設(shè)計、研發(fā)能力 時刻最新技術(shù)領(lǐng)先研發(fā)能力 具有完備的項(xiàng)目管理 完善的售后服務(wù)體系 深厚的網(wǎng)絡(luò)運(yùn)營經(jīng)驗(yàn)
中技互聯(lián)一直秉承專業(yè)、誠信、服務(wù)、進(jìn)取的價值觀,堅(jiān)持優(yōu)秀的商業(yè)道德,以用戶最終價值為導(dǎo)向,向用戶提供優(yōu)質(zhì)產(chǎn)品和優(yōu)質(zhì)服務(wù),從而贏得了用戶的信賴。始終以不懈的努力、更高的目標(biāo)來要求自己。
主營業(yè)務(wù):網(wǎng)站建設(shè) | 重慶網(wǎng)站建設(shè) | 重慶網(wǎng)站設(shè)計 | 重慶網(wǎng)站制作 | 重慶網(wǎng)頁設(shè)計 | 重慶網(wǎng)站開發(fā)