服务器内存不足时自动释放内存的实用脚本指南

2025.5.30 杂七杂八 1394

服务器内存不足时自动释放内存的实用脚本指南

本文详细介绍Linux服务器内存不足时的自动释放解决方案,提供Bash/Python双版本脚本实现,包含原理说明、代码解析、定时任务配置及安全注意事项,帮助运维人员高效管理服务器内存资源。

一、内存不足的常见表现与危害

当服务器内存不足时,通常会出现以下症状:

  • 系统响应速度明显下降
  • OOM Killer进程强制终止关键应用
  • swap空间使用率持续偏高
  • 频繁出现”Out of Memory”系统日志

二、自动释放内存脚本实现原理

本方案通过监控以下指标触发内存释放:

  1. 空闲内存低于设定阈值(默认10%)
  2. 缓存内存占用超过物理内存50%
  3. swap使用率超过30%

三、Bash脚本实现方案

!/bin/bash
 内存释放脚本 v1.2
THRESHOLD=10   内存阈值百分比
LOG_FILE="/var/log/memclean.log"

 获取内存信息
mem_free=$(free | awk '/Mem/{printf("%.0f"), $4/$2100}')
cache_used=$(free | awk '/Mem/{printf("%.0f"), $6/$2100}')
swap_used=$(free | awk '/Swap/{printf("%.0f"), $3/$2100}')

 判断条件
if [[ $mem_free -lt $THRESHOLD ]] || [[ $cache_used -gt 50 ]] || [[ $swap_used -gt 30 ]]; then
    echo "$(date) - 触发内存清理 [空闲:${mem_free}% 缓存:${cache_used}% swap:${swap_used}%]" >> $LOG_FILE
    
     执行清理命令
    sync
    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
    
     记录清理后状态
    post_mem=$(free | awk '/Mem/{printf("%.0f"), $4/$2100}')
    echo "$(date) - 清理完成, 当前空闲内存: ${post_mem}%" >> $LOG_FILE
fi

四、Python增强版实现

!/usr/bin/python3
import os
import time
from datetime import datetime

class MemoryCleaner:
    def __init__(self):
        self.threshold = 10   内存阈值%
        self.log_file = "/var/log/memclean_py.log"
        
    def get_memory_stats(self):
        with open('/proc/meminfo') as f:
            meminfo = dict((i.split()[0].rstrip(':'), int(i.split()[1]))
            for k, v in meminfo.items():
                meminfo[k] = v  1024 if k != 'MemAvailable' else v
        
        total = meminfo['MemTotal']
        free = meminfo['MemFree'] + meminfo['Buffers'] + meminfo['Cached']
        return {
            'free_percent': round((free / total)  100, 1),
            'cache_percent': round((meminfo['Cached'] / total)  100, 1),
            'swap_percent': round((meminfo['SwapTotal'] - meminfo['SwapFree']) / meminfo['SwapTotal']  100, 1)
        }
    
    def clean_memory(self):
        stats = self.get_memory_stats()
        if (stats['free_percent']  50 or 
            stats['swap_percent'] > 30):
            
            log_entry = f"{datetime.now()} - 触发清理 [空闲:{stats['free_percent']}% 缓存:{stats['cache_percent']}% swap:{stats['swap_percent']}%]"
            with open(self.log_file, 'a') as f:
                f.write(log_entry + "n")
            
            os.system('sync')
            with open('/proc/sys/vm/drop_caches', 'w') as f:
                f.write('3n')
            
            new_stats = self.get_memory_stats()
            with open(self.log_file, 'a') as f:
                f.write(f"{datetime.now()} - 清理完成, 新空闲: {new_stats['free_percent']}%n")

if __name__ == "__main__":
    cleaner = MemoryCleaner()
    cleaner.clean_memory()

五、部署与定时执行

推荐通过crontab设置定时任务:

 每30分钟检查一次
/30     /usr/local/bin/memclean.sh

 或者Python版本
/30     /usr/bin/python3 /opt/scripts/memclean.py

六、注意事项与优化建议

  • 权限设置:脚本需要root权限,建议通过sudoers配置特定权限
  • 日志轮转:配置logrotate防止日志文件过大
  • 阈值调整:根据服务器实际负载调整触发阈值
  • 白名单:关键服务进程应加入OOM Killer保护名单

七、进阶监控方案

对于生产环境,建议集成到现有监控系统:

  • Prometheus + Grafana可视化监控
  • Zabbix自定义监控项
  • 配置内存不足时的告警通知

评论