kubernetes pod 高缓存内存使用率

use*_*098 1 memory jvm memory-leaks kubernetes kubernetes-pod

我有一个在 k8s 上运行的 java 进程。

\n

我设置Xms和Xmx来处理。

\n
java -Xms512M -Xmx1G -XX:SurvivorRatio=8 -XX:NewRatio=6 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -jar automation.jar\n
Run Code Online (Sandbox Code Playgroud)\n

我的预期是 pod 应该消耗 1.5 或 2 GB 内存,但它消耗的内存更多,接近 3.5 GB。太多了。\n如果 \xc4\xb1 在虚拟机上运行我的进程,它消耗的内存要少得多。

\n

当 \xc4\xb1 检查 pod 的内存统计信息时,\xc4\xb1 表示 pod 分配了过多的缓存内存。

\n

RSS近1.5GB就可以了。因为Xmx是1gb。但为什么缓存近3GB。

\n

有什么方法可以调整或控制这种用法吗?

\n
/app $  cat /sys/fs/cgroup/memory/memory.stat\ncache 2881228800\nrss 1069154304\nrss_huge 446693376\nmapped_file 1060864\nswap 831488\npgpgin 1821674\npgpgout 966068\npgfault 467261\npgmajfault 47\ninactive_anon 532504576\nactive_anon 536588288\ninactive_file 426450944\nactive_file 2454777856\nunevictable 0\nhierarchical_memory_limit 16657932288\nhierarchical_memsw_limit 9223372036854771712\ntotal_cache 2881228800\ntotal_rss 1069154304\ntotal_rss_huge 446693376\ntotal_mapped_file 1060864\ntotal_swap 831488\ntotal_pgpgin 1821674\ntotal_pgpgout 966068\ntotal_pgfault 467261\ntotal_pgmajfault 47\ntotal_inactive_anon 532504576\ntotal_active_anon 536588288\ntotal_inactive_file 426450944\ntotal_active_file 2454777856\ntotal_unevictable 0\n
Run Code Online (Sandbox Code Playgroud)\n

apa*_*gin 5

Java 进程可能会消耗比-Xmx我在这个答案中解释的指定更多的物理内存。

但是,在您的情况下,它甚至不是 Java 进程的内存,而是操作系统级别的页面缓存。通常,您不需要关心页面缓存,因为它是共享的可回收内存:当应用程序想要分配更多内存,但没有足够的立即可用空闲页面时,操作系统可能会释放部分页面缓存自动地。从这个意义上说,页面缓存不应被视为“已使用”内存 - 它更像是操作系统出于良好目的而使用的备用内存,而应用程序不需要它。

当应用程序执行大量文件 I/O 时,页面缓存通常会增长,这很好。

异步分析器可能有助于找到增长的确切来源:
运行它-e filemap:mm_filemap_add_to_page_cache

我在演讲中演示了这种方法。