本文最后更新于:2025年6月21日 凌晨
服务器有时内存占用高会侵占 swap空间, swap如果不释放终有一天会耗光内存,本文记录定期清理内存的方法。
简介
清理服务器内存, 有两个需求:
定期清理 swap 空间
定期清理内存缓存
实现原理
清理内存缓存
临时性释放缓存,缓解内存压力
1 echo 3 | sudo tee /proc/sys/vm/drop_caches
清理 swap 空间
需要确认物理内存剩余 > Swap 已用量(否则触发 OOM)
1 2 3 sudo swapoff -a sudo swapon -a free -h
Python 实现
这里需要用到 psutil 库查看系统内存
同时用到了 vvdutils 中的日志
脚本源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import osimport timeimport psutilfrom datetime import datetimeimport subprocessimport argparsefrom loguru import logger import vvdutils as vvdef clear_page_cache (): """清空页面缓存(安全操作)""" try : with open ('/proc/sys/vm/drop_caches' , 'w' ) as f: f.write('1\n' ) logger.info(f"[{datetime.now()} ] 已清理页面缓存" ) except Exception as e: logger.info(f"清理缓存失败: {str (e)} " )def should_clear_swap (): """判断是否满足SWAP清理条件""" mem = psutil.virtual_memory() swap = psutil.swap_memory() condition1 = (mem.percent < 70 ) and (swap.percent > 10 ) condition2 = swap.used > 1024 **3 and mem.free > 1024 **3 * 1.5 return condition1 or condition2def clear_swap (): """安全清空SWAP空间""" try : subprocess.run(['swapoff' , '-a' ], check=True ) subprocess.run(['swapon' , '-a' ], check=True ) logger.info(f"[{datetime.now()} ] 已成功重置SWAP空间" ) except subprocess.CalledProcessError as e: logger.info(f"SWAP操作失败: {str (e)} " )def main (interval=3600 ): while True : clear_page_cache() if should_clear_swap(): clear_swap() else : logger.info(f"[{datetime.now()} ] 不满足SWAP清理条件" ) time.sleep(interval)if __name__ == '__main__' : parser = argparse.ArgumentParser() parser.add_argument('--interval' , type =int , default=3600 , help ='检测间隔(秒)' ) args = parser.parse_args() vv.UruLogConfig.config("mem_clean" , [], "mem_clean.log" , log_root="/home/vvd/" ) logger.info(f"""启动内存管理服务: 检测间隔: {args.interval} 秒 """ ) main(args.interval) pass
这个脚本需要 root 权限,建议使用 systemctl 控制
创建服务单元文件 /etc/systemd/system/memclean.service
:
1 2 3 4 5 6 7 8 9 10 11 [Unit] Description=Memory Cleaner Service [Service] User=root ExecStart=/usr/bin/python3 /path/to/script.py Restart=always [Install] WantedBy=multi-user.target
使得服务自动启动
1 2 3 sudo system ctl daemon-reload sudo system ctl start memclean.service sudo system ctl enable --now memclean.service
文章链接:
https://www.zywvvd.com/notes/system/linux/ubuntu-mem-clean/ubuntu-mem-clean/