早期的 memcached 直接對所有記錄進行 malloc 和 free,這種方式極易產生內存碎片,增加作業系統內存管理器的負擔,甚至導致系統整體效率下降。為了解決此問題,memcached 引入了 Slab Allocator 機制。其核心目標是:使用幾個預先確定的尺寸類別中的固定大小內存塊,徹底消除內存碎片問題。
memcached 根據接收數據的大小,選擇最合適的 Slab Class。每個 Slab Class 維護一個空閒 Chunk 列表,數據寫入時從中取出一個 Chunk 存放。這種「按尺寸分類、按需分配」的方式極大地提高了內存復用率。
由於 Chunk 大小固定,存放較小數據時會造成空間浪費(例如 100 字節數據放入 128 字節 Chunk,浪費 28 字節)。官方文檔建議:若能預知客戶端常見數據大小,可調整 Slab Class 列表以減少浪費。
啟動時可通過 -f 參數指定 Growth Factor(預設 1.25),控制相鄰 Slab Class 之間的大小倍率。早期版本固定為 2(powers of 2 策略),導致尺寸間隙大、浪費嚴重。預設 1.25 使尺寸增長更平滑,適合緩存數百字節的記錄。部署前建議根據業務數據平均長度重新計算最佳因子。
使用 stats 命令(via telnet 或 memstat)可獲取資源利用率、連接數、命中率等關鍵指標。此外,stats slabs 和 stats items 提供更細緻的緩存記錄信息。
推薦使用 Brad Fitzpatrick 編寫的 Perl 腳本 memcached-tool,它將統計信息格式化為易讀表格,包含 Slab Class 編號、Chunk 大小、LRU 最老記錄存活時間、分配頁數、記錄數及是否滿載等列,極利於調優分析。
本文系統闡述了 memcached 的 Slab Allocator 原理、優缺點、Growth Factor 調優方法及監控工具。理解這些機制有助於在生產環境中最大化內存利用率,避免性能瓶頸。