我目前遇到的問題是從 Deno.memoryUsage(跨應用程式)回傳的 rss 回傳的 rss 大小小于 heapTotal。這是最近幾天才開始出現的問題。Rss 在某些應用程式中開始較高,然后在這些應用程式中低于 heapTotal。無論使用任何其他框架,這在所有 Deno 應用程式中都是一致的。
我在所有應用程式上都使用 Deno v. 1.27.2。這是一個跨多個應用程式、計算機和開發人員(我正在與一個小團隊合作)的問題,并不特定于任何特定的技術堆疊。
根據我讀過的每篇文章和 Deno 檔案,我的理解是 rss 應該代表 RAM 中行程的總記憶體。它應該包括 heapTotal 和 heapUsed 以及呼叫堆疊。我的理解是它不應該低于 heapTotal。這是我到處看到的圖表:

有沒有人對此有任何見解?我完全誤解了駐留集大小(rss)嗎?Deno 中的 rss 與 Node 中的不同嗎?
我們嘗試過的:
我已經深入研究了 Deno 的 rust 源代碼,發現他們正在使用這個 rust 函式來測量 resident-set-size:
pub fn total_physical_size(&self) -\> usize {
unsafe { v8__HeapStatistics__total_physical_size(self) }
}
它從 v8 引擎中檢索 total_heap_size()。
當我們在發現 bug 后對記憶體統計資料進行采樣時,我們使用了以下函式并在多個應用程式上運行它,總是收到相同的結果:
setInterval(() => {
console.log(Deno.memoryUsage());
}, 500)
這是我們從我們的一個應用程式中收到的值的樣本。
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3894252, external: 29347 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3906964, external: 33617 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3919676, external: 37887 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3932388, external: 42157 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3945100, external: 46427 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3957812, external: 50697 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3970524, external: 54967 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3983236, external: 59237 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3995948, external: 63507 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4008660, external: 67777 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4021372, external: 72047 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4034084, external: 76317 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4046796, external: 80587 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4059508, external: 84857 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4072220, external: 89127 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4084932, external: 93397 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4097644, external: 97667 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 4110356, external: 101937 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4123088, external: 106209 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4135804, external: 110481 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4148520, external: 114753 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4161236, external: 119025 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4173952, external: 123297 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4186668, external: 127569 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4199384, external: 131841 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4212100, external: 136113 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4224816, external: 140385 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4237532, external: 144657 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4250248, external: 148929 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4262964, external: 153201 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4275680, external: 157473 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4288396, external: 161745 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4301112, external: 166017 }
{ rss: 4669440, heapTotal: 4849664, heapUsed: 4313828, external: 170289 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3869548, external: 20807 }
{ rss: 4423680, heapTotal: 4849664, heapUsed: 3882260, external: 25077 }
uj5u.com熱心網友回復:
一些研究表明,Deno 報告為“rss”的不是行程的駐留集大小。它是托管堆的“已提交”(相對于保留)大小。因此,它應該始終大于heapUsed且始終小于heapTotal,這與您獲得的數字相匹配。
Deno 的相關部分core/ops_builtin_v8.rs:
fn op_memory_usage(scope: &mut v8::HandleScope) -> MemoryUsage {
let mut s = v8::HeapStatistics::default();
scope.get_heap_statistics(&mut s);
MemoryUsage {
rss: s.total_physical_size(),
...
所以它甚至沒有嘗試測量你我所說的“RSS”,它只是錯誤地將 V8 報告的內容重命名為“總物理大小”,這是“總堆大小”的已提交部分。
作為參考,當我啟動一個新的 Deno 1.27.2 行程并詢問它的記憶體使用情況時,我得到(以位元組為單位,根據檔案):
{ rss: 3682304, heapTotal: 3862528, heapUsed: 3306952, external: 225 }
讓該行程坐下并從另一個終端檢查其實際 RSS:
$ ps -e | grep deno
3713179 pts/4 00:00:02 deno
$ cat /proc/3713179/status | grep VmRSS
VmRSS: 183028 kB
我們看到,當 Deno 的“rss”報告為 3.5 MB 時,實際 RSS 約為 179 MB。如果你足夠關心,你可以向 Deno 提交一個錯誤。
旁注:每 500 毫秒對堆大小進行采樣是毫無意義的。無論如何,您只能在完整的 GC 周期后獲得有用的新資料,即使在負載很重的應用程式上,這些資料也應該至少相隔幾秒鐘(可能除了對非常具體的分配模式進行壓力測驗的微基準測驗之外)。我不會比一分鐘左右更頻繁地對堆大小進行采樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531237.html
