[英]How to get Current and accurate Memory Usage of k8s Pod running Node JS application
我有一个在 k8s pod 上运行的 NodeJS 应用程序。 pod 的实际大小为 2GB,但在环境变量中,我们将此值设置为 4GB --max-old-space-size=4096
(在我的情况下不会如此 - 对于某些租户,我们确实分配了 4GB,但大多数豆荚有 2GB)。
现在我尝试了 2 种方法来检测内存使用情况和总内存,并且都提供了不同的统计信息。
/sys/fs/cgroup/memory/memory.usage_in_bytes
和来自这个文件的总内存: /sys/fs/cgroup/memory/memory.limit_in_bytes
limit_in_bytes
正确返回 2GB,但usage_in_bytes
的值波动太大,几分钟后大约 1GB 并在下一分钟飙升至 2GB,即使那一分钟没有任何变化(对系统没有压力)。
进程统计
Memory Usage POD: 2145124352
shlog - memLimit 214748364
我尝试的第二个选项是使用这个V8
内置的节点 js 库来获取堆统计信息: https : //nodejs.org/api/v8.html#v8getheapstatistics 。 用法:
const initialStats = v8.getHeapStatistics(); console.log("heap_size_limit: ", (initialStats.heap_size_limit)); // total memory console.log("total_heap_size: ", (initialStats.total_heap_size)); // current usage
现在在总内存中,它返回 4G,这对我来说是不正确的。 但这里的当前用法似乎非常正确。
同一进程的统计
total_heap_size: 126312448,
heap_size_limit: 4320133120,
v8 getHeapStatistics 方法的完整响应:
HeapStats: {
total_heap_size: 126312448,
total_heap_size_executable: 1097728,
total_physical_size: 124876920,
total_available_size: 4198923736,
used_heap_size: 121633632,
heap_size_limit: 4320133120,
malloced_memory: 73784,
peak_malloced_memory: 9831240,
does_zap_garbage: 0,
number_of_native_contexts: 1,
number_of_detached_contexts: 0
}
我的目标是根据 pod 的总内存检测内存使用情况,因此当内存消耗达到 85% 时进行一些节流。 我愿意使用第一种方法,但请告诉我为什么内存使用量差异如此之大,以及如何获得 pod 的准确内存使用量。
真的很期待在这方面得到一些帮助。 谢谢你。
要获得进程的整体内存消耗,请查看(并信任)操作系统的设施。
Node 的v8.getHeapStatistics
告诉你所有 JavaScript 对象所在的托管(又名垃圾收集)堆。 但是在这个过程中可能会有相当多的其他非垃圾收集内存,例如节点缓冲区和某些字符串,以及不在托管堆上的各种通用基础设施。 在平均的 Chrome 渲染器进程中,JavaScript 堆往往占总内存消耗的三分之一左右,但在两个方向上都有明显的异常值; 对于 Node 应用程序,它在很大程度上取决于您的应用程序在做什么。
将 V8 的最大堆大小(同样,它只是进程整体内存使用的垃圾收集部分)设置为大于可用内存量的值没有多大意义:它会导致可避免的崩溃,因为当 V8 认为还有大量可用内存时,它不会在垃圾收集上花费太多时间,但此时 OS/pod 整体可能已经面临内存不足的情况。 这就是我链接另一个答案的原因:您很可能希望将最大堆大小设置为略小于可用内存的值,以便为垃圾收集器提供有关何时更努力地工作以保持在限制之下的正确提示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.