編輯推薦
從基礎知識到全新技術,從係統開發到運維,195張圖解講透性能!
1.專業團隊撰寫,開發、測試、運維工程師值得擁有!
本書由實戰經驗豐富的Oracle高級顧問執筆,全麵地介紹瞭係統性能的方方麵麵,涉及服務器、CPU、內存、存儲、網絡,等等。
2.理論結閤實際,滿載實用技巧!
書中列舉瞭豐富的實例以及在實際開發過程中會齣現的各種場景,嚮讀者傳授瞭有用的實戰技巧。
3.圖文直觀,由淺入深,講解細緻!
結閤直觀的插圖,從算法等基礎知識講起,到虛擬化和雲計算等環境下的性能優化,由淺入深,便於理解。
內容簡介
《圖解性能優化》由有著豐富的係統開發和運維經驗的Oracle高級顧問執筆,詳細解說瞭係統性能的相關知識。從性能的概念講起,由淺入深,全麵介紹瞭性能分析的基礎知識、實際係統的性能分析、性能調優、性能測試、虛擬化環境下的性能分析、雲計算環境下的性能分析等內容。書中列舉瞭豐富的實例,並結閤直觀的插圖,嚮讀者傳授瞭有用的實戰技巧。另外,因為係統性能和係統架構密切相關,所以讀者在學習係統性能的過程中還能有效地學到係統架構的相關知識。
作者簡介
小田圭二(作者)
日本Oracle株式會社谘詢部門經理。在解決性能問題方麵有著豐富的經驗,著有《圖解OS、存儲、網絡:DB的內部機製》(絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている)、《圖解Oracle的機製》(絵で見てわかるOracleの仕組み)等多部著作。
榑鬆榖仁(作者)
日本Oracle株式會社高級首席顧問。曾在Emprix公司(美國本部)就職,為SIer和一般企業提供壓力測試、性能管理等方麵的谘詢服務。之後就職於日本Oracle株式會社,還負責為使用Java、WebLogic、Exalogic等中間件産品的客戶提供谘詢服務。
平山毅(作者)
在東京理科大學理工學部上學期間成為Sun Site用戶,專業是計算機科學和統計學。曾在日本某大型互聯網公司就職,目前在世界上第1大的雲計算供應商做架構師和谘詢顧問,負責瞭多個大規模的國際性案件。喜歡的技術是Oracle、VCE、AWS。
岡田憲昌(作者)
曾在某IT公司做基礎設施的設計、搭建和運維工作,後就職於日本Oracle株式會社,負責Oracle産品的設計和PM支持、DBA支持等。目前在某大型虛擬化軟件供應商做谘詢顧問和研發技術經理,負責為虛擬化基礎設施和雲計算的設計、運維等提供谘詢服務。
目錄
第1章 性能的基礎知識 1
1.1 學習性能所必需的知識……2
1.2 算法的優缺點與學習方法……4
1.2.1 什麼是算法……4
1.2.2 算法的基礎……5
1.2.3 學習算法的竅門……7
1.3 算法的應用實例及性能的差異……8
1.3.1 日常生活中算法的例子……8
1.3.2 對性能的影響程度……9
1.3.3 評價算法的指標……11
學習信息科學的重要性……13
1.4 響應與吞吐的區彆……14
係統工程師學習編程的重要性……16
1.5 算法的具體例子……16
1.5.1 數組與循環處理……16
1.5.2 鏈錶與循環處理……19
1.5.3 樹與查找……21
1.5.4 散列算法……25
1.5.5 隊列……28
1.5.6 棧……32
1.5.7 排序(快速排序)……34
1.5.8 緩存①(迴寫)……36
1.5.9 緩存②(直寫)……38
DMBS是數據結構與算法的寶庫……38
1.5.10 鎖與性能……40
【高級篇】鎖的機製是如何實現的……42
【高級篇】性能優劣不能隻看正常情況……44
第2章 性能分析的基礎 45
2.1 性能分析從測量開始……46
2.2 什麼是必要的性能信息……46
2.2.1 “分段查找”原則……46
2.2.2 性能信息的3種類型……48
2.2.3 係統的模型與性能故障時的運作情況……50
2.2.4 數據的種類及分析的竅門……53
2.3 性能分析中的重要理論……54
2.3.1 等待隊列理論的術語……55
2.3.2 計算等待隊列的平均等待時間……56
2.3.3 使用率和等待隊列的例子……57
2.3.4 實際上可以獲取哪些信息……59
需要定期確認性能嗎?……61
2.4 OS的命令……61
2.4.1 sar……62
2.4.2 vmstat……64
時間同步非常重要……66
2.4.3 ps……66
2.4.4 netstat……68
2.4.5 iostat……70
2.4.6 top……73
2.4.7 數據包轉儲(wireshark、tcpdump等)……74
2.4.8 pstack……76
2.4.9 係統調用(strace等)……78
2.4.10 Profiler……80
2.4.11 Windows環境……81
第3章 實際係統的性能分析 85
3.1 Web/AP服務器與Java/C應用程序……86
3.1.1 Web服務器的訪問日誌……86
3.1.2 應用程序、AP服務器的日誌……87
3.2 DB服務器的性能測量……90
3.2.1 DBMS的性能測量的原理……90
3.2.2 性能分析告一段落……92
批處理的性能測量……93
3.3 存儲性能分析的思路……94
3.3.1 存儲的相關術語……94
3.3.2 存儲性能分析的思路:重視IOPS……96
3.4 網絡性能分析的思路……100
性能故障數據應該保存多久?……102
3.5 調查原因……102
3.5.1 初學者容易掉入的陷阱……103
3.5.2 應有的態度……106
獲取各種性能信息的時間要吻閤嗎?……108
3.5.3 實際的調查流程……108
性能分析的理想工具……111
第4章 性能調優 113
4.1 性能與調優……114
4.1.1 現實中的性能……114
4.1.2 在現場要保持“大局觀”……117
4.2 性能調優的準則……118
4.2.1 設定既不能太粗也不能太細,要剛剛好……119
4.2.2 調優要循序漸進……120
4.2.3 通過重復使用來提速……121
4.2.4 匯總處理(集中、Piggyback)……121
4.2.5 提高速度與實現並行……123
4.2.6 縱嚮擴展與橫嚮擴展……124
4.2.7 局部性……124
編譯器會與RDBMS走上同一條道路嗎?……125
4.3 現場可以使用的技巧……126
4.3.1 省略循環,減少投接球……126
4.3.2 訪問頻率高的數據存放入鍵值存儲或散列錶中……127
4.3.3 訪問頻率高的數據放在使用位置附近……127
4.3.4 把同步變成異步……128
4.3.5 帶寬控製……130
4.3.6 LRU算法……131
4.3.7 分割處理或者細化鎖的粒度……131
4.3.8 使用不丟失的迴寫緩存……132
4.3.9 使用多層緩存……132
4.3.10 使用巨幀和高速網絡……132
4.3.11 負載均衡、輪詢……133
4.3.12 關聯性、綁定、粘滯會話……134
4.3.13 寫時復製……135
4.3.14 日誌……136
4.3.15 壓縮……137
4.3.16 樂觀鎖……137
4.3.17 列式數據庫……138
4.3.18 服務器的性能設置中,初始值=最大值?……139
4.4 實際業務中碰到的性能問題……139
4.4.1 性能比較的參考數據……139
4.4.2 緩存命中率並不一定要高……140
4.4.3 存儲的調優方針……141
4.4.4 雖然容量足夠,但還是添加磁盤……141
4.4.5 從性能角度看文件分割……142
4.4.6 90百分位……143
4.4.7 讀取與寫入的比例……143
4.5 調優的例子……144
4.5.1 例1:2層循環中select語句的執行……144
4.5.2 例2:偶爾齣現性能下降……147
等待隊列的前麵發生瞭什麼?……149
第5章 性能測試 151
5.1 性能測試的概要……152
5.1.1 項目工程中的性能測試……152
5.1.2 不同職責的性能測試相關人員……153
5.2 常見的失敗情況:9種反麵模式……156
5.2.1 不能在期限內完成……156
5.2.2 性能很差!解決不瞭性能問題……157
5.2.3 由於沒有考慮到環境差異而導緻發生問題……158
5.2.4 壓力場景設計不完備導緻發生問題……159
5.2.5 沒有考慮到緩衝、緩存的使用而導緻發生問題……159
5.2.6 沒有考慮到思考時間而導緻發生問題……160
5.2.7 報告內容難以理解導緻客戶不能認同……162
5.2.8 客戶因為存在不信任感而不能認同……163
5.2.9 測試很花時間……164
5.3 性能測試的種類……167
5.3.1 實施的周期……168
5.3.2 狹義的性能測試……169
5.3.3 臨界測試(臨界性能、迴退性能、故障測試)……169
5.3.4 基礎設施性能測試……174
5.3.5 應用程序單元性能測試……178
5.3.6 耐久測試……179
5.3.7 關聯領域……180
5.4 項目工程中考慮的性能測試……181
5.4.1 需求定義……181
5.4.2 項目規劃……186
5.4.3 【基本設計】選擇係統……187
5.4.4 【基本設計】性能測試環境……188
5.4.5 【基本設計】其他與性能設計相關的事項……191
5.4.6 【性能測試設計】測試計劃的細節……192
5.4.7 【性能測試設計】人員配備與聯絡體製……194
5.4.8 【基礎設施集成測試】基礎設施性能測試……195
5.4.9 【集成測試】多並發運行測試……197
5.4.10 【係統測試】壓力測試、臨界測試、耐久測試……197
5.4.11 【運維測試】性能監控測試、故障測試……198
5.4.12 【交付】性能測試結果的驗收報告……198
5.4.13 【運維】初期運行確認……199
5.5 性能測試的課題與必要的技巧……200
5.5.1 性能預估能力……200
5.5.2 高效的反復實施能力……202
5.5.3 Oracle Application Testing Suite的使用效果……203
第6章 虛擬化環境下的性能 209
6.1 虛擬化與性能……210
6.2 虛擬化的概要……211
6.2.1 什麼是服務器虛擬化……211
6.2.2 虛擬化的種類……212
硬件輔助虛擬化……214
6.3 服務器虛擬化的主要技術(過載使用)……215
6.3.1 CPU的虛擬化技術……215
6.3.2 內存的虛擬化技術……218
6.4 虛擬化環境下性能的相關知識與分析方法……225
6.4.1 性能分析的工具……225
6.4.2 CPU的性能管理……226
6.4.3 內存的性能管理……231
6.4.4 存儲的性能管理……234
還沒使用DRS嗎?……237
6.4.5 網絡的性能管理……240
延遲靈敏度功能……243
第7章 雲計算環境下的性能 245
7.1 雲計算環境下性能的相關知識……246
7.1.1 雲計算環境下性能會變差嗎……246
7.2 雲計算與本地部署的差異……247
7.2.1 雲計算的定義……248
7.2.2 從雲計算的特點來看與本地部署環境的不同……248
雲計算實現的終極全球化……251
7.2.3 雲計算的實現形態……251
混閤結構的成本管理就是使用實物期權實現的投資組閤管理……252
7.2.4 從雲計算的服務模式來看其與本地部署的差彆……253
雲計算環境中可以把盈虧平衡點圖形化(獨自SaaS提供的最優費用模型)……254
7.2.5 把握資源的變動因素與固定因素……254
7.3 雲計算環境的內部結構與最佳應用程序架構……262
7.3.1 集中式?分布式?……262
7.3.2 緊耦閤?鬆耦閤?……264
7.3.3 SOAP?REST?……265
能夠把握抽象化的雲計算環境的美國人——圖與想象的重要性……268
7.3.4 前端的分布式處理:網絡的訪問方法……269
7.3.5 後端的分布式處理:數據存儲的知識(從ACID到BASE)……271
7.3.6 提高TCP通信的速度……272
7.3.7 提高對象存儲的速度……272
7.3.8 C語言?Java語言?還是腳本語言?……273
7.3.9 雲計算環境下高性能服務的架構……274
7.3.10 開放遷移與雲計算遷移……277
7.3.11 推測雲計算的內部結構……278
7.4 雲計算環境下性能分析的方法……278
7.4.1 獲得雲計算環境的基準數據的價值與不斷進化的性能值……278
性能領域是理科工程師的特權?……280
7.4.2 Web係統的基本分析方法……281
7.4.3 批處理係統的基本分析方法……282
7.4.4 雲計算的自動擴展功能……283
7.4.5 解析雲計算環境中的復雜信息的統計方法……284
7.5 雲計算環境中開發階段的思維方式……285
7.5.1 估算(基本設計)……286
7.5.2 性能測試(係統測試)……287
7.5.3 項目管理……287
雲計算環境下,經營者也需要關注詳細的性能數據嗎?……288
7.6 雲計算環境中運維階段的思維方式……289
7.6.1 容量管理……289
閾值設置與係統安全係數、標準化的價值……290
7.6.2 故障發生時的降規模容量運維……292
7.6.3 生命周期與更新……293
雲計算實現的DevOps中性能調優的高效化……294
參考文獻……296
作者簡介……297
《代碼重構的藝術:讓你的程序煥發生機》 你是否曾麵對過一段棘手、難以理解、維護成本高昂的代碼,感到束手無策?你是否渴望擁有一種係統性的方法,能夠化腐朽為神奇,讓那些陳舊的代碼重新煥發活力,變得更加健壯、高效且易於維護?那麼,《代碼重構的藝術:讓你的程序煥發生機》將是你不可或缺的指南。 本書並非關於“性能優化”這個概念的簡單介紹,而是深入探討代碼重構這一至關重要的軟件工程實踐。我們相信,卓越的性能往往源於清晰、優雅、富有錶現力的代碼結構。與其僅僅在現有混亂的代碼基礎上修修補補,不如通過係統性的重構,從根源上解決問題,為程序的長遠發展奠定堅實基礎。 本書的核心關注點: 理解重構的本質與價值: 我們將首先闡述重構並非簡單的“修改代碼”,而是在不改變程序外在行為的前提下,對代碼內部結構進行改善的過程。你將深入理解為什麼重構是軟件開發生命周期中不可或缺的一環,它如何降低技術債務,提高開發效率,減少Bug,以及如何為未來的功能擴展和性能優化預留空間。 係統性的重構手法: 本書將循序漸進地介紹一係列經過實踐檢驗的、經典的重構手法。這些手法並非零散的技巧,而是構成瞭一個完整、有序的重構體係。我們將詳細解析: 封裝與解耦: 如何通過“提取方法”、“提取類”、“隱藏委托”、“移除中間人”等手法,將復雜的功能分解為更小、更獨立的單元,降低模塊間的耦閤度,提高代碼的可讀性和可維護性。 簡化與提煉: 如何通過“閤並重復代碼”、“移動語句”、“內聯變量/方法”等技巧,消除冗餘,讓代碼更加精煉,易於理解。 改善命名: 為什麼說“命名即設計”,我們將深入探討如何通過“替換命名”、“添加/移除參數”、“參數對象化”等方式,賦予變量、函數、類更有意義、更具錶現力的名字,讓代碼“自文檔化”。 應對繼承與多態: 如何通過“移動方法/字段”、“提取超類/子類”、“替換繼承為委托”等手段,構建更加靈活、可擴展的繼承體係。 處理條件邏輯: 如何通過“移除嵌套條件”、“替換條件為多形體”、“引入衛語句”等方法,化繁為簡,使復雜的條件分支變得清晰易懂。 其他關鍵重構: 此外,我們還將涵蓋“內聯類”、“隱藏委托”、“引入參數對象”、“移除參數”、“分解臨時變量”等一係列實用且經過驗證的重構技術。 重構的實踐策略與流程: 掌握重構手法隻是第一步,更重要的是如何在實際開發中有效地運用它們。本書將為你勾勒齣清晰的重構路綫圖: 識彆“代碼壞味道”(Code Smells): 我們將介紹一係列常見的“代碼壞味道”,這些是代碼中潛在問題的信號,是進行重構的絕佳時機。例如:過長的函數、巨大的類、重復的代碼、過多的參數、富有的類、散碎的變更是如何影響代碼質量的,以及如何通過重構來根除它們。 製定重構計劃: 如何在不影響開發進度的情況下,將重構融入日常開發流程?我們將討論如何評估重構的風險,如何製定閤理的重構計劃,以及如何在敏捷開發環境中高效地進行重構。 安全重構的保障: 信心是重構的關鍵。本書將強調單元測試在安全重構中的核心作用。你將學會如何構建健壯的單元測試套件,以及如何在每次重構後,通過運行測試來驗證代碼行為的準確性,讓你無後顧之憂地進行大膽的改進。 自動化工具的應用: 現代IDE提供瞭強大的重構工具,能夠極大地提高重構的效率和準確性。我們將引導你瞭解和使用這些自動化工具,讓重構事半功倍。 重構與設計原則的協同: 重構並非孤立存在,它與SOLID原則、KISS原則、DRY原則等軟件設計原則相輔相成。本書將深入探討重構如何幫助我們更好地踐行這些設計原則,從而寫齣更加“設計良好”的代碼。 真實世界的案例分析: 理論結閤實踐是本書的一大特色。我們將通過精心挑選的、來自真實項目中的案例,生動地展示各種重構手法的應用場景、實施過程以及帶來的顯著收益。從簡單的函數提取到復雜的類重構,你將看到“壞味道”是如何被一步步消除,代碼是如何被逐步優化,最終煥發新生。 進階話題的探索: 隨著你重構技能的提升,我們還將觸及一些進階話題,例如:如何應對遺留係統的重構挑戰、如何進行大規模重構、如何構建可重構的代碼架構等,為你打開更廣闊的視野。 本書的目標讀者: 初級開發者: 幫助你建立起良好的代碼編寫習慣,避免踩入常見的“代碼陷阱”。 中級開發者: 提升你的代碼洞察力,讓你能夠識彆代碼中的問題,並掌握係統性的解決方案。 高級開發者和技術領導者: 為你提供一套行之有效的工具和方法論,以應對日益復雜的項目需求,指導團隊構建高質量、可維護的代碼庫。 任何渴望提升代碼質量的人: 無論你的具體角色是什麼,隻要你希望編寫更優秀的代碼,本書都將為你提供寶貴的知識和啓示。 為什麼選擇《代碼重構的藝術:讓你的程序煥發生機》? 我們深知,優秀的軟件不僅僅在於實現瞭多少功能,更在於它是否能夠長久地、穩定地、高效地運行。代碼的“健康度”是衡量軟件生命力的重要指標。而重構,正是提升代碼健康度的最直接、最有效的手段。 本書的寫作風格力求清晰、易懂、實操性強。我們避免瞭晦澀的理論空談,而是聚焦於“如何做”以及“為什麼這樣做”。每一章節都圍繞著實際問題展開,提供可落地的方法和步驟。我們相信,通過係統地學習和實踐本書的內容,你將能夠: 提升代碼的可讀性和可理解性: 讓你的代碼像一本好書,讀者可以輕鬆地理解其邏輯和意圖。 降低代碼的維護成本: 減少修復Bug和添加新功能所需的時間和精力。 增強代碼的健壯性和可靠性: 減少潛在的錯誤,提高程序的穩定性。 提高開發團隊的協作效率: 清晰的代碼更容易被團隊成員理解和共同開發。 為未來的技術演進打下堅實基礎: 擁有良好結構的代碼更容易適應技術變革和新的業務需求。 《代碼重構的藝術:讓你的程序煥發生機》將是你從“代碼的搬運工”蛻變為“代碼的雕塑傢”的堅實旅程。讓我們一起,用精湛的技藝,將冰冷的代碼,塑造成有生命力的藝術品。