使用hostPath卷时DaemonSet Pod内存占用异常升高问题排查
背景
我有若干消费者应用,仅读取(不写入)大小约4GiB的数据库并执行相关任务。为避免数据库在各应用间重复存储,我将其部署在Kubernetes集群的所有节点上。
DaemonSet配置与运行情况
我使用DaemonSet,通过hostPath卷在每个节点的/var/lib/DATABASE路径下提取数据库。为实现健康检查,编写了Shell脚本,用date命令检查数据库文件的修改时间。
数据库提取阶段约需300MiB内存,健康检查仅需50MiB,因此设置memory-request为100MiB,memory-limit为1.5GiB。DaemonSet运行后,前10秒内存占用约300MiB(提取阶段),之后降至约30MiB,符合预期。
消费者应用引发的异常
使用Golang编写的消费者应用Pod同样挂载该hostPath卷(/var/lib/DATABASE),仅读取数据库不写入。但部署后,DaemonSet Pod的内存占用从30MiB飙升至1.5GiB,接近memory-limit值。
我无法理解该现象,希望得到帮助、建议或排查步骤。
注:使用kubernetes top命令测量内存(working-set-bytes)。
相关线索
我发现hostPath存在内存占用归属不明确的问题:
hostPath本身存在安全风险,使用时应仅限定所需文件或目录,并以ReadOnly方式挂载。此外,存在内存占用归属不明确的问题,每个Pod都需配置足够资源,具体取决于实现方式;内存占用也可能“泄漏”至根命名空间,不计入任何Pod,仅表现为“开销”。
但未在Kubernetes官方文档中找到相关参考,希望能对此详细说明。
DaemonSet Pod的memory.stat内容
cat /sys/fs/cgroup/memory/memory.stat* cache 1562779648 rss 1916928 rss_huge 0 shmem 0 mapped_file 0 dirty 0 writeback 0 swap 0 pgpgin 96346371 pgpgout 95965640 pgfault 224070825 pgmajfault 0 inactive_anon 0 active_anon 581632 inactive_file 37675008 active_file 1522688000 unevictable 0 hierarchical_memory_limit 1610612736 hierarchical_memsw_limit 1610612736 total_cache 1562779648 total_rss 1916928 total_rss_huge 0 total_shmem 0 total_mapped_file 0 total_dirty 0 total_writeback 0 total_swap 0 total_pgpgin 96346371 total_pgpgout 95965640 total_pgfault 224070825 total_pgmajfault 0 total_inactive_anon 0 total_active_anon 581632 total_inactive_file 37675008 total_active_file 1522688000 total_unevictable 0
内容的提问来源于stack exchange,提问作者Ashish Shinde

