Docker基础——50台容器异常占用宿主机90%内存问题

一、问题描述

一台裸金属服务存有50台业务容器,通过Docker进程起服务,由system-runtime守护容器的生命周期。

free -h查看裸金属服务器内存没有正常释放,cat /proc/meminfo查看内存分配无异常,怀疑裸金属服务器

的Java进程存在Glibc内存泄漏,或Docker容器没有正常关闭进程释放内存有关;

二、问题排查

1、关闭容器

# 批量关闭裸金属服务器上的所有容器
docker stop $(docker ps -a -q)
# 查看容器的进程是否完全释放
ps -ef | grep docker

2、查看裸金属服务器内存使用详情

# 在裸金属服务器查看内存详情
free -h

3、检查docker容器存放位置

# Docker安装目录参数"data-root"
cat /etc/docker/daemon.json
{
"insecure-registries":["0.0.0.0/0"],
"data-root":"/apps/data/docker"
}

4、检查内存与docker容器无关

# 检查使用内存
free -h
# 检查大页内存
grep -i huge /proc/meminfo

5、 检查内核相关配置/etc/sysctl.conf

# 调整参数为0,降低大页内存预分配,无需重启
cat /etc/sysctl.conf | grep vm.nr_hugepages

 

grep -i huge /proc/meminfo

# 发现内核配置vm.nr_hugepages = 162882
 162882*2M=318GB左右预大页分配
# 匹配free -h 中used中328G相吻合

6、测试vm.nr_hugepages = 0

# 查看vm.nr_hugepages配置,预分配162882个内存页,实际占用free中used部分内存;
cat /etc/sysctl.conf| grep vm.nr_hugepages
# 将内核参数vm.nr_hugepages设置为0,观察free中used部分的变化
sed -i 's/vm.nr_hugepages = 162882/vm.nr_hugepages = 0/g' /etc/sysctl.conf
# 启用/etc/sysctl.conf配置
sysctl -p
# 查看free
free -h
# 结果
预占内存已经正常释放;

 三、参考

# 参考
https://blog.csdn.net/qq_43971504/article/details/107026782
https://blog.csdn.net/lihui49/article/details/125654410
https://www.kernel.org/doc/html/latest/admin-guide/mm/transhuge.html
https://www.cnblogs.com/bandaoyu/p/16752320.html
# 关闭大页内存
https://www.cnblogs.com/ywcz060/p/5543228.html

 

posted on 2024-04-25 16:14  gkhost  阅读(27)  评论(0编辑  收藏  举报

导航