docker-内存不足导致容器异常退出时怎么办

容器异常退出,通过docker ps -a查看当前容器状态

状态码   描述

0         表示正常退出

非 0       表示异常退出(退出状态码采用 chroot 标准)

125      Docker 守护进程本身的错误

126      容器启动后,要执行的默认命令无法调用

127      容器启动后,要执行的默认命令不存在

137      表明容器收到了 SIGKILL 信号,进程被杀掉,对应kill -9

139      表明容器收到了 SIGSEGV 信号,无效的内存引用,对应kill -11

143      表明容器收到了 SIGTERM 信号,终端关闭,对应kill -15

通过docker inspect container查看容器状态

若"OOMKilled"为true,"ExitCode"为137,代表内存不足导致容器退出,如下图:

由于linux对大部分申请内存的请求都是yes,以便于运行更多的程序,因此可能造成申请内存超出可用内存的情况(OOM),发生OOM后,linux会根据响应的判断标准杀掉进程

内存超出后常见的有以下几种办法可以解决这种情况

1、内存扩容   简单粗暴,直接有效,需要成本

2、容器运行时指定内存

-m,--memory 内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M

--memory-swap 内存+交换分区大小总限制。格式同上。必须必-m设置的大

--memory-reservation 内存的软性限制。格式同上

--oom-kill-disable 是否阻止 OOM killer 杀死容器,默认没设置

--oom-score-adj 容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0

--memory-swappiness 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数

--kernel-memory 核心内存限制。格式同上,最小为 4M

3、使用top命令查看进程内存使用率,杀掉占用率较高的内存

本次介绍另一种方式,清除缓存从而释放内存,比较通用,即使内存没有超出,也可以定期检查内存使用情况,从而尽量避免内存超出的情况

执行free -m 查看当前系统内存占用情况,如果持续执行,可以看到缓存一直在上升,那么迟早会出现内存不够用的情况

清除缓存的命令:

To free pagecache:仅清除页面缓存(PageCache)

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:清除目录项和inode

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:清除页面缓存,目录项和inode

echo 3 > /proc/sys/vm/drop_caches

为了方便,可以将清除命令封装为脚本,定时执行

脚本如下:

功能:监测系统剩余内存占总内存的百分比,当内存使用率超过80%时,则执行清除缓存的命令

free_memory.sh

#!/bin/bash

#系统分配的区总量

mem_total=`free -m | awk 'NR==2' | awk '{print $2}'`

echo $mem_total

#当前剩余的大小

mem_free=`free -m | awk 'NR==2' | awk '{print $4}'`

echo $mem_free

#当前已使用的used大小

mem_used=`free -m | grep Mem | awk '{print $3}'`

if (($mem_used != 0)); then

#如果已被使用,则计算当前剩余free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0

mem_per=0`echo "scale=2;$mem_free/$mem_total" | bc`

echo $mem_per

DATA="$(date -d "today" +"%Y-%m-%d-%H-%M") free percent is : $mem_per"

echo $DATA >> /root/wanghaonan/Script/log/mem_detect.log

#设置的告警值为20%(即使用超过80%的时候告警)。

mem_warn=0.20

#当前剩余百分比与告警值进行比较(当大于告警值(即剩余20%以上)时会返回1,小于(即剩余不足20%)时会返回0 )

mem_now=`expr $mem_per \> $mem_warn`

#如果当前使用超过80%(即剩余小于20%,上面的返回值等于0),释放内存

if (($mem_now == 0)); then

sync

echo 1 > /proc/sys/vm/drop_caches

echo 2 > /proc/sys/vm/drop_caches

echo 3 > /proc/sys/vm/drop_caches

#将release memory OK !写入temp文件夹的memstat_日期.log日志中

echo "--->release memory OK ! " >>/root/wanghaonan/Script/log/memstat_$(date +%Y%m%d_%H%M%S).log

fi

fi

创建crontab定时任务执行脚本:

执行crontab -e,编辑定时任务即可,此处设置的是每两个小时检测一遍

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值