Skip to main content
Select a menu in the customizer

Android 爛裝置想跑人臉辨識3- 系統優化-ZRAM,SWAP,KSM,擴張最大值

記憶體優化策略:基於實際使用場景的調校

任何系統的調校都應基於實際使用場景進行最佳化。針對人臉辨識機的應用,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)問題。

類型:

  1. 傳統 Swap(eMMC/Flash)
    • 儲存至 eMMC(Flash)或 HDD,降低 RAM 需求。
    • 缺點:eMMC I/O 速度遠低於 RAM,頻繁交換會影響效能並加速 Flash 磨損(TBW 限制)。
  2. 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。

影響分析:

  1. ZRAM 在 AI Model(TensorFlow Lite)中的影響
    • 影響: 避免影響推理速度
    • AI Model 主要使用 GPU Delegate,需要低延遲、高吞吐量。
    • 由於 AI Model 主要透過 DMA 存取記憶體,無法壓縮,ZRAM 無法提升效能。
    • 若 Tensor 資料進入 ZRAM,可能導致推理速度下降。
  2. ZRAM 在 Camera Buffer(影像處理)中的影響
    • 影響: Camera Buffer 需要連續記憶體,不適合放入 ZRAM。
    • 原因: Camera Buffer 主要透過 ION + DMA 機制管理,這些緩衝區必須保持固定格式,無法壓縮。
    • 結果: 若影像數據進入 ZRAM,可能導致畫面延遲、掉幀甚至影像錯誤。
  3. 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

總結

  1. DMA 記憶體無法使用 ZRAM 與 KSM,因為它需要連續記憶體。
  2. KSM 效果有限,且增加 CPU 負擔,不建議啟用。
  3. 傳統 Swap 可作為最後防線,但應避免過度依賴 eMMC。
  4. ZRAM 是最佳方案,可顯著減少記憶體壓力,但需確保僅壓縮 System Services 相關記憶體,避免影響 AI 模型與影像處理效能。