本文轉載自【微信公眾號:碼磚雜役,ID:whatis9527want】經微信公眾號授權轉載,如需轉載與原文作者聯繫
先列個提綱,後面補充內容
## 一、關注和度量
### 關注
- 優化執行效率
- 優化內存佔用
- 優化IO
- 磁碟IO
- 網絡IO
### 度量
- 吞吐量
- 響應時間(Response Time)、延遲(Delay):追求可容忍延遲下的最大吞吐率
- 並發:TPS、QPS、OPS、IOPS、最大連接數
- TP99
- 資源使用率:CPU、內存、帶寬
## 二、計算機系統
### CPU架構
- 運算單元 + 記憶單元 + 控制單元
- 總線:數據總線、地址總線、控制總線
- 多CPU、多核、超線程
- 指令周期:取指、譯指、執行、寫回
- 指令流水線
- CPU如何讀取數據?
- CPU如何執行任務?
### 存儲金字塔
一次內存訪問需要200-300個CPU時鐘周期,意味著CPU和內存的訪問速度相差200倍,這個鴻溝由高速緩存填充
- 高速緩存(Cache):
- On-chip Cache:單個CPU核心獨立
- L1 Cache:通常大小32/64KB、速度4 Cycles
- L1數據Cache:循環優化
- L1指令Cache:
- 分支預測(動態分支預測和likely/unlikely)
- 綁核
- inline
- L2 Cache:通常大小256KB,速度10 Cycles左右
- Off-chip Cache:多個CPU核心共享
- L3 Cache :通常數MB、速度40 Cycles左右
- Cache Line:64B
- 緩存命中性:Cache Hit
- 如何寫出CPU執行快的程序
- 如何提高緩存命中性
- 緩存一致性:Cache Coherence
- 寫回Write Back、寫直達Write Through、寫傳播Write Propagation
- MESI協議
- 內存
- 磁碟(HHD)、固態硬碟(SSD)
### 程序
- 數據結構
- 算法
### 內核態和用戶態
### 虛擬地址空間
- 代碼段
- 數據段
- 堆
- 棧
- BSS
- 只讀數據區、常量數據區
- 共享存儲區
### 調度與CPU運行隊列
### 中斷與系統調用
## 三、監控
- 性能優化、監控先行
- 你度量什麼,你得到什麼
- 搭建能真實模擬的壓測環境是性能優化的前提條件
## 四、工具
- linux系統相關命令
- perf和火焰圖
- gprof2dot.py
## 五、方法
- 如何定位CPU瓶頸?
- 如何定位IO瓶頸?
- 如何定位網絡瓶頸?
- 如何定位鎖的問題?
- 如何提高並發能力?
## 六、實踐經驗
- 空間換時間
- 利用局部性
- 延遲計算、提前計算
- 優化循環
- 無鎖編程、減少鎖的粒度
- 正確理解內存屏障
- 內存管理和優化
- 字符串比較和HASH
- 減少拷貝,減少傳參,減少調用,減少存儲引用
- 防禦性編程適可而止、過猶不及
- 批處理和Prefetch
- SIMD
- 熟悉編譯器選項:LTO、PGO、INLINE
- 結構體優化
- release乾淨
- 分支預測
-慎用遞歸