Tag

#性能优化

包含这个标签的文章。

Python 76 阅读

Python 服务内存持续增长:用 tracemalloc 快照差分定位无界缓存

## 适用场景 一个常驻的 Python API、消费者或定时任务进程,刚启动时只占用几百 MB,运行数小时后内存持续上涨。请求结束后内存没有明显回落,重启可以暂时恢复,但过一段时间又出现同样问题。监控最终触发容器 OOMKilled,或节点开始频繁交换内存。 本文针对“对象仍被 Python 引用”的增长场景,演

阅读全文
数据库 103 阅读

MySQL 查询突然变慢:从统计信息失真到执行计划稳定的排查实践

## 适用场景 本文适用于 MySQL 8.0 使用 InnoDB 的生产环境。典型场景是 SQL 和索引近期都没有修改,但一次批量导入、归档删除或数据分布变化后,原本几十毫秒的查询突然变成数秒;`EXPLAIN` 显示优化器改走了低选择性索引、错误的连接顺序,甚至全表扫描。 这类问题容易被误判为“数据库负载太高”

阅读全文
数据库 194 阅读

PostgreSQL 表越删越大且查询变慢:从死元组取证到 autovacuum 治理

## 适用场景 本文适用于更新、删除频繁的订单、任务、消息、审计记录等 PostgreSQL 表。典型现象是:业务已经清理大量历史数据,但表文件没有缩小;索引扫描和备份越来越慢;监控中的磁盘使用持续上涨;执行 `VACUUM` 后空间仍未归还操作系统。 本文重点解决三个问题:如何确认膨胀来自死元组,为什么 auto

阅读全文
数据库 247 阅读

MySQL 深分页越来越慢:从 OFFSET 扫描到游标分页的改造实践

## 适用场景 本文适用于按时间倒序展示订单、流水、审计日志或消息列表的接口。典型特征是:第一页很快,翻到几千页后响应时间明显上升;数据库 CPU 和磁盘读取随页码增长;接口仍使用 `LIMIT offset, size`。 示例使用 MySQL 8.0,表结构如下: ```sql CREATE TABLE or

阅读全文
数据库 288 阅读

PostgreSQL 连接池耗尽:从 idle in transaction 到事务边界治理

## 适用场景 应用运行一段时间后,新请求开始等待数据库连接,接口 P99 持续升高,最终出现连接池获取超时或 PostgreSQL `too many connections`。数据库 CPU、磁盘 I/O 和慢 SQL 指标却不高,重启应用后又能短暂恢复。 这类现象经常不是“连接池太小”,而是业务代码开启事务后

阅读全文
Python 332 阅读

FastAPI 接口并发升高后全站变慢:阻塞调用卡住事件循环的定位与治理

## 适用场景 FastAPI 服务平时响应正常,但只要某个文件处理、旧版 SDK 调用或报表计算接口并发升高,健康检查、登录和其他无关接口也一起变慢。CPU、内存和数据库连接数未必异常,扩容 Uvicorn worker 后只能暂时缓解。 这类问题常见于 `async def` 路由中直接调用同步阻塞函数。本文给

阅读全文
系统运维 311 阅读

MySQL 主从复制延迟持续扩大:从现场取证到并行复制治理的排查实践

## 适用场景 本文适用于 MySQL 8.0 或已启用 GTID 的 MySQL 5.7 主从/主备架构:监控显示 `Seconds_Behind_Source` 持续增长,报表、读库或故障切换的恢复点开始不可接受。目标是先确认延迟真实原因,再在不破坏复制一致性的前提下恢复追平。 ## 现象描述 一次订单促销后

阅读全文
系统运维 397 阅读

Redis 延迟偶发飙升:从 Hot Key 与 Big Key 定位到分阶段治理实践

## 适用场景 业务使用 Redis 承载登录态、商品详情、计数器或排行榜。平时接口稳定,但在促销、定时任务或某些请求集中到来时,应用开始出现 Redis 超时;监控中 `instantaneous_ops_per_sec` 并不一定很高,CPU 也可能没有持续满载。 本文以单实例或主从架构为例,说明如何区分 **

阅读全文
Python 389 阅读

Python httpx 并发请求频繁 PoolTimeout:连接未释放与连接池参数的排查实践

## 适用场景 Python 服务或批处理脚本通过 `httpx` 调用第三方 HTTP API。流量上来后,应用日志开始出现 `httpx.PoolTimeout`,但目标接口的监控显示延迟正常;重启服务后短暂恢复,随后问题又出现。常见于 FastAPI/Django 的异步任务、数据同步程序和并发爬取工具。 本

阅读全文
系统运维 437 阅读

MySQL 死锁频发:从现场取证到有边界重试的排查与治理实践

## 适用场景 业务接口偶发返回 `Deadlock found when trying to get lock`(错误码 1213),订单、库存、账户余额或状态流转等事务写入失败;重试后通常成功,但高峰期错误数明显上升。本文以 InnoDB 为例,给出一套可在生产环境执行的取证、定位和治理流程。 死锁不是数据库“

阅读全文