雲端伺服器記憶體頻寬檢測:容量達標為什麼還掉速
容量夠不代表頻寬夠,三維取證才看得清。
容量達標不等於頻寬達標,用 STREAM 加 Steal Time 與 NUMA 綁定交叉取證,再對照溢價率決定升配還是退款。
先測容量,再測頻寬
買雲端伺服器時,幾乎所有人第一眼看的是記憶體容量:8GB、16GB、32GB。容量寫在訂購頁面上,看得見、對得上,於是被預設為「記憶體沒問題」。但容量只是倉庫面積,頻寬才是堆高機的速度——8GB 的執行個體完全可能在容量全綠的情況下,記憶體吞吐量只有同世代標稱值的一半。
這就是容量達標卻掉速的經典場景:AI 推論、向量檢索、Redis 大 value、JVM 堆內複製這類負載,對 GB/s 的敏感度遠高於對 GB 的敏感度,容量夠用反而先撞上頻寬天花板。
先做兩階段拆解:
- 容量面:
free -h看 total/available,再和訂單規格對一遍,確認沒有被隱藏的 balloon 驅動回收。KVM 下可查dmesg | grep -i balloon。 - 頻寬面:容量對得上不代表頻寬對得上,需要專門的記憶體吞吐測試,下一節展開。
順序必須是先容量、後頻寬。容量不達標,是虛標,直接走退款;容量達標而頻寬掉,才是更隱蔽的超賣 / 限速問題,需要用下面這套取證鏈。
一個經驗判準:如果你買的是「同等容量但價格明顯低一檔」的執行個體,先預設頻寬是可疑項目,而不是預設自己撿到便宜。這類便宜往往來自 CPU 超分、NUMA 跨節點配置或記憶體頻率降檔,最終以性價比溢價率的形式反噬——容量買到了,吞吐量沒買到。
做完原始資料的記錄(執行個體規格、地區、映像檔、計費類型、下單時間),再進入實測。記錄本身是後續工單與降規決策的證據,工單裡只寫「記憶體很慢」幾乎不會得到有效處理。
STREAM 與 sysbench 實測
記憶體頻寬檢測有兩套互補的工具:STREAM 測的是可持續的向量吞吐量(Copy/Scale/Add/Triad),sysbench memory 測的是更貼近「小區塊讀寫」的場景。sysbench vs STREAM memory bandwidth test for cloud servers 的爭論沒有意義,兩者都要跑,因為它們的失真方向不同:STREAM 對小執行個體的 L3 快取過於友善,sysbench 對指令開銷過於敏感,交叉看才不會被單點數字騙到。
STREAM 用法(無 root 也可編譯到 home 目錄):
sudo apt install -y gcc gfortran make
# 下载 stream.c 后:
gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=200000000 stream.c -o stream
OMP_NUM_THREADS=$(nproc) ./stream陣列大小按記憶體的 1/4~1/2 設,太小會全落在快取裡,跑出「虛高頻寬」;否則你測的是 L3 不是 DRAM。
sysbench 側:
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read run
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=write run判定要點有三條:
- 單核 vs 滿核:分別跑
taskset -c 0和全核,記錄 GB/s。若全核幾乎不漲,說明頻寬已被限死,不是核心數不夠。 - 和標稱對照:DDR4 與 DDR5 的代際差約在 1.5~2 倍量級,同代同頻的雲端執行個體之間不該出現兩三倍差距,出現即異常。
- 換算成 vCPU 人均頻寬:
總頻寬 / vCPU 數是判斷記憶體頻寬超賣最實用的指標。共享型執行個體人均頻寬往往只有獨享型的一半,這正是雲端伺服器溢價率的真實來源之一。
跑三遍取中位數,避開整點鄰居高峰。想把這套數字自動換算成人均頻寬與溢價率,可在 /app 裡建範本,把 STREAM、sysbench、執行個體價格一起輸入,產生可對比的性價比檔案。下一節用 Steal Time 和 NUMA 把「掉速」歸因到具體原因。
Steal Time 與 NUMA 取證
上一節只能證明「掉速了」,歸因還得靠另兩個指標:Steal Time 和 NUMA 拓撲。這也是雲端伺服器記憶體頻寬檢測裡最容易被跳過的一層——容量夠、單跑也達標,瓶頸卻藏在排程和記憶體親和性裡。標稱配置頁從不寫這兩項,真實跑分的差距往往就出在這。
先看 st:
vmstat 1 10 # 盯 st 列(Steal Time)
mpstat -P ALL 1 # 逐核 %stealst 長期 >3% 且與頻寬下滑同步,說明 vCPU 時間正被鄰居借走。共享型 KVM 上 CPU steal 與記憶體頻寬的相關性極高,掉的是整條通路,不只是算力。
再看 NUMA:
lscpu | grep -i numa
numactl --hardware
numactl --cpunodebind=0 --membind=0 \
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read run把行程綁到本地節點後頻寬明顯回升,就是跨節點懲罰(常見 20%~40%),不是超賣;若綁定後依然貼著人均頻寬天花板,才是真限速。
拿 st、NUMA 拓撲、綁定前後頻寬三張截圖去開工單,比空口說「變慢了」有效得多。想沉澱成可重複使用的取證模板,可在 /app 裡把這三個數和你付的單價放一起,算清溢價率再決定升級配置、換可用區還是走退款流程。
磁碟快取斷崖驗證
NUMA 綁定後頻寬仍貼著天花板,還差最後一證:用快取斷崖把「記憶體慢」和「磁碟慢」分開。做法是先熱讀、再冷讀同一個檔案,看頻寬在哪個工作集尺寸掉下去。
# 1) 熱路徑:讓 page cache 命中,測的是快取速度
fio --name=hot --filename=/data/blob --rw=read --bs=1M \
--size=4G --direct=0 --runtime=30 --time_based
# 2) 冷路徑:清快取後測真實記憶體→IO 通路
sync && echo 3 > /proc/sys/vm/drop_caches
fio --name=cold --filename=/data/blob --rw=read --bs=1M \
--size=4G --direct=1 --runtime=30 --time_based判讀要點:
- 冷讀頻寬隨工作集從 256M 漲到 4G 呈平滑下降,是正常的記憶體層級與預取行為;
- 跌成斷崖(例如 2G 前後直接腰斬),且斷點遠小於執行個體標稱 L3/快取預期,通常說明記憶體頻寬被節流,而不是磁碟先撐不住;
- 順手看
vmstat 1裡的bi/bo與si/so,若 IO 不高但吞吐驟降,問題基本在記憶體側。
這也是「真實跑分 vs 標稱配置」最容易翻車的地方:8GB 執行個體標稱 DDR4/DDR5 與容量都沒錯,可一旦 AI 推理的 KV cache 或向量檢索把工作集頂出快取,頻寬就先掉,延遲隨即抖動。把斷崖點、NUMA 綁定前後頻寬、%steal 三個數和你實際付的單價放在一起算溢價率,再決定升配、換可用區還是走退款,比反覆重啟有效得多。需要現成的取證範本,可在 /app 裡直接套用。
一句話:容量達標只是入場券,雲端伺服器 記憶體頻寬 檢測要看的是掉速的拐點在哪、拐點之後你還按什麼價買單。
跑分對照與溢價決策
前文已經拿到三組硬數據:STREAM 的 Copy/Triad、NUMA 綁定前後的頻寬差,以及 %steal 曲線。現在就差最後一步——把它們和帳單對齊。做法很簡單,把同一台執行個體的「標稱 vs 實測」寫成兩欄:
# 實測頻寬(GB/s)
sysbench memory --memory-block-size=1M --memory-total-size=10G run | grep transferred
# 單價(元/GB 記憶體/月)= 月費 / 標稱容量
# 性價比 = 實測頻寬 / 單價判讀線可以粗略一點,但必須有數字:
- 實測頻寬達到同世代 DDR4/DDR5 公開值的 70% 以上,
%steal常態低於 2%:正常共享,繼續用; - 頻寬只有標稱預期的 50%~70%,且 NUMA 綁定能拉回 15%+:屬於排程問題,換可用區或指定 vCPU 親和性往往比升級配置便宜;
- 頻寬低於 50% 且
%steal長期 5% 以上、Cache 斷崖又提前出現:這就是典型的 VPS 超賣訊號,屬於 detect cloud server overselling 的鐵證。
把性價比算出來再談動作。假設 8GB 執行個體月費 120 元,實測頻寬只有同價位 AMD EPYC 執行個體的六成,那你的溢價率其實就是 40%——此時升級到 16GB 往往只是把「每 GB 更貴」放大,換機型或走退款更划算。升級前先算溢價率,退款前先留證據:把三次跑分原始輸出、vmstat 裡的 %steal、numactl --hardware 截圖一起提交,工單裡只寫資料不寫形容詞,翻案率高得多。續費前同樣跑一遍,防止續費時偷偷降規。完整的取證表格與工單範本在 /guides/memory-bandwidth-checklist,可以直接照抄。
記住結論:容量達標不等於頻寬達標,用 STREAM 加 Steal Time 與 NUMA 綁定交叉取證,再對照溢價率決定升級配置還是退款。
常見問題
記憶體容量達標但頻寬掉速怎麼查?
先 STREAM 測實際頻寬,再對比標稱值,差 30% 以上即異常。
STREAM 怎麼跑才準?
綁 NUMA 節點,taskset 綁核,多執行緒測 3 次取中位數,避開鄰居高峰。
Steal Time 多少算異常?
持續 >5% 即被超賣,結合 vmstat 看 st,超過 10% 直接取證退款。
怎麼判斷是快取斷崖不是記憶體慢?
用 dd 測磁碟,頻寬驟降且 iowait 飆高,說明快取被限,不是記憶體問題。
跑分對照溢價率怎麼決策?
算每 GB 頻寬價格,溢價 >30% 且掉速 >20% 就降配或退款。