為什麼Go pprof 和Docker Stats 之間的「記憶體已使用」指標不同
上下文
在運行的Go 應用程式中Docker 容器中,docker stats 指令會報告線性增加的記憶體使用量。但是,使用 HTTP pprof 監視正在執行的應用程式時,runtime.MemStats.sys 值保持不變。這種差異引發了有關潛在記憶體洩漏的問題。
Cgroup 和內存指標
Docker stats 從 cgroup 中檢索內存使用統計信息,從而優化內存訪問以避免緩存線錯誤共享。因此,cgroups中的usage_in_bytes指標包括頁面快取和RES,它們佔容器內的檔案I/O。
記憶體回收
當容器的記憶體使用達到最大限制時,它會回收未使用的記憶體而不是終止進程。這解釋了為什麼 pprof 報告恆定的 runtime.MemStats.sys 值,而 docker stats 顯示線性增加的記憶體使用量。
驗證
要確認此行為,請新增使用 docker run 指令或 docker-compose.yml 檔案對容器進行記憶體限制。觀察到,當達到限制時,容器將回收記憶體並將其使用量保持在限制以下,如 /sys/fs/cgroup/memory/docker// 的 cgroups 中所示。
結論
pprof 和docker stats 報告的記憶體使用情況的差異源於docker stats 中包含檔案I/O 記憶體和記憶體當施加記憶體限制時,cgroup採取的回收機制。透過了解這些因素,開發人員可以更準確地了解容器的記憶體消耗情況。
以上是為什麼 Go pprof 和 Docker Stats 顯示不同的記憶體使用指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!