Docker内存芭蕾:优雅调整容器内存的极限艺术


title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术”
author: “Cjs”
date: “2025-2-23”
emoji: “🩰💥📊”

当你的容器变成内存吸血鬼时…


🚀 完美内存编排示范

📜 智能内存管家脚本

#!/bin/bash
# memory_balancer_v3.sh

# 定义容器列表和对应的内存分配比例(总可用内存的百分比)
containers=("container-1" "container-2" "container-3" "container-4" "container-5")
percentages=(10 20 30 20 20)

# 获取系统总内存
TOTAL_MEM=$(free -b | awk '/Mem:/{print $2}')

# 设置安全缓冲为总内存的20%
SAFETY_BUFFER=$((TOTAL_MEM * 20 / 100))

# 计算可用内存(总内存 - 安全缓冲)
AVAILABLE_MEM=$((TOTAL_MEM - SAFETY_BUFFER))

# 日志文件路径
LOG_FILE="memory_balancer.log"

# 格式转换函数:字节转GB
bytes_to_gb() {
    echo "scale=2; $1 / 1024 / 1024 / 1024" | bc
}

# 格式转换函数:字节转MB
bytes_to_mb() {
    echo "scale=0; $1 / 1024 / 1024" | bc
}

for i in "${!containers[@]}"; do
    container=${containers[$i]}
    percentage=${percentages[$i]}
    
    # 计算内存限制
    mem_limit=$(( AVAILABLE_MEM * percentage / 100 ))
    swap_limit=$(( mem_limit * 150 / 100 ))
    
    # 获取旧内存设置
    old_mem=$(docker inspect $container --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")
    old_swap=$(docker inspect $container --format '{{.HostConfig.MemorySwap}}' 2>/dev/null || echo "0")
    
    # 转换单位用于显示
    total_mem_gb=$(bytes_to_gb $TOTAL_MEM)
    old_mem_mb=$(bytes_to_mb $old_mem)
    new_mem_mb=$(bytes_to_mb $mem_limit)
    new_swap_mb=$(bytes_to_mb $swap_limit)
    
    # 执行内存更新
    if docker update --memory="$mem_limit" --memory-swap="$swap_limit" $container >/dev/null 2>&1; then
        status="Success"
        # 记录到日志文件
        echo "$(date +'%Y-%m-%d %H:%M:%S') | Status: $status | Container: $container | TotalMem: ${total_mem_gb}GB | OldMem: ${old_mem_mb}MB | NewMem: ${new_mem_mb}MB | NewSwap: ${new_swap_mb}MB" | tee -a $LOG_FILE
    else
        status="Failed"
        # 错误信息也记录到日志
        echo "$(date +'%Y-%m-%d %H:%M:%S') | Status: $status | Container: $container | Error: Memory update failed" | tee -a $LOG_FILE
    fi
done

🛠️ 部署自动化

  1. 创建脚本
sudo vim /usr/local/bin/memory_balancer.sh  
# 粘贴上述脚本内容后保存 记得修改你的容器名字 以及如何分配内容哦
  1. 赋予执行权限
sudo chmod +x /usr/local/bin/memory_balancer.sh
  1. 配置定时任务
sudo crontab -e  # 使用root权限编辑cron

添加以下内容:

# 每分钟检测一次,Docker运行时生效
* * * * * if [ $(systemctl is-active docker) = "active" ]; then /usr/local/bin/memory_balancer.sh >> /var/log/memory_balancer.log 2>&1; fi
  1. 查看执行日志
tail -f /var/log/memory_balancer.log  # 实时监控调整记录


🔍 脚本功能详解

代码片段功能说明可视化比喻
free -b精确获取物理内存字节数🕵️♂️ 内存侦探
SAFETY_BUFFER计算保留20%内存应对突发流量🚧 安全气囊
docker update命令动态调整运行中容器的内存限制🎚️ 内存调音师
cron定时任务每分钟自动优化内存分配⏰ 内存生物钟

💡 高阶技巧:智能扩展

# 添加邮件报警功能(需安装mailutils)
MEM_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" app | cut -d'/' -f1)
if [[ $MEM_USAGE > 85% ]]; then
    echo "警告!app容器内存使用率超过85%" | mail -s "内存警报" admin@example.com
fi

# 根据时间动态调整(上班时间分配更多资源)
if [[ $(date +%H) -ge 9 && $(date +%H) -lt 18 ]]; then
    # 日间模式:增加20%内存
else
    # 夜间模式:减少30%内存
fi


🚨 注意事项

  1. 容器名称适配
    替换脚本中的appdb为你的实际容器名

  2. 安全缓冲区调整
    敏感应用可增加安全比例(修改20为更高数值)

  3. 路径问题
    确保cron环境中能识别docker命令(建议使用绝对路径/usr/bin/docker

  4. 权限管理
    如果使用非root用户,需将用户加入docker组:

sudo usermod -aG docker $USER

(保持原文后续内容不变,仅替换最后预告部分)

🐾 下期预告
《等我bug》🕵️♂️
(关注不迷路,我们一起成为容器内存侦探!🔍)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

IoT设备硬件攻击技术与接口漏洞利用

IoT设备硬件攻击技术 0x01 总线与接口概述 1.1 UART 概述 UART(Universal Asynchronous Receiver/Transmitter)是一种常见的串行通信协议,广泛用于嵌入式设备中进行调试和数据传输。它通过两根信号线(TX和RX)实现异…

Windows程序设计29:对话框之间的数据传递

文章目录 前言一、父子对话框之间的数据传递1.父窗口获取子窗口数据2.子窗口获取父窗口数据 二、类外函数调用窗口的操作1.全局变量方式2.参数传递方式 总结 前言 Windows程序设计29:对话框之间的数据传递。 在Windows程序设计28:MFC模态与非模态对话框…

敏捷开发07:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍

ScrumBoard(Scrum板)介绍 ScrumBoard(Scrum板)是敏捷项目管理中使用的可视化工具,用于跟踪和监控冲刺阶段的任务进度。 主要通过可视化的看板来管理工作,它可视化了敏捷开发中的工作流程、任务状态、团队角色。 Scrum 团队在各…

【每日八股】Redis篇(一):概述

Redis 为什么快? 一句话概括: Redis 之所以快,主要是因为它是基于内存操作的,避免了磁盘 I/O 的开销;采用单线程模型,避免了上下文切换和锁竞争;使用了高效的数据结构和紧凑的编码方式&#xf…

蓝桥杯——按键

一:按键得原理图 二:按键的代码配置 step1 按键原理图对应引脚配置为输入状态 step2 在GPIO中将对应引脚设置为上拉模式 step3 在fun.c中写按键扫描函数 写完后的扫描函数需放在主函数中不断扫描 扫描函数主要通过两个定义变量的值来判断&#xf…

语音控制热水器WTK69000离线语音识别芯片方案:迈向智能家居新时代

一、开发背景 在传统热水器使用中,人们往往需要手动调节水温、选择模式,这不仅操作繁琐,而且容易因误操作导致不必要的能源浪费。为了改善这一现状,热水器厂商开始引入语音识别技术。通过语音识别芯片,热水器能够准确识…

演示基于FPGA的视频图像去雾处理效果

我近期用FPGA开发板做了一个视频图像去雾算法模块,用于验证其能否在不进行帧缓冲的情况下实现去雾功能。 去雾算法来自一篇技术资料(私信提供篇名),其基础是近似的大气光模型。 1 算法原理概要 借助RGB直角坐标空间中的光矢量分…

UE_C++ —— Gameplay Tags

目录 一,Defining Gameplay Tags Adding Tags in Project Settings Importing Tags from Data Table Assets Defining Tags with C 二,Using Defined Gameplay Tags Applying Tags to Objects Evaluating Tags with Conditional Functions 三&am…

计算机视觉算法实战——三维重建(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 三维重建领域简介 三维重建(3D Reconstruction)是计算机视觉的核心任务之一,旨在通过多视角图像、视频…

Spring5框架八:整合Mybatis

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 1、导入相关的jar包 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮&#xff0c;这包括符号主义、机器学习与神经网络&#xff0c;以及深度学习。在这些发展中&#xff0c;深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能&#xff0c;…

redis-bitmap使用场景

bitmap原理 Bitmap&#xff08;位图&#xff09;是一种基于二进制位的数据结构&#xff0c;用于高效地存储和操作大量的布尔值 可以对单个位进行读写操作 demo package org.example;import org.redisson.Redisson; import org.redisson.api.RBitSet; import org.redisson.ap…

华为 网络安全 认证

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 华为 网络安全 认证&#xff1a;保障信息安全的重要一环 在数字化时代的今天&#xff0c;网络安全成为了企业和个人都需要高度重视的问题。尤其是在企业信息化的…

ubuntu22.04连接github无法访问的问题

目录 说明安装 说明 此方案只针对虚拟机, 如果是云服务器(毕竟是官方维护, github还是能访问到的)多试几次肯定能够访问到的. 国内我们无法访问外网, 所以我们目前能够访问外网的途径基本上只能开佳速器. 所以我们需要选择一款加速器来帮助我们访问外网, 目前市面上很多佳速器…

【Research Proposal】基于提示词方法的智能体工具调用研究——难点

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;一、难点分析1. 提示词方法的多样性和组合问题2. 智能体工具调用的准确性和效率问题3. 多模态任务中的复杂性问题 &#x1f4af;二、解决思路与策略&#x1f…

Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg

参考文章&#xff1a; https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…

智慧教室与无纸化同屏技术方案探讨与实现探究

引言 随着教育信息化的不断发展&#xff0c;智慧教室和无纸化同屏技术逐渐成为提升教学效率和质量的重要手段。大牛直播SDK凭借其强大的音视频处理能力和丰富的功能特性&#xff0c;在智慧教室和无纸化同屏领域积累了众多成功案例。本文将深入探讨基于大牛直播SDK的智慧教室、…

自制操作系统前置知识汇编学习

今天要做什么&#xff1f; 为了更好的理解书中内容&#xff0c;需要学习下进制分析和汇编。 汇编语言其实应该叫叫机器指令符号化语言&#xff0c;目前的汇编语言是学习操作系统的基础。 一&#xff1a;触发器 电路触发器的锁存命令默认是断开的&#xff0c;是控制电路触发器…

嘉立创EDA一自画元件及其封装

目录 一、创建元件 &#xff08;1&#xff09;新建元件。 &#xff08;2&#xff09;绘制元件。 二、绘制封装 &#xff08;1&#xff09;新建封装。 &#xff08;2&#xff09;绘制封装。 三、关联元件与封装 四、封装设计注意事项 在嘉立创&#xff08;JLCPCB&#xff…