【发布时间】:2021-12-25 14:10:31
【问题描述】:
我有一个在 k8s pod 上运行的 NodeJS 应用程序。 pod 的实际大小是 2GB,但在环境变量中,我们将此值设置为 4GB --max-old-space-size=4096(在我的情况下这不是真的 - 对于某些租户,我们确实分配了 4GB,但大多数 pod 有 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 的准确内存使用情况。
真的很期待在这方面得到一些帮助。谢谢。
【问题讨论】:
-
这两个数字可能都是对的,但衡量的是不同的东西;查看
v8文档,我可能希望total_physical_size或malloced_memory更接近cgroups 分配统计信息。您是专门尝试测量节点堆内存(与节点可能分配的其他内存不同),还是只是进行抽象的“可用内存的 85%”测量?您可以设置一个 HorizontalPodAutoscaler 来创建更多 pod,而不是限制自己? -
@DavidMaze 我已经用
total_physical_size和malloced_memory更新了我的问题,过程相同,请检查。我正在尝试获取 pod 的当前内存使用情况(将在运行某些进程之前检查这一点)。不,不能创建更多的 pod,我们只有一个 pod,需要自己实现限制。
标签: node.js kubernetes memory heap-memory v8