<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工程决策 on Zampo Blog</title><link>https://blog.cpdd.fyi/tags/%E5%B7%A5%E7%A8%8B%E5%86%B3%E7%AD%96/</link><description>Recent content in 工程决策 on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 17 Jul 2026 02:40:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/%E5%B7%A5%E7%A8%8B%E5%86%B3%E7%AD%96/index.xml" rel="self" type="application/rss+xml"/><item><title>同事甩 10–40% 截图让你升 Go 1.26？先量自己的 GC 占比</title><link>https://blog.cpdd.fyi/posts/go-green-tea-gc-decision/</link><pubDate>Fri, 17 Jul 2026 02:40:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/go-green-tea-gc-decision/</guid><description>&lt;p&gt;值班群里有人贴了 Go 官方的截图：Green Tea 能把 GC 开销降 10–40%。&lt;/p&gt;
&lt;p&gt;下一句往往是：那下周就升 1.26，服务应该能快不少。&lt;/p&gt;
&lt;p&gt;我会先去看一条监控：GC CPU 在总 CPU 里占多少。没有这个数，截图再漂亮，也不能替你做性能判断。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网上的 10–40% 说的是 GC 自己的 CPU，不是你的服务；先量自己的 GC 占比，再决定要不要为 Green Tea 做 A/B。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="先把-1040-的分母说清"&gt;先把 10–40% 的分母说清&lt;/h2&gt;
&lt;p&gt;官方的说法有边界：对 GC 压力很重的真实程序，GC 开销预计可下降约 10–40%。多数程序接近 10%，少数可以接近 40%。这里减少的是垃圾回收本身消耗的 CPU 时间，不是 QPS 一定上涨，也不等于 p99 一定下降。&lt;/p&gt;
&lt;p&gt;官方给过一个很实用的换算。如果一个程序有 10% 的 CPU 时间花在 GC，上述改善折算到总 CPU，大致是 1–4%。这个数字不小，但它和“服务快了 40%”是两回事。&lt;/p&gt;
&lt;p&gt;你的服务里 GC 若只占 5% 的总 CPU，即便 GC 自身少花 40%，总 CPU 的变化也很有限。反过来，GC 在 CPU 性能分析里长期占着明显一段，或者分配频繁、堆里有大量小的指针对象，Green Tea 才值得认真对比。&lt;/p&gt;
&lt;p&gt;这里没有玄学，先看两个数：GC CPU 占比，以及 GC 自身能少花多少。前者很低时，升级后业务指标没有明显变化，本来就是可能出现的结果。&lt;/p&gt;</description></item><item><title>我为什么从 MySQL 投奔 PostgreSQL（以及没有全盘迁移）</title><link>https://blog.cpdd.fyi/posts/mysql-to-pg-migration/</link><pubDate>Sat, 27 Jun 2026 10:00:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/mysql-to-pg-migration/</guid><description>&lt;p&gt;上一篇《MySQL 千疮百孔，为什么没人能替代它》发出去之后，收到的留言比我预想的多。大部分不是技术讨论，是一种很微妙的共鸣：我知道它有问题，但我确实不知道该不该换。&lt;/p&gt;
&lt;p&gt;这其实才是真正的困惑。&lt;/p&gt;
&lt;p&gt;你看完 MySQL 那堆坑——ENUM 排序按定义位置、级联外键不触发 trigger、DDL 隐式提交——你的第一反应不该是&amp;quot;PostgreSQL 好，我要换&amp;quot;。你的第一反应应该是：我当前的项目，这些坑到底有没有咬到我？&lt;/p&gt;
&lt;p&gt;如果没咬到，别动。&lt;/p&gt;
&lt;p&gt;如果咬到了，也不能说换就换。你得知道换了之后会面临什么全新的疼法。&lt;/p&gt;
&lt;p&gt;这篇就是讲这个的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="让我的手指终于放在键盘上的那个瞬间"&gt;让我的手指终于放在键盘上的那个瞬间&lt;/h2&gt;
&lt;p&gt;先说我的触发点。&lt;/p&gt;
&lt;p&gt;不是什么宏大的&amp;quot;我们要用更先进的数据库&amp;quot;。是一个凌晨两点半的告警电话。&lt;/p&gt;
&lt;p&gt;线上 MySQL 实例的活跃连接数冲破了 500。&lt;code&gt;thread_cache_size&lt;/code&gt; 已经调过一轮了，&lt;code&gt;max_connections&lt;/code&gt; 也放宽过。但 MySQL 的 thread-per-connection 模型到了这个量级，上下文切换已经压垮了 CPU。新连接进不来，已有查询跑不完，连接池开始拒绝请求。回滚也回不干净，因为 DML 都被堵在了锁等待队列里。&lt;/p&gt;
&lt;p&gt;我试过调参数、重启连接池、杀掉慢查询。能做的都做了，只够撑到天亮。&lt;/p&gt;
&lt;p&gt;天亮以后我查了接下来半年要上线的功能排期。三个和搜索有关的，两个需要地理查询，还有一个说想在用户标签里做 JSON 过滤。MySQL 的 JSON 你是知道的——每次解析全文，索引靠虚拟列绕路，这不是能用，是将就。&lt;/p&gt;
&lt;p&gt;那天中午我开了个会。结论不是&amp;quot;PG 更好&amp;quot;，是&amp;quot;在这个点上，不改的成本已经超过改的成本了&amp;quot;。&lt;/p&gt;
&lt;p&gt;但我仍然没有做全盘迁移。这篇就是告诉你我换了什么、没换什么、以及换完之后才知道的学费。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第一块什么让我决定换"&gt;第一块：什么让我决定换&lt;/h2&gt;
&lt;h3 id="连接数瓶颈不是-pg-更好是-pgbouncer-把它变成了可控问题"&gt;连接数瓶颈——不是 PG 更好，是 PgBouncer 把它变成了可控问题&lt;/h3&gt;
&lt;p&gt;MySQL 的 thread-per-connection 模型在 &amp;lt;100 连接时没什么感觉。到了 200+，你就开始频繁看 &lt;code&gt;Too many connections&lt;/code&gt;。到 500+，运维基本靠祈祷。&lt;/p&gt;
&lt;p&gt;这问题技术上不是 MySQL 不能处理高并发——淘宝、Facebook 都在用——但那是建立在应用层做了极其精细的连接管理之上的。大部分团队没有那个资源。&lt;/p&gt;
&lt;p&gt;PostgreSQL 本身也是 fork-per-connection，每个连接 2-5 MB 基础内存，直接连 500 个也扛不住——甚至比 MySQL 更差。但 PG 加 PgBouncer 的组合把问题结构化了：你在应用层维持几百上千个连接，PgBouncer 用事务池把它们复用到 PG 端的几十个连接上。&lt;/p&gt;</description></item></channel></rss>