談到軟件產品的性能調優,我認為可以從狹義和廣義兩個范圍來理解。從狹義的范疇來看,性能調優主要是指通過修改軟件程序邏輯、結構等技術手段提升軟件產品的各項性能指標,如響應時間等等;而從廣義的層面來看,就不僅限于程序內部了,因為造成系統性能問題的瓶頸很可能來源于方方面面,而這種情況往往是性能調優很普遍的情況,下面就從廣義的范圍細分成幾個角度來進行闡述。
一、軟件層面
a)首先要談到的肯定是我們自己提供的軟件產品,因為它的內部設計是我們最清楚的,用戶在應用時遇到性能問題首先要質疑的也是我們的產品,因此這個層面的調優肯定是我們軟件供應者的重中之重!舉例來說:比較復雜的業務,通常會在程序中輸出一些關鍵操作的執行時間,然后再分析哪些操作比較耗時,之后再找原因。具體分析原因就比較多了,比如多次循環查詢數據庫,復雜耗時的SQL語句,頻繁的遠程調用,復雜算法,等等。
b)數據庫層面:設計數據庫時應考慮到在少訪問和簡化、優化訪問的前提下實現產品功能,多用存儲過程代替完整SQL,盡量用連接池使用戶和服務的連接實現可復用,盡量不使用游標結構等,對基本表的設計進行優化如第三范式、引入“中間表”的技術思路,控制用戶實際數據量的增長;對數據庫進行索引優化,避免整表掃描;對數據庫的事務處理進行調優(去除不必要的鎖、將事務切分成小的粒度、適當降低隔離級別、減少訪問熱點等);SQL語句調優(盡量優化那些無意義的、拙劣的、復雜的SQL)等等。這方面主要就是本著一個通過盡可能少的磁盤訪問而獲得所需要的數據這么一個基本原則。
c)中間件軟件:某些軟件產品為數據庫、中間件、客戶端的三層架構設計,此時為系統運行提供服務的中間件軟件也將成為制約性能的一個瓶頸。因此在這個層面上也是有很大調優空間的,比如各種相關參數的設置優化,使用性能包、性能監控分析工具等,避免競爭線程資源,批處理,堆大小的設置,為溢出條件設置執行隊列,后備緩沖,減少非重要應用的資源占用,使用集群等。舉個簡單的實例,我曾經遇到一個產品的性能問題,當查詢數據大到一定程度時,系統一直灰屏死機狀態,結果只是通過把JVM內存參數設置從默認值的128調為256就輕松解決了,只是參數值的一個小變動,反映到具體的用戶面前就是出的來和出不來數據的本質差別!
d)操作系統:無論是服務器還是用戶終端,都脫離不了操作系統這個基礎的應用平臺的支持,因此這個層面的性能調優工作也千萬不能遺漏。例如同廠商的不同版本(如WINDOWS各系列)、不同廠商(MS/HP/SUN等)不同的操作系統(WINDOWS/LINUX/UNIX等),這些操作系統的性能表現本身就有所差異,如內存的分配、虛擬內存的處理、數據的讀寫交換、兼容穩定抗壓性等等方面,利用相應的調優方法和工具,可以對此環節進行優化。
二、硬件層面
a)CPU:中央處理器,決定數據處理速度的核心部件,與性能表現的相關度可想而知,硬件方面具體調優方法及工具本文中不再贅述,下同!
b)內存、緩存:數據交換的臨時存儲空間,它的大小形象的說就像是火車站候車室的面積,與性能的關系可想而知。比如有些程序設計的操作對內存回收設計有漏洞,導致頻繁操作時內存泄漏越來越多,系統就會越來越慢。
c)硬盤、I/O:數據存儲、調用的載體,如果存儲器像候車室,那這些就像是車箱的大小與節數等。
d)網絡:如果還是用坐火車為例,網絡的差別就像是普通、快速、動車、磁浮等各種等級的差別,如果一個“系統”頻繁需要通過火運完成,那它的性能表現和網絡的相關性就不言而喻了。比如某些軟件功能設計時沒有考慮網絡流量方面的風險,導致每次操作時網絡連接次數很多,頻繁調用或是數據包過大,這些都會導致在一定網絡條件下產生性能問題。
e)顯卡等特殊硬件:不同軟件產品應用的業務可能用到不同的專用硬件或外設,比如一個很炫的游戲對顯卡的要求就會很高,當顯示成為短板時死機、跳幀等異常;一個收款臺的掃描、信用卡POS機如果質量或兼容性、穩定性不佳時,也可能會造成性能表現的不理想,等待諸如此類問題。
三、業務層面
a)業務流程重組:項目甲方在購買軟件產品或系統服務前,一般會找相關專家、售前人員作一些相關的評估或“體檢”,找出現有運作模式下的一些存在優化空間的錯誤環節或繁冗流程、制度體系等。因此在這個階段是否對項目應用方作了足夠的優化,也對未來產品上線后的應用性能表現在宏觀上起著決定作用。取例來說:如果一個系統設計前沒有作過這方面的優化,最后應用時需要100人操作10個步驟才能完成,通過流程重組后,從業務上只需要40個人干5個步驟就搞定了,那么沒上軟件前我們就能從理論上把性能表現優化80%!
b)需求定位:與上一條闡述的類似,只是介入的階段和角色有所區別。需求人員有時是從項目乙方發起的,主動地、有策略性的去選擇一些有代表性的單位去調研軟件產品的概要或詳細需求,為后續的產品開發設計提供依據。在這一階段是否有效的考慮了未來產品的性能表現,對其提出相關的設計目標,也對后續的性能表現有一定的影響。
c)實施方案:一般當大型一些的項目合同簽訂完畢后,就會分期安排實施人員負現場牽頭并組織雙方成立實施小組團隊,共同制訂系統的上線、操作培訓、應用方案等,并執行方案直至系統正常上線運行,項目交付。因此,這個方案制定的是否精簡、高效,也直接關系了用戶應用系統的性能表現。
四、意識層面
當今社會萬事講求以人為本,如果從軟件應用系統涉及的各級人員角色的內心沒有把性能表現當回事,那么一切調優最多也都是亡羊補牢而已。比如:
a)產品經理:項目乙方產品總負責人,產品目標、市場定位、基本框架的制定者。
b)一線人員:售前咨詢、實施顧問等。
c)需求設計:對產品具體功能設計提出明確要求的角色。
d)代碼實現:按需求定義進行產品的具體實現的角色。
e)測試人員:對產品質量進行檢測、對開發過程進行監管的角色。
f)最終用戶:系統最終的使用者、應用效果的影響者。
對于一個軟件產品來講,只有以上這些環節的角色人等在各自的工作崗位上,真正的在意識層面上提高優化系統性能的地位,而不是把它作為功能優先實現之外的附屬品,才能把系統性能優化的工作最大程度的作在前面、作的全面、作得到位!
綜上所述,我們看到了各類導致性能瓶頸的可能原因(也可以說是性能調優的入手點),下面我們用一個比較常用的魚骨圖分析法來展示一下,可能會更為清晰:
然后我們再把這些原因按一定的規則進行分門別類,一般采用如下的二維矩陣分析的方法,按可推行的難易度和收效的影響度高低來形成四個象限,把這些問題按具體情況分布在這四個象限中,看到這些問題中哪些是我們要優先解決的,哪些是可以暫時放一放的,調優時可以借鑒這個順序來進行。

當然在不同的企業這四個象限中的原因分布是會相互轉化的,比如在一個預算有限的私企中可能額外的硬件投資對其來說就是應該放入暫時擱置的象限,而對于財大氣粗的單位中可能費用預算不是問題但是想改變他的辦事流程和組織架構將是非常困難的,這時解決的優先次序也就要相應調整了。