kubernetes pod 高速缓存内存使用率高

kubernetes pod high cache memory usage

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

我设置了 Xms 和 Xmx 来处理。

java -Xms512M -Xmx1G -XX:SurvivorRatio=8 -XX:NewRatio=6 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -jar automation.jar

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

当我检查 pods 的内存统计信息时,我认为 pod 分配了过多的缓存内存。

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

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

/app $  cat /sys/fs/cgroup/memory/memory.stat
cache 2881228800
rss 1069154304
rss_huge 446693376
mapped_file 1060864
swap 831488
pgpgin 1821674
pgpgout 966068
pgfault 467261
pgmajfault 47
inactive_anon 532504576
active_anon 536588288
inactive_file 426450944
active_file 2454777856
unevictable 0
hierarchical_memory_limit 16657932288
hierarchical_memsw_limit 9223372036854771712
total_cache 2881228800
total_rss 1069154304
total_rss_huge 446693376
total_mapped_file 1060864
total_swap 831488
total_pgpgin 1821674
total_pgpgout 966068
total_pgfault 467261
total_pgmajfault 47
total_inactive_anon 532504576
total_active_anon 536588288
total_inactive_file 426450944
total_active_file 2454777856
total_unevictable 0

一个 Java 进程可能会消耗比 -Xmx 中指定的更多的物理内存 - 我在 .

中对此进行了解释

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

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

Async-profiler 可能有助于找到确切的增长来源:
运行 它与 -e filemap:mm_filemap_add_to_page_cache

我在 my presentation 中演示了这种方法。