Python 服务内存持续增长:用 tracemalloc 快照差分定位无界缓存
## 适用场景 一个常驻的 Python API、消费者或定时任务进程,刚启动时只占用几百 MB,运行数小时后内存持续上涨。请求结束后内存没有明显回落,重启可以暂时恢复,但过一段时间又出现同样问题。监控最终触发容器 OOMKilled,或节点开始频繁交换内存。 本文针对“对象仍被 Python 引用”的增长场景,演
Tag
包含这个标签的文章。
## 适用场景 一个常驻的 Python API、消费者或定时任务进程,刚启动时只占用几百 MB,运行数小时后内存持续上涨。请求结束后内存没有明显回落,重启可以暂时恢复,但过一段时间又出现同样问题。监控最终触发容器 OOMKilled,或节点开始频繁交换内存。 本文针对“对象仍被 Python 引用”的增长场景,演
## 适用场景 FastAPI、Django ASGI 或自研 `asyncio` 服务会在同一线程交错处理多个请求。团队希望所有日志自动带上 `request_id`,却发现并发压测时标识偶尔串到另一个请求,或请求结束后启动的后台任务仍携带旧用户上下文。 本文用 Python 标准库复现并修复这个问题。重点不是某
## 适用场景 业务使用 RS256 JWT 在网关、API 服务和后台任务之间传递身份。为了满足密钥泄露应急、合规轮换或证书到期要求,需要定期替换签名私钥,但又不能让尚未过期的旧令牌突然失效。 本文给出一套可直接落地的轮换方法:令牌头携带 `kid`,验证端同时信任新旧公钥,签发端再切换当前私钥,最后根据令牌最长
## 适用场景 一个聚合接口同时读取用户资料与订单摘要,只有两项都成功才返回页面。某个依赖提前失败后,其他查询的结果已经没有用途,却仍占用连接和并发名额。本篇用纯标准库示例讨论这种“共同成功、共同结束”的请求边界。 示例需要 Python 3.11 或以上版本,本文在 Python 3.14 环境执行验证。演示使用
## 适用场景 支付、订单、代码托管或消息平台通过 Webhook 主动回调业务系统。接口已经校验 HMAC 签名,但偶尔仍出现同一事件被重复执行,甚至攻击者截获一条合法请求后,可以在数小时后原样重放。 本文以 Python 3.11、FastAPI 和 Redis 为例,实现一套可直接落地的接收端:对原始请求体进
## 适用场景 FastAPI 服务平时响应正常,但只要某个文件处理、旧版 SDK 调用或报表计算接口并发升高,健康检查、登录和其他无关接口也一起变慢。CPU、内存和数据库连接数未必异常,扩容 Uvicorn worker 后只能暂时缓解。 这类问题常见于 `async def` 路由中直接调用同步阻塞函数。本文给
## 适用场景 生产环境执行 `python manage.py migrate` 后长时间没有结束,应用发布流水线被阻塞;或者迁移最终报出 `Lock wait timeout exceeded`、`OperationalError`。这类问题常见于 Django + MySQL/InnoDB:迁移本身很短,却在等
## 适用场景 Python 服务或批处理脚本通过 `httpx` 调用第三方 HTTP API。流量上来后,应用日志开始出现 `httpx.PoolTimeout`,但目标接口的监控显示延迟正常;重启服务后短暂恢复,随后问题又出现。常见于 FastAPI/Django 的异步任务、数据同步程序和并发爬取工具。 本
## 适用场景 使用 Celery + Redis/RabbitMQ 承担异步任务。队列中仍有大量待执行任务,但监控显示少数 Worker 忙碌、其余 Worker 空闲;或者短任务被长任务“压住”,整体延迟持续升高。本文以默认的 `prefork` 并发池和 RabbitMQ 为例,Redis broker 的排查
## 适用场景 这篇文章适用于使用 Python `httpx` 调用内部 HTTP 接口、第三方 API、网关或微服务时,线上偶发出现请求超时、任务堆积、接口吞吐下降的问题。常见场景包括: - 定时任务批量调用接口; - FastAPI、Django、Celery worker 中复用 `httpx.Client