本文详细介绍Linux服务器内存不足时的自动释放解决方案,提供Bash/Python双版本脚本实现,包含原理说明、代码解析、定时任务配置及安全注意事项,帮助运维人员高效管理服务器内存资源。
一、内存不足的常见表现与危害
当服务器内存不足时,通常会出现以下症状:
- 系统响应速度明显下降
- OOM Killer进程强制终止关键应用
- swap空间使用率持续偏高
- 频繁出现”Out of Memory”系统日志
二、自动释放内存脚本实现原理
本方案通过监控以下指标触发内存释放:
- 空闲内存低于设定阈值(默认10%)
- 缓存内存占用超过物理内存50%
- 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自定义监控项
- 配置内存不足时的告警通知
评论