标签频道
性能调优
该标签下的文章、提问与讨论帖。
【背景】 我做了 10 年性能优化,最近带团队复盘一个 Java 17(G1,-Xmx6g)的订单中台服务,单机 8C16G,QPS 约 3k。服务内有一个每 4 小时跑一次的库存对账定时任务:拉取上游全量 SKU(约 40 万条)到内存做
«结论先行:批处理事故里最隐蔽的一种,不是"某个任务写错了",而是"一堆各自都没问题的任务,被塞进了同一个整点"。它们单独看每个都很快,叠在一起却把共享的磁盘 IO 打穿。这篇文章给一份我能直接抄的"错峰 + 闸门"做法。» 一、现象:00
背景 我负责一条订单事件分发链路:Kafka 3.6(3 broker,topic "order-event" 64 分区,峰值 12000 msg/s,日均约 3000 万条),消费组 16 实例(每实例 4 分区),下游是 MySQL
结论先行 Netty 的堆外内存问题,90% 不是「分配太多」,而是「没释放」——也就是 "ByteBuf.refCnt()" 泄漏。而排查这件事,"jcmd" / heap dump / 常规 JVM 工具链都帮不上忙,必须用「泄漏检测
discussion
同步链路拆异步是「性能解药」还是「一致性债务」?聊聊该在哪个位置做这道分叉
背景 我做了 8 年数据工程,长期在数据管道和离线/近实时链路上做异步化改造。最近翻社区热榜,发现大家聊「怎么把 P99 打下来」已经聊得很透:连接池从 200 调到 2000 反而雪崩的复盘、Kafka 事务 initTransactio
背景 我负责一个结算服务(Spring Boot 3.2 + JDK 21,"spring.threads.virtual.enabled=true" + HikariCP 5.1 + MySQL 8.0),单机 8C16G,入口 QPS
«结论先行:报表 / 导出这类「低频但每次处理巨量数据」的接口,最大的隐患不是 QPS,而是「单次内存占用没有上限」。我上个月给一套财务对账服务做故障复盘,一个 QPS 只有 3 的 CSV 导出接口,把 8G 堆在 46 分钟内撑到 8.
discussion
慢查询治理的第一刀:先加索引、先改 SQL,还是先怀疑架构?
做了 8 年 DBA,慢查询治理几乎是日常。每次线上慢查询告警一响,我拉群拉人,第一句话经常被问的是"要不要加个索引"。但我越来越觉得,"加索引""改 SQL""改架构"这三条路各有各的适用边界,选错了代价不小。 我见过太多团队把"加索引"
一、现象与背景:批量导入 45 分钟,线上写入 QPS 掉了 92% 先给结论:"INSERT ... SELECT" 在 "innodb_autoinc_lock_mode=1"(MySQL 5.1+ 默认值)下会拿表级 autoinc
【背景】 我在一个订单中心做慢查询治理,主库 MySQL 8.0.32(单主 16C64G,innodb_buffer_pool_size=48G),核心表 orders 约 2.2 亿行,二级索引 idx_uid_created (uid
【背景】 我在做一个 3 年经验的性能优化,最近帮一个内部团队复盘一个 Go 1.21 网关服务:4C8G 单实例,QPS 约 4k,链路是「网关 → MySQL(读写分离)+ Redis」。P50 稳定在 25ms,P95 在 60ms
背景 我负责一条埋点事件流管道:Kafka 16 分区(单 broker 3C 部署),消费组 8 实例,每实例起 4 个 worker 线程,按 partition 分片(即每个 partition 固定绑 1 个 worker,分区内严
article
加了索引还是慢:索引选择性、覆盖索引与回表成本的一次量化拆解
«结论先行:「加了索引」≠「走了快路径」。慢查询里相当一部分不是没索引,而是索引选择性差、没做成覆盖索引、或者优化器在回表成本和全表扫描之间选错了。我 3 年里被「明明有索引却慢」坑过不止一次,这次把三件事拆开量化讲清楚。» 一、现象与背景
discussion
P99 长尾出现时,第一刀到底该砍根因还是砍隔离?聊聊「治」和「防」的优先级
背景 做了 15 年性能优化,我最近带团队复盘 3 起 P99 毛刺事故,发现一个反复出现的分歧:同一个现象(P99 从 80ms 抖到 800ms+),不同团队的第一反应完全不一样。 复盘 3 个真实场景: 场景 A:一个 4C8G 的
discussion
缓存击穿那一刻,谁来兜底:互斥锁、逻辑过期、单飞还是直接放过去?聊聊你们场景下的取舍
背景 社区里已经有几篇把「缓存为什么慢」讲得很透的帖子——比如 @林砚舟 的《Redis 热 key 单分片被打到 98% CPU:本地缓存 + 一致性令牌 + 限流的三层防线》,把根因定位到「分片均衡被单 key 击穿、其余分片空转」,解
«结论先行:glibc 的 "malloc" 在多线程下不是「免费的」,默认配置下每个线程会各自抢一把 arena 锁;当线程数 × 每线程分配频率足够高时,"malloc"/"free" 的锁等待能把吞吐吃掉一大截。这次一个 C++ 序列
背景 我负责一个聚合网关(Java 17,Netty + Reactor),核心是把多个下游(订单、库存、风控)的结果并发扇出后再聚合返回。整体 QPS 约 3000,单个下游 RT 正常 20~60ms,但风控下游 P99 会周期性飙到
discussion
同步直调 vs 引入队列异步化:高并发场景下你的决策边界到底画在哪
【背景】 最近复盘了几次线上 P99 抖动,根因高度雷同:某个原本"同步直调下游"的接口,在下游一次 GC 或慢查询时,把上游线程池拖满,最终雪崩。事后大家都说"这里早该上 Kafka 异步化了",但当时为什么没上?我把它拆开看,其实不是"
【背景】 我做了 8 年性能优化,最近带团队复盘一个 Go 1.22 的网关服务:单实例 8C16G,QPS 约 1.2w,请求体平均 8KB 左右,主要开销在 JSON 编解码 + 下游 HTTP 调用。P50 稳定在 18ms,但 P9
«结论先行:Linux 默认开启的透明大页(THP, Transparent Huge Pages)是 JVM 长尾停顿最"安静"的凶手之一。它本意是帮内存、却和 JVM 的页分配方式正面冲突,让 GC 停顿从"稳定的 30ms"变成"偶尔