記憶體優化策略:基於實際使用場景的調校
任何系統的調校都應基於實際使用場景進行最佳化。針對人臉辨識機的應用,AI 模型運行極度依賴記憶體,而裝置記憶體通常不足。因此,首要任務是確保應用程式能夠順利執行 AI 模型,之後才有優化執行速度的空間。
應遵循的原則:「先求能運行,再求效能最佳化」。
0. DMA(Direct Memory Access)基礎知識
在討論記憶體管理技術前,需先理解 DMA 的作用:
- DMA 允許硬體裝置(如 GPU、ISP、VPU)直接存取記憶體,而無需經過 CPU。
- AI 推理與影像處理高度依賴 DMA,以確保低延遲與高吞吐量。
- DMA 需要連續的記憶體位址,因此無法使用壓縮技術來節省記憶體。
記憶體管理技術
1. Kernel Samepage Merging(KSM)
KSM 透過合併相同的記憶體頁面來減少 RAM 佔用,適用於匿名頁面(anonymous pages),但無法作用於 ION/DMA buffer。
運作方式:
- 透過定期掃描記憶體來尋找相同的頁面,合併後減少重複佔用。
- 由於需比對頁面,過高的掃描頻率可能影響 CPU 效能。
實測結果:
- 省下的記憶體不到 20MB,佔比不足 10%。
- 增加了 CPU 使用率(可透過
dumpsys meminfo
觀察)。影響分析:
- AI 模型(TensorFlow Lite)
- 使用 GPU delegate,記憶體分配至 ION/DMA buffer,無法受 KSM 影響。
- Camera Buffer
- 主要來自 ION/DMA,需使用 CMA(Contiguous Memory Allocator),不適用 KSM。
- System Services
- 受影響程度有限,因為重複頁面較少。
結論: KSM 效果有限,且增加 CPU 負擔,因此不建議啟用。
2. Swap(交換記憶體)
當 RAM 不足時,系統可將較少使用的頁面移至 Swap(eMMC/Flash),釋放記憶體給關鍵進程,以避免 OOM(Out of Memory)問題。
類型:
- 傳統 Swap(eMMC/Flash)
- 儲存至 eMMC(Flash)或 HDD,降低 RAM 需求。
- 缺點:eMMC I/O 速度遠低於 RAM,頻繁交換會影響效能並加速 Flash 磨損(TBW 限制)。
- ZRAM(壓縮 Swap)
- 在 RAM 內建立壓縮區域,避免傳統 Swap 的 I/O 瓶頸。
結論: 若記憶體極度不足,傳統 Swap 可作為最後防線,但應優先考慮 ZRAM。
3. ZRAM(壓縮 Swap)
ZRAM 是一種在 RAM 內部建立壓縮 Swap 空間的技術,可有效提升可用記憶體並降低 eMMC I/O 負擔。
運作方式:
- 記憶體不足時,系統將較少使用的資料壓縮後存入 ZRAM,而非寫入 eMMC。
- 需要時再解壓縮回 RAM,避免傳統 Swap 帶來的 I/O 瓶頸。
壓縮比與效能:
- LZ4:壓縮與解壓縮速度快,適合即時性需求,為 Android 10 的主流設定。
- ZSTD:壓縮比更高,但 CPU 開銷較大。
實測結果:
- 1GB 的數據經壓縮後可能僅佔 400MB RAM,相當於提升約 2.5 倍的可用 RAM。
- 適用於低記憶體設備,顯著減少 eMMC I/O。
影響分析:
- ZRAM 在 AI Model(TensorFlow Lite)中的影響
- 影響: 避免影響推理速度
- AI Model 主要使用 GPU Delegate,需要低延遲、高吞吐量。
- 由於 AI Model 主要透過 DMA 存取記憶體,無法壓縮,ZRAM 無法提升效能。
- 若 Tensor 資料進入 ZRAM,可能導致推理速度下降。
- ZRAM 在 Camera Buffer(影像處理)中的影響
- 影響: Camera Buffer 需要連續記憶體,不適合放入 ZRAM。
- 原因: Camera Buffer 主要透過 ION + DMA 機制管理,這些緩衝區必須保持固定格式,無法壓縮。
- 結果: 若影像數據進入 ZRAM,可能導致畫面延遲、掉幀甚至影像錯誤。
- ZRAM 在 System Services(系統服務)中的影響
- 影響: ZRAM 適合 System Services,減少 OOM 風險。
- System Services(如 System UI、背景應用)可忍受較高存取延遲,適合存入 ZRAM。
- 測試顯示 System Services 約佔 1100MB RAM,LZ4 壓縮比約 4 倍,因此我們設定 250MB 為 ZRAM 空間。
程式碼實作
內核設定(Kernel Config):
CONFIG_SWAP=y CONFIG_ZRAM=y CONFIG_CGROUP_MEM_RES_CTLR=y CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y CONFIG_QCACHE=y CONFIG_ZSMALLOC=y CONFIG_KSM=y
ZRAM 啟用設定(fstab & init):
# fstab 配置 /dev/block/zram0 none swap defaults zramsize=268435456, max_comp_streams=8 # 啟用 Swap swapon_all /vendor/etc/fstab.qcom # 優化 Page-Cluster write /proc/sys/vm/page-cluster 0
總結
- DMA 記憶體無法使用 ZRAM 與 KSM,因為它需要連續記憶體。
- KSM 效果有限,且增加 CPU 負擔,不建議啟用。
- 傳統 Swap 可作為最後防線,但應避免過度依賴 eMMC。
- ZRAM 是最佳方案,可顯著減少記憶體壓力,但需確保僅壓縮 System Services 相關記憶體,避免影響 AI 模型與影像處理效能。