<?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%AE%B9%E5%99%A8/</link><description>Recent content in 容器 on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 21 May 2026 23:30:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/%E5%AE%B9%E5%99%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>Go GC 占 CPU 5%，到底要不要调 GOGC？</title><link>https://blog.cpdd.fyi/posts/go-gc-tuning/</link><pubDate>Thu, 21 May 2026 23:30:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/go-gc-tuning/</guid><description>&lt;p&gt;服务 p99 每隔几十秒抖一下。&lt;/p&gt;
&lt;p&gt;监控里 GC CPU 大概 5%，不算夸张，但曲线很准：GC 一来，延迟就往上冒。群里很快有人提议：把 &lt;code&gt;GOGC&lt;/code&gt; 从 100 调到 200，先让 GC 少跑几次。&lt;/p&gt;
&lt;p&gt;这个动作看起来很合理。&lt;/p&gt;
&lt;p&gt;CPU 下来了，GC 日志没那么密了，p99 也安静了几天。然后另一个问题来了：容器内存开始逼近 limit，某个高峰期被 OOMKilled。大家又把 &lt;code&gt;GOGC&lt;/code&gt; 调回去，延迟抖动也跟着回来。&lt;/p&gt;
&lt;p&gt;这就是很多 Go GC 调优的真实状态：不是不会调参数，而是没想清楚自己到底在买什么。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GOGC&lt;/code&gt; 调的是账期，不是魔法。&lt;/p&gt;
&lt;p&gt;调高它，相当于允许堆多长一段时间，用内存换 CPU；调低它，相当于让 GC 更勤快，用 CPU 换内存。至于 &lt;code&gt;GOMEMLIMIT&lt;/code&gt;，它不是另一个版本的 &lt;code&gt;GOGC&lt;/code&gt;，而是在告诉 runtime：这个进程由 Go 管的内存，最好别越过这条线。&lt;/p&gt;
&lt;p&gt;所以这篇不打算把 GC 参数逐个解释一遍。线上真正需要的是一条决策路径：要不要调，调什么，调多少，什么时候停手。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.cpdd.fyi/images/go-gc-tuning/gogc-heap-curve.png" alt="GOGC 与堆目标关系"&gt;&lt;/p&gt;
&lt;h2 id="先别问-gogc-设多少先问谁在付账"&gt;先别问 GOGC 设多少，先问谁在付账&lt;/h2&gt;
&lt;p&gt;Go 官方 GC Guide 给过一个很关键的公式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Target heap memory = Live heap + (Live heap + GC roots) × GOGC / 100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这句话不用背，抓住意思就行。&lt;/p&gt;</description></item><item><title>你的 Docker 镜像为什么有 2GB：从 Namespaces 到 Dockerfile 最佳实践</title><link>https://blog.cpdd.fyi/posts/docker-deep-dive-namespaces-cgroups/</link><pubDate>Thu, 23 Apr 2026 20:00:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/docker-deep-dive-namespaces-cgroups/</guid><description>&lt;p&gt;凌晨三点，线上容器启动要三分钟。&lt;/p&gt;
&lt;p&gt;你登上服务器，&lt;code&gt;docker images&lt;/code&gt; 一看：2.1GB。PM 问为什么这么慢，你说&amp;quot;容器已经很快了&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但容器不是虚拟机。你把 Docker 当 VM 用，它当然慢。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;问题不在 Docker，在你没理解它到底是什么。&lt;/p&gt;
&lt;p&gt;很多人以为 Docker 只是把代码和依赖打包进一个盒子，但依然不知道为什么上了生产就崩。你可能正在给一个简单的 Node.js 应用构建 2GB 的镜像，硬编码环境变量，容器启动要三分钟。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;容器不是虚拟机。&lt;/strong&gt; 它不需要 hypervisor，不需要臃肿的 guest OS。它是一个与宿主机内核直接共享的进程。&lt;/p&gt;
&lt;p&gt;看完这篇，你能写出高效 Dockerfile，不再把容器当虚拟机用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一容器-vs-vm为什么你的镜像这么大"&gt;一、容器 vs VM：为什么你的镜像这么大&lt;/h2&gt;
&lt;p&gt;虚拟机通过 hypervisor 模拟物理硬件。每个 VM 运行独立的操作系统和应用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VM 有三大痛点：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;痛点&lt;/th&gt;
 &lt;th&gt;表现&lt;/th&gt;
 &lt;th&gt;后果&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;资源税&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;每个 VM 都带着完整的内核&lt;/td&gt;
 &lt;td&gt;10 个 VM 就是 10 份 Linux 内核，内存和 CPU 大量浪费&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;启动延迟&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;启动一个完整操作系统需要几分钟&lt;/td&gt;
 &lt;td&gt;微服务时代根本等不起&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;体积庞大&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;VM 镜像通常几个 GB&lt;/td&gt;
 &lt;td&gt;存储和传输都很慢&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Docker 虚拟化的是操作系统，不是硬件。容器共享宿主机内核，只隔离用户空间的进程、库和依赖。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;容器优势：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快：通常秒级启动&lt;/li&gt;
&lt;li&gt;轻：不需要独立 OS，内存和 CPU 占用小&lt;/li&gt;
&lt;li&gt;可移植：应用和依赖打包在一起，任意环境一致运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.cpdd.fyi/images/docker-deep-dive/vm-vs-container.svg" alt="容器 vs VM 架构对比"&gt;&lt;/p&gt;</description></item></channel></rss>