正确获取真实内存使用率应使用psutil.virtual_memory().percent,因其已按内核逻辑计算used=total-available,避免直接解析/proc/meminfo导致误报。

用 psutil 获取真实内存使用率,别信 /proc/meminfo 里 raw 数值
Linux 的 /proc/meminfo 里 MemUsed 并不等于你直觉中的“已用内存”——它没扣掉 Cached 和 Buffers,而这些内存随时可被内核回收。直接读它会误报。正确做法是用 psutil.virtual_memory(),它内部已按内核逻辑计算出 used(即 total - available),和 free -h 输出一致。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装:
pip install psutil - 关键字段取
memory.percent,不是memory.used / memory.total * 100—— 后者可能超 100%,因used包含部分可回收页 - 注意:
psutil在容器中默认看到的是宿主机内存,若需限制为容器 cgroup 视角,得手动读/sys/fs/cgroup/memory/memory.usage_in_bytes等路径
用 smtplib 发邮件报警时,必须设 Content-Type: text/plain; charset=utf-8
不显式设置编码和 MIME 类型,中文报警内容大概率变成乱码或被拒收。Gmail、Outlook 等现代邮箱服务对非标准 MIME 头越来越严格。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 别用
smtplib.SMTP.sendmail()直传字符串;改用email.mime.text.MIMEText构造消息体 - 初始化时明确指定
charset='utf-8':MIMEText(alert_msg, 'plain', 'utf-8') - SMTP 登录必须用应用专用密码(如 Gmail 开启两步验证后生成的 App Password),普通账号密码会被拒绝
- 测试阶段先发给自己,检查邮件标题、正文、时间戳是否完整无截断
避免脚本常驻导致内存泄漏:用 time.sleep() 而非 while True: 空转
写个无限循环监控脚本,如果只写 while True: check_memory(); time.sleep(60),看似没问题,但一旦 check_memory() 内部有对象未释放(比如反复创建 psutil.Process() 但没调 .oneshot() 或没 del),几小时后 RSS 就涨几百 MB。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 每次采集完立刻清理局部变量:
del memory、gc.collect()非必需,但psutil对象建议显式del - 用
time.sleep(60),别用time.sleep(59.9)或其他非整数——浮点误差累积会导致每小时偏移数秒,长期运行后报警时间漂移 - 加一句
if __name__ == '__main__':保护入口,防止被 import 时意外触发循环
报警阈值不能写死在代码里:用环境变量或 JSON 配置文件接管 ALERT_THRESHOLD
把 if memory.percent > 90: 这种硬编码留在源码里,下次要调成 85% 就得改代码、测、上线——运维根本不碰 Python 文件。阈值必须可外部控制。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先读环境变量:
os.getenv('MEM_ALERT_THRESHOLD', '85'),上线时用MEM_ALERT_THRESHOLD=80 python monitor.py - 次选 JSON 配置:
config.json放{"mem_threshold_pct": 75},代码里json.load(open('config.json'))['mem_threshold_pct'] - 切忌用 INI 或 YAML——多一个依赖就多一个部署失败点;纯 JSON +
json模块零依赖 - 读取失败时给默认值并 print 警告,别静默 fallback,否则配置挂了你还不知道
真正难的不是取内存值或发邮件,而是让这个脚本在无人看管下跑三个月不出错:进程不僵死、报警不漏发、阈值能热更新、日志能定位到哪次采集异常。这些细节堆起来,才是生产级监控脚本的门槛。

















