原地址:http://www.cnblogs.com/gaizai/archive/2010/01/04/1638325.html
?
2010.01.03,今天開(kāi)始看這本書(shū),剛看了第一章就已經(jīng)有了共鳴的感覺(jué),可能是因?yàn)槲抑坝羞^(guò)兩個(gè)性能優(yōu)化項(xiàng)目的經(jīng)驗(yàn)吧,其實(shí)感覺(jué)最重要的一點(diǎn)就是在第二個(gè)項(xiàng)目?jī)?yōu)化的過(guò)程中刻意去做一些總結(jié),希望接下來(lái)的閱讀會(huì)有更多這個(gè)的共鳴出現(xiàn)。(期待中。。。)
網(wǎng)絡(luò)上沒(méi)有這本書(shū)的電子版,只有兩章的免費(fèi)試讀, 進(jìn)入試讀地址 ,唉,真不知道以后要像這樣引用文章該如何辦啊?!
下面是在閱讀過(guò)程中感覺(jué)比較重要的內(nèi)容,并加入了自己的一些體會(huì):
?
【1】出現(xiàn)的一個(gè)名詞“平行運(yùn)算”,SQL的平行運(yùn)算
平行運(yùn)算 又名 并行計(jì)算(Parallel Computing)
并行計(jì)算(Parallel Computing)是指同時(shí)使用多種計(jì)算資源解決計(jì)算問(wèn)題的過(guò)程。為執(zhí)行并行計(jì)算,計(jì)算資源應(yīng)包括一臺(tái)配有多處理機(jī)(并行處理)的計(jì)算機(jī)、一個(gè)與網(wǎng)絡(luò)相 連的計(jì)算機(jī)專(zhuān)有編號(hào),或者兩者結(jié)合使用。并行計(jì)算的主要目的是快速解決大型且復(fù)雜的計(jì)算問(wèn)題。此外還包括:利用非本地資源,節(jié)約成本 ― 使用多個(gè)“廉價(jià)”計(jì)算資源取代大型計(jì)算機(jī),同時(shí)克服單個(gè)計(jì)算機(jī)上存在的存儲(chǔ)器限制。
?
【2】性能調(diào)優(yōu)需要哪些技能
? 體會(huì):還是比較贊同這些知識(shí)結(jié)構(gòu)的,我們要有目的地學(xué)習(xí)這幾個(gè)方面的知識(shí),打開(kāi)視野,對(duì)調(diào)優(yōu)也是有好處的。?
?
【3】摘要:
?? 體會(huì):以前一直認(rèn)為優(yōu)化知識(shí)修改幾個(gè)代碼里面的循環(huán)語(yǔ)句,修改幾條SQL語(yǔ)句(把批量的數(shù)據(jù)庫(kù)操作修改成類(lèi)似于Insert Select等)就能了事了,雖然這樣成功優(yōu)化了兩個(gè)系統(tǒng)(并沒(méi)有完全優(yōu)化,只是做研究或者叫練手,因?yàn)橐蟛⒉桓撸灰鼙纫郧坝写蟮男阅芨倪M(jìn)就可以 了),但是一直沒(méi)有想過(guò)string與StringBuilder也會(huì)有這么大的性能問(wèn)題,而且網(wǎng)上已經(jīng)有很多人討論這個(gè)問(wèn)題,而我卻沒(méi)有關(guān)注過(guò),慚愧 啊,所以.Net的知識(shí)也需要加深啊。
?
【4】摘要:
整個(gè)應(yīng)用程序的開(kāi)發(fā)最好先快速建立測(cè)試系統(tǒng)(prototype),讓用戶(hù)在開(kāi)發(fā)程序中一再測(cè)試,以循環(huán)遞增的方式屢次修正問(wèn)題,提早發(fā)現(xiàn)潛藏的性能問(wèn)題,在開(kāi)發(fā)程序中解決性能問(wèn)題要比系統(tǒng)完成,交付后才發(fā)現(xiàn)性能問(wèn)題,而后需要大改來(lái)得好。
? 體會(huì):對(duì)使用視圖我并不完全贊同,視圖是可以降低系統(tǒng)的耦合,也有效的對(duì)表字段進(jìn)行了權(quán)限控制,我們平常使用視圖的主要目的就是聯(lián)合多個(gè)表,方便查詢(xún);但是這樣的話,表中的索引如何有效地使用呢?
即使SQL Server2005可以對(duì)視圖進(jìn)行索引,但是也有缺點(diǎn),第一個(gè)是不方便,有限制;第二,如果視圖比較大,索引造成磁盤(pán)空間會(huì)大大增大;
有時(shí)可以考慮使用存儲(chǔ)過(guò)程,這樣就可以使用表的索引了,又可以對(duì)字段進(jìn)行控制,也可以比較大的解耦,又可以有執(zhí)行緩存,貌似這個(gè)方案不錯(cuò),但是 如果什么都靠存儲(chǔ)過(guò)程,第一很容易就有存儲(chǔ)過(guò)程風(fēng)暴;第二對(duì)分頁(yè)支持不太好;第三,我們的程序的邏輯變化會(huì)比較大,寫(xiě)存儲(chǔ)過(guò)程對(duì)業(yè)務(wù)邏輯的維護(hù)比較麻煩。
有時(shí)遇到大的邏輯處理,我們會(huì)把一些必要的數(shù)據(jù)先查詢(xún)出來(lái),在進(jìn)行編碼邏輯處理,在進(jìn)行組裝,生成一個(gè)邏輯數(shù)據(jù)。所以我們要根據(jù)不同的需求來(lái)確定使用方法。
?
【5】性能基線
·昔日系統(tǒng)正常運(yùn)行時(shí)的數(shù)據(jù)。
·調(diào)校前系統(tǒng)的各種數(shù)據(jù)。
·用戶(hù)希望達(dá)到的目標(biāo)。
基線是用來(lái)比較的,任何性能調(diào)校的動(dòng)作都應(yīng)該依憑數(shù)據(jù),不要訴諸情緒。
? 體會(huì):在優(yōu)化公司的第二個(gè)項(xiàng)目的時(shí)候就自己感悟到基線了,所以這點(diǎn)我也是很贊同的,是一個(gè)性能測(cè)試和優(yōu)化的前期需要做的工作。
因?yàn)橛辛嘶€才好做對(duì)比,做比較,也才會(huì)有成就感。
?
【6】摘要
·用戶(hù)苦等一兩個(gè)月,最后還是換機(jī)器,他們會(huì)覺(jué)得工程師能力不足。
·實(shí)際上浪費(fèi)了人力成本。
·一陣子后,性能問(wèn)題又再度浮現(xiàn)。
? 體會(huì):事前的整體評(píng)估很重要,關(guān)系到成本和各戶(hù)交互中的重要作用。
?
【7】摘要:
嘗試列出系統(tǒng)中各個(gè)組件合理的性能消耗,可以幫助你理清整個(gè)系統(tǒng)訪問(wèn)中,各個(gè)組件所占的性能消耗比例,哪些部分有可以調(diào)整的空間。另外,再搭配調(diào)整該部分的成本有多高,讓你了解調(diào)整的優(yōu)先級(jí),并對(duì)系統(tǒng)的極限有更佳的認(rèn)識(shí)。
? 體會(huì):對(duì)這段描述是比較贊同的。
這也得從優(yōu)化公司的第二個(gè)項(xiàng)目說(shuō)起,那個(gè)時(shí)候就做了比較多的前期工作,比如測(cè)試、基線、文檔、分析、猜想、評(píng)估等工作,最后的優(yōu)化就花了一天的時(shí)間,雖然還沒(méi)有優(yōu)化全部的內(nèi)容,但是性能還是有了很大的提高的。
優(yōu)化后的總結(jié)也是很重要的,可以把優(yōu)化過(guò)程記錄下來(lái),沉淀一些知識(shí),這次我就總結(jié)出一個(gè)比較通用的優(yōu)化流程,改天帖出來(lái)。
?
【8】摘要
現(xiàn)將各步驟的原文列出如下:
Discover?the?problem:發(fā)現(xiàn)問(wèn)題。
Explore?the?conditions:探究原因,為問(wèn)題提供明確的定義與定位。
Track?down?possible?approaches:提供可能的解決方案。
Execute?the?most?likely?approach:執(zhí)行最有可能的解決方案。
Check?for?success(如果需要的話,重復(fù)之前的步驟):確認(rèn)解決方案成功與否。
Tie?up?loose?ends:完成收尾的工作。
? 體會(huì):<1>:這才發(fā)現(xiàn)我之前一個(gè)項(xiàng)目的優(yōu)化步驟和這個(gè)有80%的相似度(在看這本書(shū)之前),這讓我小小開(kāi)心了一下。
<2>:這再一次證明了我的觀點(diǎn):在開(kāi)始學(xué)一些新知識(shí)的時(shí)候,一定要先自己動(dòng)手去嘗試,不要一開(kāi)始就買(mǎi)一個(gè)《XX入門(mén)》之類(lèi)的書(shū)籍來(lái)看。
<3>:需要注意一點(diǎn)就是,在接下來(lái)的實(shí)踐中,有意識(shí)的去看看文中的描述是否可以借鑒,通過(guò)這樣的方式來(lái)完善自己的那套調(diào)優(yōu)步驟。
?
【9】摘要
確定用戶(hù)的問(wèn)題與需求后,下一步是探究原因,此步驟的重點(diǎn)是“探索(Explore)”、“找尋證據(jù)(Evidence)”、“建立(Establish)”描述整個(gè)問(wèn)題來(lái)龍去脈的假設(shè)。
當(dāng)你從以上步驟確切了解用戶(hù)的問(wèn)題后,就需要建立問(wèn)題發(fā)生原因的假設(shè)和導(dǎo)致性能不足的運(yùn)行模型,而當(dāng)前這個(gè)步驟便是在搜集證據(jù),以建立并確認(rèn)該假設(shè)。在 這個(gè)階段中,你可以通過(guò)SQL?Server?Management?Studio、SqlDiag.exe、性能計(jì)數(shù)器、事件查看器、 SQL?Profiler、SQL?Server?2005?Performance?Dashbord?Reports、DMV與DMF等工具來(lái)找線索 (以上工具在本書(shū)第3章“性能調(diào)校相關(guān)工具程序”中有詳細(xì)說(shuō)明)。
這個(gè)步驟的主要任務(wù)是廣泛搜集相關(guān)數(shù)據(jù),但并未深入分析數(shù)據(jù)間的關(guān) 聯(lián)性,這是下一步驟要做的事情。當(dāng)然,要搜集正確而相關(guān)的證據(jù),難免要稍做分析,但不要過(guò)度耗時(shí)在某項(xiàng)單一的事件上。此步驟要的是全貌,盡量了解系統(tǒng)的每 一個(gè)方面,避免深入分析時(shí),漏了某個(gè)關(guān)鍵現(xiàn)象而誤入歧途。
當(dāng)然,若在這個(gè)階段就發(fā)現(xiàn)重大問(wèn)題,一眼就看出關(guān)鍵點(diǎn),例如,硬件毀損,某 個(gè)硬盤(pán)區(qū)間或內(nèi)存區(qū)間不穩(wěn),某個(gè)程序吃掉所有的內(nèi)存,讓SQL?Server無(wú)內(nèi)存可用,抑或是該程序常常出問(wèn)題,拖垮CPU等,則可以跳過(guò)DETECT 方法論之后的步驟,進(jìn)行深入探討這個(gè)問(wèn)題并予以解決。
通常性能調(diào)校并不是那么容易一眼看出重大錯(cuò)誤,或許用戶(hù)自己就可以解決,而需要 專(zhuān)門(mén)做性能調(diào)校的情況可能如戰(zhàn)場(chǎng)上不斷帶來(lái)的傷患,第一步要做的是決定傷患的輕重,再?zèng)Q定如何利用有限的資源做最有效的治療。當(dāng)你在前一步獲得用戶(hù)大量的 問(wèn)題后,接下來(lái)就要搜集并探究各種現(xiàn)象,決定輕重緩急,通盤(pán)考慮后,進(jìn)入下一步。
? 體會(huì):摘取這段是有目的的,它說(shuō)明了幾個(gè)知識(shí)點(diǎn):
第一,建立假設(shè)命題;
第二,可以看到性能的檢測(cè)使用了那些工具;
第三,并不深入分析,稍作分析,不耗時(shí)在某個(gè)問(wèn)題上;
第四,決定輕重緩急;第五,對(duì)一眼就能看出問(wèn)題予以解決。(個(gè)人補(bǔ)充:不過(guò)要回去證明,也就是狹義上的回歸測(cè)試)
?
【10】摘要
二分法的局限
·二分查找算法的局限是數(shù)據(jù)必須要有順序才能做二分查找。同樣地,你對(duì)于系統(tǒng)的知識(shí)要具備廣泛的連續(xù)性,才能在問(wèn)題發(fā)生時(shí),分析問(wèn)題所在的位置。
·第二個(gè)局限是你無(wú)法知道是否不小心把問(wèn)題隔離在目標(biāo)區(qū)域以外了,只好從頭再來(lái),這樣會(huì)讓你喪失信心。
·最后一個(gè)局限性,也是最大的問(wèn)題所在:某些性能問(wèn)題不單純地以本來(lái)的面目呈現(xiàn),因此分解問(wèn)題時(shí),可能會(huì)被現(xiàn)象蒙蔽。
? 體會(huì):這一段入選的原因就是:在我的頭腦里面就沒(méi)有調(diào)優(yōu)可以使用“二分查找”這樣的概念,雖然文中也說(shuō)了一些缺點(diǎn),但是有機(jī)會(huì)我還是會(huì)去嘗試一下,看看是否有道理的,不過(guò)估計(jì)希望不大。
?
【11】摘要
前5個(gè)步驟循環(huán)重復(fù)地執(zhí)行,每一次循環(huán)的結(jié)果都更逼近問(wèn)題的核心,直到達(dá)到性能調(diào)校的目標(biāo)。
但當(dāng)我們完成目標(biāo)后,依然要注意以下的問(wèn)題:
·解決的方式是否有邊際效應(yīng)而造成其他的問(wèn)題?
例如,為了某類(lèi)的查詢(xún)工作建立了大量的索引,事后原本正常的添加、修改、刪除都出現(xiàn)了性能問(wèn)題。
·是否真正根除了問(wèn)題,還是僅表象地頭痛醫(yī)頭,腳痛醫(yī)腳?
建立問(wèn)題的假設(shè)時(shí),很容易將問(wèn)題特殊化,僅局部地解決該問(wèn)題。例如,加了某個(gè)索引或稍稍改變查詢(xún)語(yǔ)句,舒緩了當(dāng)前的瓶頸,但當(dāng)用戶(hù)稍微增加或采用不同的查詢(xún)方式時(shí),老問(wèn)題就容易復(fù)發(fā)。
·是否要建立持續(xù)跟蹤的計(jì)劃?
當(dāng)你無(wú)法確定已經(jīng)根除問(wèn)題時(shí),那可能就要擬定持續(xù)跟蹤的計(jì)劃了。決定是否要持續(xù)觀察某些計(jì)數(shù)器,跟蹤某些現(xiàn)象是否還會(huì)發(fā)生,若發(fā)生了要如何解決等。如此不但可以讓用戶(hù)安心,更可以讓你知道之前的行為到底有多少效益,下次的性能調(diào)校才能提出更完整的解決方案。
? 體會(huì):這里說(shuō)到的幾點(diǎn)可能是我們平時(shí)會(huì)忽略的問(wèn)題,感覺(jué)第一點(diǎn)最重要了。比如在調(diào)優(yōu)的過(guò)程中發(fā)現(xiàn)是代碼的問(wèn)題,那么在修改代碼的過(guò)程就會(huì)對(duì)原 來(lái)邏輯進(jìn)行修改(例如原來(lái)是對(duì)數(shù)據(jù)庫(kù)進(jìn)行循環(huán)操作造成的性能問(wèn)題,那么調(diào)優(yōu)方案就可能是進(jìn)行批量操作數(shù)據(jù)),這種時(shí)候就無(wú)形中修改了原來(lái)的邏輯,這個(gè)時(shí)候 我們要對(duì)新的邏輯進(jìn)行必要的測(cè)試,其中包括功能測(cè)試和性能測(cè)試。
?
【12】對(duì)上面Detect方法的總結(jié):
·對(duì)問(wèn)題的簡(jiǎn)單描述;
·建立基線;
·假設(shè)(個(gè)人術(shù)語(yǔ):猜想);
·決定輕重緩急;
·假設(shè)問(wèn)題的計(jì)劃,解決問(wèn)題的計(jì)劃;
·驗(yàn)證假設(shè);
·擬定新的計(jì)劃;
·到底有多少效益;
?
【13】調(diào)優(yōu)基本流程圖
?
?
【14】“ 華麗的總結(jié) ”
性能調(diào)優(yōu)的核心思想:就像中學(xué)的時(shí)候,給自己出一個(gè)命題,自己再去證明這個(gè)命題。(呵呵,很生動(dòng)吧。O(∩_∩)O~)
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
