《Netty 高性能网络编程》14.3 调优案例与回归
一个可复现的 linkd-v2 调优案例:100 条 9093 连接、8 KiB 负载,worker=1 时单条 EventLoop 接近满核,p50 12 ms、p99 33 ms。用 jcmd 线程栈、JFR ExecutionSample 与 GC 停顿排除法定位,只把 worker 从 1 改成 4,给出前后对比表与回归清单,所有数字标注单次运行、未做统计。
tag
一个可复现的 linkd-v2 调优案例:100 条 9093 连接、8 KiB 负载,worker=1 时单条 EventLoop 接近满核,p50 12 ms、p99 33 ms。用 jcmd 线程栈、JFR ExecutionSample 与 GC 停顿排除法定位,只把 worker 从 1 改成 4,给出前后对比表与回归清单,所有数字标注单次运行、未做统计。
调优前先固定一组能复现的起点:boss=1、worker 显式 4、backlog 1024、TCP_NODELAY、32/128 KiB 水位、PooledByteBufAllocator 与 AUTO_READ=true。本节用 BaselineProbe 打印 linkd-v2 的真实配置,说明每个值的作用、验证方式和该改的信号,强调基线不是最优值。
《Java 虚拟机原理与性能调优》全 31 篇的目录与学习路径:10 章 30 节,从研究方法、类文件与对象布局,到 JIT、GC、内存诊断、线程与锁、启动加速和综合压测调优,给出三条按症状跳读的路线、统一实验口径、项目状态、机器口径与各卷衔接。
把启动、吞吐、p50/p95/p99、GC 次数与停顿、堆占用写成一份基线 JSON,用 scripts/jvm/baseline.py 采集并对比。本节真跑两次基线得到 PASS,再用 -Xint 制造回归得到 FAIL,并用 Little 定律和 p99 曲线给出 libraryd 的容量表与扩容触发条件。
报告端点 p99 40 到 57ms,团队第一反应是加 -Xms2g -Xmx2g -XX:MaxGCPauseMillis=50。本节按现象、证据、假设、改动、回归走一遍,实测三组参数与并发曲线,结论是 GC 停顿只占 p99 的 5%,真正有效的是限制单实例在途请求。
同样 5000 个请求、50 并发,ab 不带 -k 是 1909 req/s、p99 78ms,带 -k 是 10201 req/s、p99 17ms。本节用这两份真实输出讲吞吐、均值、分位、连接复用与协调缺失,并用 Little 定律和开环压测器说明为什么并发不是越高越好。
JFR 找到热点之后,下一步不是立刻改代码,而是算收益。本节用同一台机器对比 Loan.state 与直接罚金计算的分配采样,用 JMH 量化 synchronized 与 LongAdder 的差距,并比较批量循环与 stream,最后给出 libraryd 的「先测量、再改、再回归」决策表。
工具不是越多越好,每个工具只回答一类问题。本节给出 jcmd help 的真实命令清单与开销分级,实测 8 秒 JFR 记录的 summary、热点与分配视图,展示 GC 日志字段和 ManagementFactory 快照代码,并划清 JMC、MAT、async-profiler 的边界。
同一份代码在两个堆大小下会给出不同结论。本节固定 JDK、CPU、堆、GC 与启动参数,用 VM.flags 和 GC.heap_info 实测 256 MB、1 GB、2 GB 与 -Xms≠-Xmx 的差异,验证 ActiveProcessorCount 对 GC/JIT 线程数的影响,并给出 collect.sh。
libraryd 的延迟抬升不能靠猜。本节把「现象→假设→实验→证据→结论」拆成可执行步骤,用 jcmd 的 VM.info、VM.flags、GC.heap_info 真实输出演示字段怎么读,并给出症状到第一工具的对照表与四条研究路径的分工。
同一本图书在一分钟内被查询几百次,每次都打 PostgreSQL 既慢又浪费。本节用 Caffeine 3.3.1 给 libraryd 加本地缓存,讲清 maximumSize、expireAfterWrite、refreshAfterWrite 与 recordStats 的取舍,并用真实输出解释 estimatedSize 为什么暂时偏大、刷新为什么先返回旧值。
系统讲解 Kafka 压缩算法选型:压缩发生在生产端还是 broker、lz4/snappy/gzip/zstd 四种算法的压缩比与吞吐实测、批量大小对压缩率的影响、broker 端重压缩配置、消息格式版本兼容性,以及按场景选择算法的决策方法
图库不像关系型库那样自带成熟的物化视图,多跳查询的代价又特别高,缓存因此成为必需品。本文讲清 Neo4j 的计划缓存与结果缓存边界、应用层缓存的键设计与失效策略、物化视图的三种图原生实现(预计算节点、预聚合属性、独立视图图)、增量维护、写时失效与版本号一致性、GDS 预计算结果的落盘复用,以及缓存穿透与雪崩的防护。
Cypher 写起来像自然语言,写错起来也像——不报错,只是慢几个数量级。本文按根因归类 12 类高频反模式:笛卡尔积与无条件 MATCH、无界变长路径、WHERE 里做函数运算导致索引失效、把分页排序聚合交给 Cypher、MERGE 触发全标签扫描、DETACH DELETE 误删,并给出 EXPLAIN/PROFILE 定位法与改写前后的对照。
PostgreSQL 批量加载全解析:COPY 的三种形态(文件 / STDIN / PROGRAM)、COPY 为何比 INSERT 快几个数量级、synchronous_commit / wal_level / unlogged 表等参数调优、COPY FREEZE 与加载后维护、并行加载与 pg_bulkload、以及应用侧批量写入的实践取舍。
PostgreSQL 并行查询(Parallel Query)全解析:执行器调用链、Gather / Gather Merge 汇聚节点、并行 Seq Scan 与并行位图扫描、Parallel Hash Join 与 Partial Aggregate、代价模型与并行度决策、max_parallel_workers 等参数调优、并行不安全函数与常见陷阱。
PostgreSQL 声明式分区(Declarative Partitioning)全解析:RANGE / LIST / HASH 三大策略选型、分区裁剪(Partition Pruning)原理与 EXPLAIN 验证、DETACH/ATTACH 在线维护、自动分区与 pg_partman、索引与唯一约束的分区限制、分区数量对计划时间的影响,含生产迁移路径与常见坑。
系统讲解 Lua 内存泄漏的检测与定位方法:用 collectgarbage 建立内存基线、通过弱引用表与快照对比定位悬挂引用,并逐一剖析全局变量污染、闭包 upvalue 持有、回调未注销、缓存无上限等常见泄漏源的成因与修复手段,助你快速定位线上内存问题。
完整拆解 Defold 的 HTML5 导出:构建流程与 build/html5 产物结构、WASM 主循环与 JS 桥接机制、归档(Archive)资源加载与自定义加载页、纹理压缩与包体裁剪、WebGL 上下文与内存的运行时优化,以及 JS 互操作、音频解锁与离线缓存的平台集成。
系统讲解 MongoDB 连接池的线程模型与连接成本、maxPoolSize 与 waitQueueTimeoutMS 等核心参数的取值方法、多进程下的池容量计算公式、Node.js/Go/Java/Python 驱动的差异配置,以及连接数暴涨、排队超时与连接泄漏的完整排障路径