<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HRunning</title><link>https://hangliuc.github.io/</link><description>Recent content on HRunning</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>HRunning</copyright><lastBuildDate>Thu, 10 Sep 2026 06:54:52 +0000</lastBuildDate><atom:link href="https://hangliuc.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugo ｜ to do list</title><link>https://hangliuc.github.io/topic/blogging/todo/</link><pubDate>Thu, 27 Nov 2025 11:04:45 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/todo/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ to do list" /&gt;&lt;h2 id="-博客待办清单"&gt;📝 博客待办清单
&lt;/h2&gt;&lt;h3 id="-p0"&gt;🔥 P0
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 让博客可以在google、百度等搜索引擎中被收录
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 提交 google sitemap&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 提交百度 sitemap,百度提交sitemap时需要备案号才能增加提交次数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 优化网站访问速度
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 开启 BBR 拥塞控制 net.ipv4.tcp_congestion_control = bbr&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-p1"&gt;🛠 p1
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 开发agent 同时发布上传yuque、csdn、weichat
&lt;ul&gt;
&lt;li&gt;yuque api token 需要付费&lt;/li&gt;
&lt;li&gt;csdn 目前没有找到合适的api&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 美化网站右侧边栏
添加优秀文章,根据访问量去统计&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 单独制作首页，可以参考https://www.shaohantian.com/&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SEO 搜索结果片段优化，提高搜索结果的美观性&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 写关于我的一些说明&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 开发管理平台&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 增加常用工具列表&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="archived---已上线功能"&gt;✅Archived - 已上线功能
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 增加评论功能
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 评论功能迁移到waline&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 评论通知 wechat、email 等渠道&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 完善关键字搜索功能&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 添加文章字数统计&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 添加英文站，中英文文章由作者分别维护
&lt;ul&gt;
&lt;li&gt;页眉网站统计信息适配英文版&lt;/li&gt;
&lt;li&gt;文章顶部字数统计、阅读量统计适配英文版&lt;/li&gt;
&lt;li&gt;左侧边栏切换按钮由下拉框改为直接切换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 美化浏览器顶层图标&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 首页和文章添加&amp;quot;返回顶部&amp;quot;功能&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 服务器部署网站
服务器不在国内可以先不备案
域名：hangops.top，首年 ¥14，续费 ¥32&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 部署监控系统
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 部署prometheus&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 部署grafana(&lt;a class="link" href="https://monitor.hangops.top/" target="_blank" rel="noopener"
&gt;https://monitor.hangops.top/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 添加网站访问统计
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 统计网站访问量&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 统计文章访问量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; 备份blog mysql 数据库到cos 存储桶&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="内容相关"&gt;内容相关
&lt;/h2&gt;&lt;p&gt;目录结构如下：&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 运维
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Mysql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Kafka
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ansible
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - k8s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - aws
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - prometheus
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Terraform
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 编程
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Python
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Go
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 数据结构
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 算法
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 专题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 博客相关
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 面试相关
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Liunx 性能优化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Mysql 实战
&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;</description></item><item><title>Brainstorming Skill｜实现前的设计与需求分析</title><link>https://hangliuc.github.io/ai/brainstorming-skill/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0800</pubDate><guid>https://hangliuc.github.io/ai/brainstorming-skill/</guid><description>&lt;img src="https://hangliuc.github.io/ai/brainstorming-skill/cover.png" alt="Featured image of post Brainstorming Skill｜实现前的设计与需求分析" /&gt;&lt;h2 id="技能定位"&gt;技能定位
&lt;/h2&gt;&lt;p&gt;Brainstorming 是一个强制性的前置设计与需求分析技能。它通过协作式对话，把用户的初步想法逐步转化为结构化、可执行的设计方案与需求文档。&lt;/p&gt;
&lt;p&gt;它要解决的是“想法已经很清楚，所以可以直接开始做”的常见误区。即使需求看起来简单，也应先经过设计阶段，明确目标、场景、约束、候选方案和取舍，从而减少实现偏差与后续返工。&lt;/p&gt;
&lt;h2 id="核心规则"&gt;核心规则
&lt;/h2&gt;&lt;p&gt;在设计文档完成并得到用户确认之前，禁止执行实现类操作，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编写代码&lt;/li&gt;
&lt;li&gt;初始化项目&lt;/li&gt;
&lt;li&gt;修改现有文件&lt;/li&gt;
&lt;li&gt;创建数据库或基础设施&lt;/li&gt;
&lt;li&gt;执行部署或其他落地操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Brainstorming 阶段的产物应该是一份用户可以审阅和确认的方案，而不是半成品实现。&lt;/p&gt;
&lt;h2 id="推荐工作流程"&gt;推荐工作流程
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;澄清问题&lt;/strong&gt;：理解背景、目标用户、使用场景和真正要解决的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拆解需求&lt;/strong&gt;：区分必须满足的目标、可选目标、已知约束和潜在风险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提出方案&lt;/strong&gt;：从多个角度探索可行方向，避免过早锁定单一实现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;比较取舍&lt;/strong&gt;：根据性能、复杂度、成本、扩展性和维护难度分析利弊。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形成文档&lt;/strong&gt;：整理为结构化设计方案，明确推荐方向和后续步骤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等待确认&lt;/strong&gt;：用户确认设计之前，不进入任何实现阶段。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="模板一新功能开发"&gt;模板一：新功能开发
&lt;/h2&gt;&lt;p&gt;适合在规划一个新功能、模块或产品能力时使用。&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&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;帮我头脑风暴一下如何实现[功能名称]。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;背景：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 当前系统状态：[简要描述现有架构/相关模块]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 目标用户/场景：[谁会用、什么时候用]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 已知约束：[性能要求、兼容性、截止时间等]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;我希望探索的方向：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. [方向A]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. [方向B]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 其他你觉得值得考虑的方案
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;请帮我从多个角度分析利弊。
&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;
&lt;h2 id="模板二技术方案选型"&gt;模板二：技术方案选型
&lt;/h2&gt;&lt;p&gt;适合在多个技术方案之间进行比较和决策时使用。&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&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;帮我头脑风暴一下[技术决策]的选型方案。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;需求场景：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 核心需求：[必须满足的功能点]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 规模预期：[数据量/并发量/团队规模]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 现有技术栈：[当前用了什么]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;评估维度：性能、开发效率、社区生态、学习曲线、长期可扩展性
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;候选方案（如果有）：[A、B、C]
&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;如果暂时没有候选方案，也可以只描述需求场景，让 Brainstorming 先帮助建立候选清单，再根据统一的评估维度进行比较。&lt;/p&gt;
&lt;h2 id="产出检查清单"&gt;产出检查清单
&lt;/h2&gt;&lt;p&gt;一份可以进入实现阶段的设计文档，至少应回答以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要解决的具体问题是什么？&lt;/li&gt;
&lt;li&gt;谁会使用它，在哪些场景下使用？&lt;/li&gt;
&lt;li&gt;成功标准和验收方式是什么？&lt;/li&gt;
&lt;li&gt;有哪些可行方案，它们的主要取舍是什么？&lt;/li&gt;
&lt;li&gt;推荐方案为什么适合当前场景？&lt;/li&gt;
&lt;li&gt;有哪些约束、风险和待确认事项？&lt;/li&gt;
&lt;li&gt;用户确认后，第一步实现工作是什么？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考链接"&gt;参考链接
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://bytedance.larkoffice.com/wiki/T8CTw98egiWuEekSUoFcyhqQnMd" target="_blank" rel="noopener"
&gt;字节跳动 Brainstorming Skill 参考文档&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Image2 提示词｜构建视觉隐喻的高级概念海报</title><link>https://hangliuc.github.io/ai/image2-concept-poster-prompt/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0800</pubDate><guid>https://hangliuc.github.io/ai/image2-concept-poster-prompt/</guid><description>&lt;img src="https://hangliuc.github.io/ai/image2-concept-poster-prompt/cover.png" alt="Featured image of post Image2 提示词｜构建视觉隐喻的高级概念海报" /&gt;&lt;p&gt;这份提示词用于 Image2 生成概念海报。重点是先理解文字的含义与情绪，再让文字和图像共同构成一个完整的视觉表达。&lt;/p&gt;
&lt;h2 id="使用方法"&gt;使用方法
&lt;/h2&gt;&lt;p&gt;复制下方完整提示词，填写末尾的「核心文字 / 单词 / 词组 / 字母」。背景、补充语境和情绪倾向可以按需调整；默认文字语言为中文，情绪倾向为「专业 / 压迫感 / 醒目」。&lt;/p&gt;
&lt;h2 id="完整提示词"&gt;完整提示词
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&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;你要生成的不是一个单词放大后贴在画面上的字效海报，而是一张“基于词语含义自动构建视觉隐喻”的高级概念海报。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你的核心任务是：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户会提供一个字、一个词、一个词组、一个短句，或一组字母。你需要先真正理解这个文字内容的表层含义、情绪气质、隐含象征、文化联想、心理感受与语义张力，再把这些理解转译成一张极简、强概念、强传播力、强视觉记忆点的图形艺术海报。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这张海报必须让人一眼就感受到这个词语“为什么是这样被表达的”，而不是只看到漂亮画面却无法理解词义。画面要做到“文字本身就是主题，图像是对文字的深化表达，二者共同组成一个完整的视觉句子”。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;一、先理解词语，再生成画面
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;在动手生成之前，先智能分析用户输入内容，包括但不限于：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 这个词语最核心的字面含义是什么。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 这个词语在情绪上偏向温柔、冷峻、危险、孤独、浪漫、压迫、希望、纯真、欲望、秩序、冲突、疏离、自由、沉默、毁灭、重生等哪种倾向。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 这个词语是否具有双关、反差、张力、隐喻、悖论、社会性、哲学性或情感深度。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 这个词语最适合被转译成哪一种视觉逻辑：人物关系、物体关系、动作关系、空间关系、对比关系、象征关系、冲突关系、秩序关系、荒诞关系、诗意关系等。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 如果这个词语较抽象，不要直接做空洞抽象图案，而要找到能够承载其含义的具体视觉载体。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 如果这个词语较具体，也不要只做字面插图，而要通过构图、尺度、关系、反差与氛围，让它变得更有思想和记忆点。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;二、画面构图逻辑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;整体画面必须极简、明确、有概念感，构图要干净而有力量，不能杂乱，不能像普通商业插画，不能堆砌太多元素。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先采用以下构图思路：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 大字作为画面的核心骨架。用户输入的文字、单词或词组应成为画面中的主视觉文字主体，通常以大尺寸出现，占据画面重要区域，具有强识别性与压迫感。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 图像元素不是随意摆放，而是要与文字产生关系。它们可以站在字前、嵌入字中、与字形成互动、切割字形、借字的空间形成叙事，或在视觉上与字构成强烈对照。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 整体元素数量要克制。通常控制在少量关键主体之内。宁可少而准，也不要多而散。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 画面要有明确主次关系：文字是第一视觉层，图像叙事是第二视觉层，细小说明文字是第三视觉层。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 留白要聪明，不是空，而是让画面更有呼吸感、更有判断力、更有设计感。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 构图应尽量稳定、简洁、好读，并具备“海报感”，而不是像一张普通插画截图。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;三、图像表达逻辑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;根据词语的意义，自动选择最有代表性的视觉表达方式。图像表达应遵循以下原则：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 优先选择能够浓缩词义的单一强画面，而不是平铺直叙。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 可以通过人物之间的关系、人物与物体的关系、尺度反差、方向关系、距离关系、遮挡关系、动作瞬间等方式表达词义。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 画面应具有隐喻性，但不能晦涩到完全无法理解。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 表达要巧妙，要有“看到后会心一击”的感觉，让观众觉得画面和这个词是高度绑定的。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 不要仅仅追求美感，更要追求“准确地说出了这个词的感觉”。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 如果词义具有冲突性、悖论性或反差感，可以通过画面中的对立元素强化这种张力。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7. 如果词义更偏诗意、情感、记忆、哲思，可以使用更含蓄、更留白、更克制的图像策略。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;四、视觉风格要求
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;整体风格为高级图形艺术海报，具有拼贴感、丝网印刷感、石版印刷感或版画式质感，但不要做得过脏过乱。要保留一种清晰、克制、硬朗、概念化的印刷纸张气质。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;风格要求：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 具有强烈平面设计感，而不是普通三维插画。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 画面应有干净统一的色彩逻辑，颜色数量不宜过多。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 可使用高饱和主背景色配合大面积浅色文字，形成强对比。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 质感可带有细微颗粒、纸张纹理、印刷噪点、轻微做旧感，但整体仍需清爽、利落、高级。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 人物或物体细节要清楚，但整体仍然服从平面海报的统一调性。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 不要做成廉价模板，不要出现低级拼贴感，不要做成广告页，不要做成普通电商排版。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;五、文字排版逻辑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 用户输入的文字内容必须作为核心标题，大且醒目。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 如果用户输入的是英文单词或字母组合，保留原文，确保字形强烈、清晰、具有视觉冲击力。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 如果用户输入的是中文词语或短句，可以根据整体设计决定是否直接使用中文大字，或采用更适合的方式排布，但必须保证其是画面核心。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 可以在画面左下角、右下角或其他克制位置加入一句小型辅助短句，用来深化主题，但必须非常简洁且自然。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 还可以加入少量极小号的辅助信息、编号、署名等内容，仅在非常相关的情况下用来增强海报的艺术感，避免过多无关内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 所有文字都要像从画面中生长出来的一样，不能像后期随便贴上去。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;六、成图目标
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;最终生成的海报必须满足以下结果：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 一眼看上去极简、强烈、完整、有高级感。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 能让人快速感受到这个词语的情绪和内涵。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 图与字之间存在强关联，形成一种聪明、准确、耐看的视觉表达。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 既有平面设计的理性控制，也有艺术表达的情绪力度。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 具有传播性、海报感、收藏感、展览感。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 不能只是“把词画出来”，而是要“把词的精神状态视觉化”。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;七、执行原则
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 不要机械重复固定模板，要根据用户输入智能变化。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 但整体仍需保持极简、概念化、强排版、强识别度的统一品质。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 构图要合理，画面要克制，表达要巧妙。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 不要过度解释，不要加入多余元素，不要让画面显得拥挤。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 任何视觉元素都必须服务于词语表达，不能为了好看而偏离主题。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;请基于以上原则，生成一张围绕用户输入内容展开的高级概念海报。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户输入内容：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;背景：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;核心文字 / 单词 / 词组 / 字母：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;文字语言：中文
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;可选补充语境：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;可选情绪倾向：专业 / 压迫感 / 醒目
&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;</description></item><item><title>Hugo ｜ 如何让搜索引擎检索到博客</title><link>https://hangliuc.github.io/topic/blogging/website_discovered/</link><pubDate>Mon, 15 Dec 2025 19:45:07 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/website_discovered/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ 如何让搜索引擎检索到博客" /&gt;&lt;p&gt;部署完博客后，需要让搜索引擎检索到博客。&lt;/p&gt;
&lt;h2 id="google"&gt;google
&lt;/h2&gt;&lt;h3 id="获取measurement-id"&gt;获取Measurement ID
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://analytics.google.com/analytics/web/provision/#/provision" target="_blank" rel="noopener"
&gt;google 分析官方网站&lt;/a&gt;
在 google 分析中，每个网站都有一个唯一的 Measurement ID，格式为 &lt;code&gt;G-XXXXXXXXXX&lt;/code&gt;。这个 ID 用于将网站的访问数据发送到 google 分析。&lt;/p&gt;
&lt;p&gt;在hugo.yaml 中添加如下配置：&lt;/p&gt;
&lt;p&gt;如果你是yaml 格式，注意要是最顶级的配置&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;googleAnalytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;G-xxxx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 换成你的 Measurement ID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h3 id="提交sitemap"&gt;提交siteMap
&lt;/h3&gt;&lt;p&gt;siteMap 是一个 xml 文件，用于告诉搜索引擎你的网站有哪些页面。&lt;/p&gt;
&lt;p&gt;Hugo 会在生成和部署网站时在 public 文件夹根目录下自动生成 sitemap.xml 文件&lt;/p&gt;
&lt;p&gt;登录&lt;a class="link" href="https://search.google.com/search-console" target="_blank" rel="noopener"
&gt;谷歌搜索控制台&lt;/a&gt;。在验证所有权的选项中选择 “Google Analytics”，输入你的 Measurement ID 即可验证所有权。&lt;/p&gt;
&lt;p&gt;下面就是已经成功提交的截图
&lt;img src="https://hangliuc.github.io/topic/blogging/website_discovered/google_search_console.webp"
width="1600"
height="545"
srcset="https://hangliuc.github.io/topic/blogging/website_discovered/google_search_console_hu_9f089e83ed85ab04.webp 480w, https://hangliuc.github.io/topic/blogging/website_discovered/google_search_console_hu_8353deeb5ef321f4.webp 1024w"
loading="lazy"
alt="google 搜索控制台验证所有权"
class="gallery-image"
data-flex-grow="293"
data-flex-basis="704px"
&gt;&lt;/p&gt;
&lt;h3 id="如何验证文章已经被google-收录"&gt;如何验证文章已经被Google 收录
&lt;/h3&gt;&lt;p&gt;对于一个新站，Google 可能需要 几天甚至几周 才能把所有页面全部收录&lt;/p&gt;
&lt;h4 id="google-search-console-验证"&gt;Google Search Console 验证
&lt;/h4&gt;&lt;p&gt;直接在顶部的搜索框查询，输入你的文章链接，即可验证是否被收录。
&lt;img src="https://hangliuc.github.io/topic/blogging/website_discovered/gcs01.webp"
width="1600"
height="652"
srcset="https://hangliuc.github.io/topic/blogging/website_discovered/gcs01_hu_784d52ae9ecf6568.webp 480w, https://hangliuc.github.io/topic/blogging/website_discovered/gcs01_hu_f189e7924b770740.webp 1024w"
loading="lazy"
alt="google 搜索控制台验证所有权"
class="gallery-image"
data-flex-grow="245"
data-flex-basis="588px"
&gt;&lt;/p&gt;
&lt;p&gt;也可以直接点击请求编入索引，请求 Google 收录你的文章。&lt;/p&gt;
&lt;h4 id="google-搜索验证"&gt;google 搜索验证
&lt;/h4&gt;&lt;p&gt;&lt;img src="https://hangliuc.github.io/topic/blogging/website_discovered/gcs02.webp"
width="1233"
height="899"
srcset="https://hangliuc.github.io/topic/blogging/website_discovered/gcs02_hu_bc8a1eebbdebb6ad.webp 480w, https://hangliuc.github.io/topic/blogging/website_discovered/gcs02_hu_985a5ae64c0de5eb.webp 1024w"
loading="lazy"
alt="google 搜索控制台验证所有权"
class="gallery-image"
data-flex-grow="137"
data-flex-basis="329px"
&gt;&lt;/p&gt;
&lt;p&gt;tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;验证收录可能需要 几天甚至几周 才能完成。&lt;/li&gt;
&lt;li&gt;文章的标题尽可能增加关键词密度，更加吸晴，让用户有点击的欲望。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="百度"&gt;百度
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;登录&lt;a class="link" href="https://ziyuan.baidu.com/?castk=LTE%3D" target="_blank" rel="noopener"
&gt;百度搜索控制台&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;按照要求添加域名后，使用普通收录推送资源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://hangliuc.github.io/topic/blogging/website_discovered/baidu_search.webp"
width="1600"
height="721"
srcset="https://hangliuc.github.io/topic/blogging/website_discovered/baidu_search_hu_49454b34a19068fc.webp 480w, https://hangliuc.github.io/topic/blogging/website_discovered/baidu_search_hu_c2f02524edc810be.webp 1024w"
loading="lazy"
alt="百度搜索控制台添加域名"
class="gallery-image"
data-flex-grow="221"
data-flex-basis="532px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提交 sitemap.xml 文件时，需要备案号，这里先不添加。&lt;/li&gt;
&lt;li&gt;api 提交每天会有条数限制&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="refs"&gt;refs
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://hyrtee.github.io/2023/start-blog/#refs" target="_blank" rel="noopener"
&gt;https://hyrtee.github.io/2023/start-blog/#refs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hugo ｜ Waline 评论系统私有化部署</title><link>https://hangliuc.github.io/topic/blogging/deploy_comments/</link><pubDate>Sun, 14 Dec 2025 17:53:12 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/deploy_comments/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ Waline 评论系统私有化部署" /&gt;&lt;h2 id="waline-评论系统"&gt;Waline 评论系统
&lt;/h2&gt;&lt;p&gt;博客原本使用github giscus 作为评论系统，现在迁移至 Waline 评论系统。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持匿名评论（无需登录）&lt;/li&gt;
&lt;li&gt;UI 简洁美观&lt;/li&gt;
&lt;li&gt;可以配置邮箱/weixin 接收通知&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本地部署waline"&gt;本地部署(Waline)
&lt;/h2&gt;&lt;h3 id="docker-compose-部署"&gt;docker-compose 部署
&lt;/h3&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;waline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;lizheming/waline:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;waline-standalone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8360:8360&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_HOST=blog-stats-db &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_PORT=3306&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_DB=waline_db &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_USER=root&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_PASSWORD=xxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_CHARSET=utf8mb4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_SSL=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;TABLE_PREFIX=wl_&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;TZ=Asia/Shanghai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;LANG=zh_CN.UTF-8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;JWT_SECRET=Standalone_Waline_Secret_2025&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# --- 通知配置 ---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SITE_NAME=Hangliuc&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SITE_URL=https://hangops.top&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 163&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SMTP_SERVICE=163&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SMTP_USER=iliuhang@163.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SMTP_PASS=xxxxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SMTP_SECURE=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUTHOR_EMAIL=iliuhang@163.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SENDER_EMAIL=iliuhang@163.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ext-blog-net&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ext-blog-net&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;blog-stats_blog-net &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#因为 Waline 和 MySQL 不在同一个 docker-compose.yaml 文件里，它们默认是隔离的。需要让 Waline 加入到 MySQL 所在的网络中。&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;使用时请先导入 waline.sql 以完成表和表结构的创建，之后在项目中配置如下环境变量。
&lt;a class="link" href="https://waline.js.org/guide/database.html#mysql" target="_blank" rel="noopener"
&gt;Waline 数据库配置&lt;/a&gt;&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -i blog-stats-db mysql -uroot -p&lt;span class="s1"&gt;&amp;#39;xxxxx&amp;#39;&lt;/span&gt; -Dwaline_db &amp;lt; waline.sql
&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;h3 id="nginx-反向代理"&gt;Nginx 反向代理
&lt;/h3&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&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-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;comment.hangops.top)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;comment.hangops.top&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 强制跳转 HTTPS (可选，建议加上)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;comment.hangops.top&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/comment.hangops.top/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/comment.hangops.top/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:8360&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 必须带上的 Header，否则 Waline 无法获取用户真实
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/comment.hangops.top/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/letsencrypt/live/comment.hangops.top/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&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;h3 id="hugo-配置"&gt;Hugo 配置
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://waline.js.org/reference/client/props.html" target="_blank" rel="noopener"
&gt;Waline 组件配置&lt;/a&gt;&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;waline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;waline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;serverURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://comment.hangops.top&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pageview&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 开启阅读量&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requiredMeta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;nick&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mail &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;</description></item><item><title>Hugo ｜ 如何自定义实现网站统计功能</title><link>https://hangliuc.github.io/topic/blogging/site_statistics/</link><pubDate>Thu, 11 Dec 2025 14:23:32 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/site_statistics/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ 如何自定义实现网站统计功能" /&gt;&lt;h2 id="一些实现方式"&gt;一些实现方式
&lt;/h2&gt;&lt;p&gt;目前看到网上关于网站统计功能的实现方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于busuanzi js的统计功能&lt;/li&gt;
&lt;li&gt;基于Waline 的统计功能&lt;/li&gt;
&lt;li&gt;基于服务器端的统计功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于上面的两种方式大家可以自行在网上搜索，这里就不展开讲了，主要讲一下基于自行服务端的统计功能。&lt;/p&gt;
&lt;h2 id="基于服务器端的统计功能"&gt;基于服务器端的统计功能
&lt;/h2&gt;&lt;h3 id="优点"&gt;优点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;数据源真实可靠（全部来自你自己的数据库）&lt;/li&gt;
&lt;li&gt;访问量可以根据业务逻辑定义&lt;/li&gt;
&lt;li&gt;可以进行强一致性统计（文章访问量、文章数量、评论数量等）&lt;/li&gt;
&lt;li&gt;不依赖第三方服务&lt;/li&gt;
&lt;li&gt;后续可以接入监控告警系统，实时观察&lt;/li&gt;
&lt;li&gt;后续可以在自研管理平台展示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="目前统计功能"&gt;目前统计功能
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;网站访问量&lt;/li&gt;
&lt;li&gt;文章访问量&lt;/li&gt;
&lt;li&gt;文章总访问量&lt;/li&gt;
&lt;li&gt;网站运行时间&lt;/li&gt;
&lt;li&gt;&amp;hellip;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="实现方式"&gt;实现方式
&lt;/h2&gt;&lt;p&gt;采用gin web 框架
&lt;a class="link" href="https://github.com/gin-gonic/gin" target="_blank" rel="noopener"
&gt;https://github.com/gin-gonic/gin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用 GORM 做数据库对象关系映射
&lt;a class="link" href="https://github.com/go-gorm/gorm" target="_blank" rel="noopener"
&gt;https://github.com/go-gorm/gorm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以处理POST /api/article/visit，其他接口处理基本相同&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&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-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;articleRepo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;IncreaseViewCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 1. 执行 Upsert (存在则更新，不存在则插入)，体现原子性操作，避免并发问题&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// SQL: INSERT INTO article_stats ... ON DUPLICATE KEY UPDATE view_count = view_count + 1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clauses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OnConflict&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DoUpdates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clause&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Assignments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;view_count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gorm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Expr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;view_count + 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ArticleStat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ViewCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2. 查出最新的值返回&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ArticleStat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;view_count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;path = ?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;First&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ViewCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;前端逻辑
上报/article/visit 接口时如果是首页(/)或者分页(/page/1)或者搜索(/search/query)，也会添加到文章计数，这里排除了这个bug&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&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-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isLocal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://localhost:8080/api/article/visit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://hangops.top/api/article/visit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 如果是首页(/)或者分页(/page/1)或者搜索(/search/query)，直接什么都不做
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/page/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/search/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;article_views_container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;article_views&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;viewEl&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;viewEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;flex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;阅读量获取失败:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt; &lt;/span&gt;
&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;</description></item><item><title>Hugo ｜ 本地服务器部署</title><link>https://hangliuc.github.io/topic/blogging/blogging_deploy/</link><pubDate>Sun, 07 Dec 2025 18:31:24 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/blogging_deploy/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ 本地服务器部署" /&gt;&lt;p&gt;以前采用的是github pages部署网站，现在进行服务器部署网站。&lt;/p&gt;
&lt;h2 id="安装基础软件"&gt;安装基础软件
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 更新系统并安装 EPEL 源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum update -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install epel-release -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 Nginx, Git, 和 Certbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install nginx git certbot certbot-nginx -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动 Nginx 并设置开机自启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /var/www/hangops
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R root:root /var/www/hangops
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod -R &lt;span class="m"&gt;755&lt;/span&gt; /var/www/hangops
&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;h2 id="配置-nginx-与-https"&gt;配置 Nginx 与 HTTPS
&lt;/h2&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo vi /etc/nginx/conf.d/hangops.top.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查语法是否正确&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果显示 successful，则重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl reload nginx
&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;nginx 配置&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name hangops.top www.hangops.top&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /var/www/hangops&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 核心：处理 Hugo 的路由（防止刷新 404）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try_files &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;/ &lt;span class="o"&gt;=&lt;/span&gt;404&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# SRE 优化：开启 Gzip 压缩，加速访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_min_length 1k&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_comp_level 5&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&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;h3 id="申请-https-证书"&gt;申请 HTTPS 证书
&lt;/h3&gt;&lt;p&gt;sudo certbot &amp;ndash;nginx -d hangops.top -d &lt;a class="link" href="https://www.hangops.top" target="_blank" rel="noopener"
&gt;www.hangops.top&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="配置-github-自动部署-cicd"&gt;配置 GitHub 自动部署 (CI/CD)
&lt;/h2&gt;&lt;p&gt;看仓库源码即可&lt;/p&gt;</description></item><item><title>SRE面试题汇总 | Database</title><link>https://hangliuc.github.io/topic/interview/database/</link><pubDate>Sat, 06 Dec 2025 18:42:12 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/database/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post SRE面试题汇总 | Database" /&gt;&lt;h1 id="mysql"&gt;mysql
&lt;/h1&gt;&lt;h2 id="mysql-查询突然变得很慢需要怎么排查"&gt;mysql 查询突然变得很慢，需要怎么排查
&lt;/h2&gt;&lt;h3 id="检查查询本身"&gt;检查查询本身
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;查看SQL查询是否可以优化，比如使用合适的索引、避免全表扫描等。&lt;/li&gt;
&lt;li&gt;复杂的JOIN操作：确认是否有多个大的表连接，或者是不必要的复杂操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="查看数据库性能"&gt;查看数据库性能
&lt;/h3&gt;&lt;p&gt;慢查询日志：启用并查看慢查询日志（slow_query_log）。查看最近哪些查询执行时间较长。&lt;/p&gt;
&lt;h3 id="检查系统负载"&gt;检查系统负载
&lt;/h3&gt;&lt;p&gt;系统资源：查看CPU、内存、磁盘IO、网络等资源是否有瓶颈，可以通过 top 或 htop 等工具监控。
磁盘IO：查看磁盘读写是否成为瓶颈。可以用 iostat 或 vmstat 等工具查看磁盘IO情况。&lt;/p&gt;
&lt;h3 id="检查锁和并发问题"&gt;检查锁和并发问题
&lt;/h3&gt;&lt;p&gt;锁情况：查看是否有锁等待或死锁问题。使用以下SQL语句查看当前的锁状态：
如果有很多线程处于“Locked”状态，可能需要进一步分析锁的来源和解决方法。&lt;/p&gt;
&lt;h3 id="网络延迟"&gt;网络延迟
&lt;/h3&gt;&lt;p&gt;如果是远程连接MySQL，确认网络连接是否稳定，延迟是否较高。&lt;/p&gt;
&lt;h1 id="redis"&gt;redis
&lt;/h1&gt;&lt;h2 id="热-key大-key-问题"&gt;热 Key、大 Key 问题
&lt;/h2&gt;&lt;h3 id="热key问题"&gt;热key问题
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;热key：指被频繁访问的key，可能导致数据库性能下降。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 集中在一个 Redis 节点&lt;/li&gt;
&lt;li&gt;QPS 不均匀，集群负载失衡&lt;/li&gt;
&lt;li&gt;延迟飙升、请求超时&lt;/li&gt;
&lt;li&gt;导致节点触发 failover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解决方案&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务层分流/分桶 将热请求拆成多个 key，提高并发承载。&lt;/li&gt;
&lt;li&gt;增加缓存层：本地缓存 + Redis 二级缓存，减少对 Redis 的直接访问&lt;/li&gt;
&lt;li&gt;使用多 Key 拆分读压力，一个热门大 key 分成多个子 key&lt;/li&gt;
&lt;li&gt;Redis Proxy 层热点保护，代理层可识别热点并做降级&lt;/li&gt;
&lt;li&gt;客户端本地限流 + 降级&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大key问题"&gt;大key问题
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;大key：指key对应的值非常大，占用了大量的内存空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;迁移槽时（CLUSTER ADDSLOTS/MIGRATE）非常慢&lt;/li&gt;
&lt;li&gt;可能阻塞 Redis 主线程&lt;/li&gt;
&lt;li&gt;删除时触发阻塞（del O(n) 操作&lt;/li&gt;
&lt;li&gt;压垮网络带宽&lt;/li&gt;
&lt;li&gt;读写延迟变大&lt;/li&gt;
&lt;li&gt;Failover 恢复慢&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解决方案&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务层拆分：将大 key 拆分成多个小 key，每个小 key 只存储一部分数据。&lt;/li&gt;
&lt;li&gt;分页读取：不使用 hgetall/smembers/zrange，使用scan / 分段取&lt;/li&gt;
&lt;li&gt;提前限制 value 的大小： 在服务侧做 key 大小限制&lt;/li&gt;
&lt;li&gt;避免在 Redis 存储日志、消息、长文本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如何发现大key&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redis的SCAN命令&lt;/li&gt;
&lt;li&gt;redis-cli -h 127.0.0.1 -p 6379 —bigkeys&lt;/li&gt;
&lt;li&gt;开源工具Redis RDB Tools，分析RDB文件，扫描出Redis大key。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="kafka"&gt;kafka
&lt;/h1&gt;&lt;h2 id="消费堆积如何处理"&gt;消费堆积如何处理
&lt;/h2&gt;&lt;h3 id="消息堆积原因"&gt;消息堆积原因
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;生产者短时间内生产大量消息到Topic，消费者无法及时消费。&lt;/li&gt;
&lt;li&gt;消费者的消费能力不足（消费者并发低、消息处理时间长），导致消费效率低于生产效率。&lt;/li&gt;
&lt;li&gt;消费者异常（如消费者故障、消费者网络异常等）导致无法消费消息。&lt;/li&gt;
&lt;li&gt;Topic分区设置不合理，或新增分区无消费者消费。&lt;/li&gt;
&lt;li&gt;Topic频繁重分配导致消费效率降低。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="解决方法"&gt;解决方法
&lt;/h3&gt;&lt;p&gt;从消息堆积的原因看，消息堆积问题可以从消费者端、生产者端和服务端三个方面进行处理。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;消费者端
&lt;ul&gt;
&lt;li&gt;根据实际业务需求，合理增加消费者个数（消费并发度），确保分区数/消费者数=整数，建议消费者数和分区数保持一致。&lt;/li&gt;
&lt;li&gt;提高消费者的消费速度，通过优化消费者处理逻辑（减少复杂计算、第三方接口调用和读库操作），减少消费时间。&lt;/li&gt;
&lt;li&gt;增加消费者每次拉取消息的数量：拉取数据/处理时间 &amp;gt;= 生产速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;生产者端
&lt;ul&gt;
&lt;li&gt;生产消息时，给消息Key加随机后缀，使消息均衡分布到不同分区上。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;服务端
&lt;ul&gt;
&lt;li&gt;合理设置Topic的分区数，在不影响业务处理效率的情况下，调大Topic的分区数量。&lt;/li&gt;
&lt;li&gt;当服务端出现消息堆积时，对生产者进行熔断，或将生产者的消息转发到其他Topic。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRE面试题汇总 | K8s</title><link>https://hangliuc.github.io/topic/interview/k8s/</link><pubDate>Sat, 06 Dec 2025 18:15:30 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/k8s/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post SRE面试题汇总 | K8s" /&gt;&lt;h2 id="各模块如何与-api-server-通信"&gt;各模块如何与 API Server 通信
&lt;/h2&gt;&lt;p&gt;集群内的各个功能模块通过API Server将信息存入etcd，当需要获取和操作这些数据时，则通过API Server提供的REST接口（用GET、LIST或WATCH方法）来实现，从而实现各模块之间的信息交互。&lt;/p&gt;
&lt;p&gt;Kubernetes中各模块通过标准的HTTP/HTTPS请求与API Server交互，通过认证和鉴权机制保证安全性，并利用Watch机制实现实时的资源状态监控与同步。&lt;/p&gt;
&lt;h2 id="kubelet-监控-worker-节点如何实现"&gt;kubelet 监控 Worker 节点如何实现
&lt;/h2&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux 内核
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cAdvisor 采集容器与节点指标
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubelet 处理、聚合、判断节点状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apiserver + metrics server 汇总
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl top / HPA / 调度器 决策
&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;h2 id="集群节点规模上千时的注意事项"&gt;集群节点规模上千时的注意事项
&lt;/h2&gt;&lt;p&gt;官方文档https://kubernetes.io/zh-cn/docs/setup/best-practices/cluster-large/&lt;/p&gt;
&lt;h2 id="kubeconfig-存放的内容"&gt;kubeconfig 存放的内容
&lt;/h2&gt;&lt;p&gt;有关集群、用户、命名空间和身份验证机制的信息&lt;/p&gt;
&lt;h2 id="kube-proxy-的作用"&gt;kube-proxy 的作用
&lt;/h2&gt;&lt;p&gt;核心职责 维护 Service 的转发规则
kube-proxy 监听 API Server 中 Service、Endpoints/EndpointSlice 的变化，在节点上维护 iptables 或 IPVS 规则，实现 Service 到后端 Pod 的流量转发。&lt;/p&gt;
&lt;h3 id="类型"&gt;类型
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;iptables：默认模式，使用 iptables 规则实现 Service 转发。&lt;/li&gt;
&lt;li&gt;IPVS：基于Linux 内核 IPVS 进行四层负载均衡，性能高，规则更新快。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scheduler-调度流程"&gt;Scheduler 调度流程
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;监听与获取 (Listen &amp;amp; Get)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Scheduler 监听 K8s API Server，发现未绑定到节点的 Pod&lt;/li&gt;
&lt;li&gt;通过 Informer 机制，从本地缓存获取 Pod 和 Node 的实时信息，提高效率&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;预选阶段 (Predicates/Filter)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;快速过滤掉不满足条件的节点，减少后续计算量&lt;/li&gt;
&lt;li&gt;节点资源（CPU, Memory）、Node Selector/Affinity/Anti-Affinity、Taints/Tolerations、Pod 预留等。得到一个通过所有过滤器的“候选节点”列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;优选阶段 (Priority)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;打分：为通过预选的节点打分，评估其“好坏”。&lt;/li&gt;
&lt;li&gt;节点资源利用率、负载均衡、拓扑位置（如优先同一机架/区域）。
结果: 得到一个按分数降序排列的节点列表&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="4"&gt;
&lt;li&gt;绑定阶段 (Bind)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;选择得分最高的节点&lt;/li&gt;
&lt;li&gt;将选择结果写入本地缓存 (Scheduler Cache)，记录资源占用，并尝试预留资源。&lt;/li&gt;
&lt;li&gt;异步调用 API Server，更新 Pod 的 spec.nodeName，将 Pod 绑定到选定节点。&lt;/li&gt;
&lt;li&gt;Kubelet 监听到 Pod 绑定事件后，开始创建容器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pod-的启动流程"&gt;Pod 的启动流程
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;用户通过kubectl或其他工具提交pod的yaml配置到API Server&lt;/li&gt;
&lt;li&gt;API Server 收到请求后，将配置存储到etcd中&lt;/li&gt;
&lt;li&gt;Scheduler 根据调度策略，将 Pod 绑定到合适的节点&lt;/li&gt;
&lt;li&gt;Kubelet 监听到 Pod 绑定事件后，开始创建容器
&lt;ul&gt;
&lt;li&gt;拉取镜像&lt;/li&gt;
&lt;li&gt;创建sandbox，sandbox中所有容器共享网络和存储命名空间&lt;/li&gt;
&lt;li&gt;调用容器运行时创建pod中的容器&lt;/li&gt;
&lt;li&gt;如果有init容器，kubelet先于应用容器启动他们&lt;/li&gt;
&lt;li&gt;aws-node 创建pod网卡，分配IP地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;容器启动后，Kubelet 向 API Server 发送状态更新&lt;/li&gt;
&lt;li&gt;API Server 收到更新后，将状态存储到etcd中&lt;/li&gt;
&lt;li&gt;用户通过kubectl或其他工具查询 Pod 状态时，API Server 从etcd中获取最新状态并返回&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pod-dns-解析失败排查"&gt;Pod DNS 解析失败排查
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;检查 Pod 内部和配置&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kubectl exec -it &lt;pod&gt; &amp;ndash; nslookup kubernetes.default 集群内部 DNS 故障&lt;/li&gt;
&lt;li&gt;kubectl exec -it &lt;pod&gt; &amp;ndash; curl &lt;a class="link" href="https://www.google.com" target="_blank" rel="noopener"
&gt;https://www.google.com&lt;/a&gt; 上游 DNS 或 CoreDNS 配置问题&lt;/li&gt;
&lt;li&gt;检查 DNS Policy：查看 Pod YAML，确保 dnsPolicy (如 ClusterFirst) 配置正确.
Default: Pod 从运行所在的节点继承域名解析配置
ClusterFirst: Pod 先从集群内部 DNS 解析，失败后再使用节点 DNS 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;检查coredns&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;检查core dns 负载&lt;/li&gt;
&lt;li&gt;检查coredns configmap forward&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;排查 kube-proxy
DNS 的流量是 Pod → kube-proxy → CoreDNS Pod&lt;/li&gt;
&lt;li&gt;检查 CNI 网络插件&lt;/li&gt;
&lt;li&gt;是否使用了 Istio / Linkerd / Envoy sidecar&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pod-的常见调度方式"&gt;Pod 的常见调度方式
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;默认调度器（Default Scheduler）&lt;/li&gt;
&lt;li&gt;节点选择器（Node Selector）&lt;/li&gt;
&lt;li&gt;亲和性和反亲和性（Affinity and Anti-Affinity）&lt;/li&gt;
&lt;li&gt;污点和容忍度（Taints and Tolerations）&lt;/li&gt;
&lt;li&gt;资源请求和限制（Resource Requests and Limits）&lt;/li&gt;
&lt;li&gt;Pod 拓扑调度（Pod Topology Spread）： 不同节点/机架均匀分布&lt;/li&gt;
&lt;li&gt;抢占调度（Preemption）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pause-容器的用途"&gt;Pause 容器的用途
&lt;/h2&gt;&lt;p&gt;Pause 容器唯一的作用是 保证即使 Pod 中没有任何容器运行也不会被删除，因为这时候还有 Pause 容器在运行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网络命名空间隔离&lt;/li&gt;
&lt;li&gt;进程隔离&lt;/li&gt;
&lt;li&gt;资源隔离&lt;/li&gt;
&lt;li&gt;生命周期管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pod-健康检查失败可能的原因和排查思路"&gt;Pod 健康检查失败可能的原因和排查思路
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;探针配置问题&lt;/li&gt;
&lt;li&gt;应用未启动/响应慢：超出initialDelaySeconds，进程退出 (CrashLoopBackOff)&lt;/li&gt;
&lt;li&gt;资源限制：CPU/内存不足，导致Kubelet无法正常运行检查&lt;/li&gt;
&lt;li&gt;网络问题：容器无法访问外部服务，如DNS解析失败&lt;/li&gt;
&lt;li&gt;依赖不可用： 数据库、缓存等依赖服务未就绪&lt;/li&gt;
&lt;li&gt;数据库、缓存等依赖服务未就绪&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;排查思路&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kubectl describe pod&lt;/li&gt;
&lt;li&gt;kubectl logs&lt;/li&gt;
&lt;li&gt;检查健康检查配置&lt;/li&gt;
&lt;li&gt;进入容器内部排查
&lt;ul&gt;
&lt;li&gt;使用curl, wget测试HTTP探针路径。&lt;/li&gt;
&lt;li&gt;netstat -tulnp或ss -tulnp确认端口是否监听&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;检查资源与节点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pod-之间访问不通怎么排查"&gt;Pod 之间访问不通怎么排查
&lt;/h2&gt;&lt;h2 id="pod-的几种常见状态"&gt;Pod 的几种常见状态
&lt;/h2&gt;&lt;p&gt;Pod Phase&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running&lt;/li&gt;
&lt;li&gt;Succeeded Job 完成、CronJob 完成&lt;/li&gt;
&lt;li&gt;Failed 程序崩溃、容器启动失败&lt;/li&gt;
&lt;li&gt;Pending 资源不足、NodeSelector 无匹配、拉镜像慢&lt;/li&gt;
&lt;li&gt;Unknown kubelet 无法上报状态，节点掉线、网络中断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建/调度相关&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ContainerCreating 容器正在创建容器，拉取镜像&lt;/li&gt;
&lt;li&gt;PodInitializing 容器正在初始化，执行 init 容器&lt;/li&gt;
&lt;li&gt;ImagePullBackOff 拉镜像失败（认证问题、镜像不存在）&lt;/li&gt;
&lt;li&gt;ErrImagePull 同上，比 BackOff 更早期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运行中异常&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CrashLoopBackOff 容器崩溃后，kubelet 会根据 backoff 策略（默认 10s 后重试）重启容器&lt;/li&gt;
&lt;li&gt;OOMKilled 容器内存超出限制，被 kubelet 强制kill&lt;/li&gt;
&lt;li&gt;BackOff 多次失败后进入退避（如 init 容器失败）&lt;/li&gt;
&lt;li&gt;CrashLoopBackOff 主容器不断崩溃重启&lt;/li&gt;
&lt;li&gt;CreateContainerConfigError 容器创建配置错误（如挂载卷不存在）&lt;/li&gt;
&lt;li&gt;Error 容器非0退出（但不一定重启策略触发失败）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;退出/终止&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terminating 容器正在终止（如删除 pod）&lt;/li&gt;
&lt;li&gt;Completed 容器正常退出（如主容器退出）&lt;/li&gt;
&lt;li&gt;Failed 容器非0退出，且重启策略为 Never&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRE面试题汇总 | Docker</title><link>https://hangliuc.github.io/topic/interview/docker/</link><pubDate>Sat, 06 Dec 2025 09:56:07 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/docker/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/docker_interview_cover.png" alt="Featured image of post SRE面试题汇总 | Docker" /&gt;&lt;h2 id="容器技术的基础原理"&gt;容器技术的基础原理
&lt;/h2&gt;&lt;p&gt;容器技术的基础原理是基于 Linux 内核的 Namespace、Cgroups、Rootfs、Capabilities 和 Seccomp 等机制。&lt;/p&gt;
&lt;p&gt;它主要解决了应用运行环境不一致的问题：将应用、依赖和配置打包为可复用的镜像，再以隔离的进程方式运行。&lt;/p&gt;
&lt;p&gt;容器镜像通常利用 Linux 的 Union FS 能力，将基础系统、运行库、应用文件和配置等内容以分层方式组织起来。容器启动时，运行时会把镜像层和可写层组合成容器的 Rootfs。&lt;/p&gt;
&lt;h2 id="如何减小-dockerfile-生成的镜像体积"&gt;如何减小 Dockerfile 生成的镜像体积？
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;使用更小的基础镜像&lt;/li&gt;
&lt;li&gt;将构建环境与运行环境分离，使用多阶段构建：&lt;/li&gt;
&lt;/ul&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&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-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 第一阶段：编译&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;golang:1.22-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; &lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; go build -trimpath -ldflags&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-s -w&amp;#34;&lt;/span&gt; -o /out/app .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="c"&gt;# 第二阶段：运行&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;alpine:3.19&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;builder /out/app /usr/local/bin/app&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&lt;/span&gt;&lt;span class="k"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/bin/app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&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;ul&gt;
&lt;li&gt;及时清理构建缓存和临时文件，并让 &lt;code&gt;apt&lt;/code&gt;、&lt;code&gt;yum&lt;/code&gt;、&lt;code&gt;apk&lt;/code&gt; 的缓存不要进入最终镜像层。例如 Debian/Ubuntu 可以使用 &lt;code&gt;--no-install-recommends&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;合并关联的 &lt;code&gt;RUN&lt;/code&gt; 指令，避免清理操作发生在下一层，导致缓存仍然保留在镜像历史中。&lt;/li&gt;
&lt;li&gt;最终运行阶段只复制必要的二进制文件、配置和证书，不要复制整个源码目录。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;.dockerignore&lt;/code&gt; 排除 &lt;code&gt;.git&lt;/code&gt;、测试数据、日志、构建产物和本地依赖等无关文件。&lt;/li&gt;
&lt;li&gt;根据程序依赖选择基础镜像。Alpine 不一定适合所有程序，使用 C/C++ 或 CGO 时要注意 musl/glibc 兼容性；使用 &lt;code&gt;scratch&lt;/code&gt; 或 distroless 时还要补充 CA 证书、时区等运行时文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="容器网络模式"&gt;容器网络模式
&lt;/h2&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;code&gt;bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认模式，容器拥有独立的 Network Namespace 和 IP，通过网桥通信；外部通常通过端口映射访问&lt;/td&gt;
&lt;td&gt;普通 Web 服务、微服务，最常用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;容器直接使用宿主机网络栈，没有独立的网络 Namespace，不经过常规 NAT&lt;/td&gt;
&lt;td&gt;对网络性能或端口可见性要求较高的场景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只保留 loopback，不配置外部网络，需要应用自行配置网络&lt;/td&gt;
&lt;td&gt;强隔离或自定义网络实验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;container:&amp;lt;name|id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;与另一个容器共享 Network Namespace，共享 IP、端口和 &lt;code&gt;localhost&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sidecar、多容器协作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;container&lt;/code&gt; 模式下，两个容器访问对方通常使用 &lt;code&gt;localhost&lt;/code&gt; 和共享端口，而不是把它们当成拥有两个独立 IP 的容器。&lt;/p&gt;
&lt;h2 id="docker镜像和-container-的区别"&gt;Docker、镜像和 container 的区别
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker / Docker Engine&lt;/strong&gt;：容器平台和容器引擎，负责镜像构建、容器创建与管理、网络、Volume 等能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;镜像（Image）&lt;/strong&gt;：只读的分层模板，包含应用程序及其依赖、文件系统和默认配置，本身不是正在运行的进程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器（Container）&lt;/strong&gt;：镜像启动后的运行实例，本质上是一组被 Namespace 和 Cgroups 隔离、限制和管理的进程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;containerd&lt;/strong&gt;：负责镜像传输与存储、容器生命周期等核心工作的容器运行时；Docker Engine 内部也会使用 containerd。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么-kubernetes-从-docker-engine-转向-containerd"&gt;为什么 Kubernetes 从 Docker Engine 转向 containerd？
&lt;/h2&gt;&lt;p&gt;Kubernetes 真正需要的是符合 CRI（Container Runtime Interface）的容器运行时，而 Docker Engine 是一个包含镜像构建、网络、Volume、Swarm 等能力的完整平台，并没有直接面向 kubelet 的原生 CRI 接口。&lt;/p&gt;
&lt;h3 id="架构层面的原因"&gt;架构层面的原因
&lt;/h3&gt;&lt;p&gt;使用 Docker Engine 时，kubelet 启动容器通常需要经过 dockershim 转换层：&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&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;kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 CRI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dockershim（Kubernetes 维护的 CRI 转换层）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 Docker Engine API
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Engine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 containerd API
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 OCI Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;runc（以 runc 为例）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─&amp;gt; 创建 Linux 容器（Namespace、Cgroups、Rootfs 等）
&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;ul&gt;
&lt;li&gt;Docker Engine 的很多平台能力对 kubelet 并不是必需的。&lt;/li&gt;
&lt;li&gt;dockershim 负责把 Kubernetes 的 CRI 调用转换为 Docker Engine API 调用，增加了维护成本和中间环节。&lt;/li&gt;
&lt;li&gt;真正创建 Linux 容器的通常仍是 containerd 加 OCI Runtime，例如 runc。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当 kubelet 直接通过 CRI 使用 containerd 时，调用链可以简化为：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&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;kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 CRI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd（CRI 插件）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 调用 OCI Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;runc（以 runc 为例）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─&amp;gt; 创建 Linux 容器（Namespace、Cgroups、Rootfs 等）
&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;h3 id="减少维护成本"&gt;减少维护成本
&lt;/h3&gt;&lt;p&gt;Kubernetes 1.24 移除了内置的 dockershim，不再在 Kubernetes 项目中维护 Docker Engine 的适配层。这里的含义不是 Kubernetes 强制所有集群使用 containerd，containerd、CRI-O 等符合 CRI 的运行时都可以使用；containerd 只是常见选择之一。&lt;/p&gt;
&lt;h3 id="性能与稳定性"&gt;性能与稳定性
&lt;/h3&gt;&lt;p&gt;直接使用 CRI 运行时可以减少适配层和组件数量，降低维护复杂度，并可能减少额外的调用开销。但实际性能和稳定性还取决于运行时版本、CNI、存储驱动、镜像配置和工作负载，不能简单认为“少一层调用”就一定带来显著性能提升。&lt;/p&gt;</description></item><item><title>科学上网</title><link>https://hangliuc.github.io/topic/scientific-internet/</link><pubDate>Fri, 05 Dec 2025 16:38:33 +0800</pubDate><guid>https://hangliuc.github.io/topic/scientific-internet/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/scientific_internet_cover.png" alt="Featured image of post 科学上网" /&gt;&lt;blockquote&gt;
&lt;p&gt;本文内容仅用于个人学习和访问公开技术资料。请遵守所在地区的法律法规，以及云服务商和网络服务商的使用条款。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="安装服务端3x-ui"&gt;安装服务端：3x-ui
&lt;/h2&gt;&lt;p&gt;当前使用 &lt;a class="link" href="https://github.com/MHSanaei/3x-ui" target="_blank" rel="noopener"
&gt;3x-ui&lt;/a&gt; 管理 Xray 服务。它提供 Web 控制面板，可以创建和管理 VMess、VLESS、Trojan、Shadowsocks、WireGuard 等多种协议，并生成客户端配置、二维码和订阅链接。&lt;/p&gt;
&lt;h3 id="安装"&gt;安装
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/MHSanaei/3x-ui" target="_blank" rel="noopener"
&gt;3x-ui GitHub 官方仓库&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="创建入站并获取客户端配置"&gt;创建入站并获取客户端配置
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;使用安装结果中的地址和凭据登录 3x-ui 面板。&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;入站 (Inbounds)&lt;/strong&gt;，新建一个入站配置。本文以 &lt;strong&gt;VMess&lt;/strong&gt; 为例；端口、UUID、传输方式以及 TLS/Reality 等参数按自己的域名和服务器配置填写。&lt;/li&gt;
&lt;li&gt;保存配置后，在客户端列表中复制订阅链接，或使用面板生成的二维码、分享链接。&lt;/li&gt;
&lt;li&gt;将订阅链接或二维码导入客户端。客户端连接参数必须与 3x-ui 面板中的入站配置完全一致。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;订阅链接、服务器地址、端口和 UUID 都属于敏感配置，不要提交到公开仓库、博客或聊天群。如果订阅链接已经泄露，请在面板中重新生成或撤销对应客户端。&lt;/p&gt;
&lt;h2 id="客户端使用"&gt;客户端使用
&lt;/h2&gt;&lt;h3 id="ios"&gt;iOS
&lt;/h3&gt;&lt;p&gt;客户端选择和下载可参考 &lt;a class="link" href="https://itlanyan.com/v2ray-clients-download/" target="_blank" rel="noopener"
&gt;V2Ray 客户端整理&lt;/a&gt;。当前使用 V2Box 时，中国区 App Store 可能无法直接下载，需要根据自己的账号地区选择可用客户端，并遵守相关服务条款。&lt;/p&gt;
&lt;p&gt;配置方式优先选择从 3x-ui 导出的二维码或分享链接直接导入。手动添加时，可以按以下方式填写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;协议 (Protocol)&lt;/strong&gt;：选择 &lt;code&gt;VMess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务器、端口、UUID&lt;/strong&gt;：填写 3x-ui 入站配置中的值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输方式、TLS、Host、Path 等&lt;/strong&gt;：与面板生成的客户端配置保持一致&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;导入完成后，选择该配置并连接；不要把服务器管理面板的用户名和密码填入客户端。&lt;/p&gt;
&lt;h3 id="android"&gt;Android
&lt;/h3&gt;&lt;p&gt;推荐使用 &lt;a class="link" href="https://github.com/MatsuriDayo/NekoBoxForAndroid" target="_blank" rel="noopener"
&gt;NekoBoxForAndroid&lt;/a&gt;，也可以从其 &lt;a class="link" href="https://github.com/MatsuriDayo/NekoBoxForAndroid/releases" target="_blank" rel="noopener"
&gt;Releases 页面&lt;/a&gt; 下载对应版本。&lt;/p&gt;
&lt;p&gt;打开 NekoBox 后，可以通过二维码、&lt;code&gt;vmess://&lt;/code&gt; 分享链接或订阅链接导入配置。导入后选择节点，启动 VPN，并访问一个可信的测试页面确认连接是否正常。&lt;/p&gt;
&lt;h3 id="macos"&gt;macOS
&lt;/h3&gt;&lt;p&gt;推荐使用 &lt;a class="link" href="https://github.com/clash-verge-rev/clash-verge-rev" target="_blank" rel="noopener"
&gt;Clash Verge Rev&lt;/a&gt;，安装包位于其 &lt;a class="link" href="https://github.com/clash-verge-rev/clash-verge-rev/releases" target="_blank" rel="noopener"
&gt;Releases 页面&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;使用 3x-ui 订阅时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 3x-ui 面板中复制客户端订阅链接。&lt;/li&gt;
&lt;li&gt;在 Clash Verge Rev 的 &lt;strong&gt;订阅&lt;/strong&gt; 页面，将链接粘贴到“订阅文件链接”输入框。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;新建&lt;/strong&gt; 或导入，等待配置下载完成。&lt;/li&gt;
&lt;li&gt;更新订阅后，选择对应配置，并在 &lt;strong&gt;代理&lt;/strong&gt; 页面选择节点。&lt;/li&gt;
&lt;li&gt;根据需要开启系统代理，选择规则模式或全局模式，然后访问可信网站测试。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果只有单条 VMess 链接而没有 Clash 订阅，可使用 &lt;a class="link" href="https://sub.cmliussss.com/" target="_blank" rel="noopener"
&gt;在线订阅转换工具&lt;/a&gt; 转换格式。订阅链接通常包含访问凭据，在线转换前应确认服务可信；更稳妥的方式是使用本地转换工具，并在使用临时订阅后及时撤销旧链接。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;旧版 &lt;a class="link" href="https://itlanyan.com/v2ray-tutorial/" target="_blank" rel="noopener"
&gt;V2Ray 搭建教程&lt;/a&gt;：仅作背景参考，当前服务端安装以 3x-ui 官方文档为准。&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/MHSanaei/3x-ui" target="_blank" rel="noopener"
&gt;3x-ui 官方仓库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRE面试题汇总 | Monitoring</title><link>https://hangliuc.github.io/topic/interview/monitoring/</link><pubDate>Fri, 05 Dec 2025 13:38:56 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/monitoring/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/monitoring_interview_cover.png" alt="Featured image of post SRE面试题汇总 | Monitoring" /&gt;&lt;h2 id="监控指标类型及应用场景"&gt;监控指标类型及应用场景
&lt;/h2&gt;&lt;p&gt;Prometheus 中常见的指标类型包括 Counter、Gauge、Histogram 和 Summary。选择指标类型时，要结合指标是否单调递增、是否需要聚合，以及是否需要计算分位数来判断。&lt;/p&gt;
&lt;h3 id="counter计数器"&gt;Counter：计数器
&lt;/h3&gt;&lt;p&gt;用于记录请求次数、错误次数、完成任务数等事件数量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特点：在单个进程生命周期内单调递增，只能增加不能减少；进程重启后通常会从 0 重新开始，Prometheus 的 &lt;code&gt;rate&lt;/code&gt;、&lt;code&gt;increase&lt;/code&gt; 等函数可以处理这类 Counter 重置。&lt;/li&gt;
&lt;li&gt;场景：请求总数、错误总数、已完成任务总数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gauge计量器"&gt;Gauge：计量器
&lt;/h3&gt;&lt;p&gt;用于记录某一时刻的数值，例如内存使用量、CPU 使用率、磁盘空间和队列长度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特点：可以增加，也可以减少，数值会随时间上下变化。&lt;/li&gt;
&lt;li&gt;场景：CPU、内存、磁盘、网络流量、在线人数、队列长度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="histogram直方图"&gt;Histogram：直方图
&lt;/h3&gt;&lt;p&gt;用于记录请求延迟、响应大小等样本的分布情况。应用需要预先定义 bucket，例如 10ms、50ms、100ms 和 500ms，Prometheus 根据 bucket 在服务端计算分位数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以聚合多个实例的 bucket，计算整个服务的全局 p95、p99。&lt;/li&gt;
&lt;li&gt;适合业务接口延迟、任务耗时和响应大小等分布监控。&lt;/li&gt;
&lt;/ul&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&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-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;histogram_quantile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;le&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_request_duration_seconds_bucket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h3 id="summary摘要"&gt;Summary：摘要
&lt;/h3&gt;&lt;p&gt;Summary 不需要预先定义 bucket，而是在客户端或应用进程内维护 quantile，并将计算结果暴露给 Prometheus。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适合每个实例独立统计的场景。&lt;/li&gt;
&lt;li&gt;不适合聚合跨实例的全局分位数。例如 10 个 Pod 各自暴露 p99，Prometheus 不能直接对这 10 个 p99 再计算出整个服务的准确 p99。&lt;/li&gt;
&lt;li&gt;Summary 的 &lt;code&gt;_sum&lt;/code&gt; 和 &lt;code&gt;_count&lt;/code&gt; 可以参与聚合计算平均值，但分位数本身通常不能直接聚合。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生产环境中，如果需要计算整个服务的全局分位数，通常优先选择 Histogram；如果只关心单个实例的本地分布，Summary 也可以使用。&lt;/p&gt;
&lt;h2 id="黄金指标"&gt;黄金指标
&lt;/h2&gt;&lt;p&gt;常见的四类黄金指标是 Latency、Traffic、Errors 和 Saturation：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;延迟（Latency）&lt;/strong&gt;：请求从开始到结束耗费的时间，通常关注 p50、p95、p99。&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-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;histogram_quantile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;le&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_request_duration_seconds_bucket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流量（Traffic）&lt;/strong&gt;：系统承载的请求量或业务量，常用 QPS 表示。&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-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_requests_total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;错误率（Error Rate）&lt;/strong&gt;：失败请求占总请求的比例。&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&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-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_requests_total&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=~&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;5..&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_requests_total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;饱和度（Saturation）&lt;/strong&gt;：资源接近容量上限的程度，例如 CPU、内存、连接池、线程池和队列的使用情况。具体 PromQL 要根据采集的指标定义，不能只用一个通用表达式代替所有资源。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rate-与-irate-的区别"&gt;rate 与 irate 的区别
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rate&lt;/code&gt;：根据指定时间窗口内的多个样本计算平均每秒增长率，结果更平滑，适合趋势分析和告警。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;irate&lt;/code&gt;：只使用时间窗口内最后两个样本计算瞬时增长率，对短期突发变化非常敏感，适合实时看板或快速观察突发流量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;告警通常优先使用 &lt;code&gt;rate&lt;/code&gt;，并结合较短的 &lt;code&gt;for&lt;/code&gt; 持续时间减少误报。&lt;code&gt;irate&lt;/code&gt; 并不是绝对不能用于告警，但需要确认采样间隔、窗口长度和业务波动都适合，否则容易因单个采样点抖动而频繁触发。&lt;/p&gt;
&lt;h2 id="如何对采集指标进行过滤"&gt;如何对采集指标进行过滤？
&lt;/h2&gt;&lt;p&gt;在 Prometheus 或 vmagent 中，常见的过滤位置如下：&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&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;Exporter / Kubernetes / AWS 云监控
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vmagent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ relabel_configs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 抓取前，处理 Target 标签和目标地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 发起 HTTP 请求抓取 /metrics
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ metric_relabel_configs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 抓取后，处理每条时序样本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ write_relabel_configs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Remote Write 发送前，过滤即将写出的时序
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vminsert
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vmstorage
&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;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;relabel_configs&lt;/code&gt;&lt;/strong&gt;：发生在抓取前，常用于修改目标标签、替换地址、按环境过滤 Target。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;metric_relabel_configs&lt;/code&gt;&lt;/strong&gt;：发生在抓取后，作用于每条指标，适合丢弃不需要写入的高基数指标或标签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;write_relabel_configs&lt;/code&gt;&lt;/strong&gt;：发生在 Remote Write 发送前，可按目标远程存储过滤时序。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;过滤规则要谨慎使用，尤其要关注高基数标签、误删核心指标以及规则变更后的数据缺口。&lt;/p&gt;
&lt;h2 id="prometheus-服务发现方式"&gt;Prometheus 服务发现方式
&lt;/h2&gt;&lt;p&gt;Service Discovery（SD）用于自动发现需要抓取的 Target。常见方式包括静态配置、文件服务发现、Kubernetes SD、Consul SD 和云厂商 SD。&lt;/p&gt;
&lt;h3 id="静态配置"&gt;静态配置
&lt;/h3&gt;&lt;p&gt;适合 Target 数量少、地址变化不频繁的场景：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h3 id="file-sd文件服务发现"&gt;File SD：文件服务发现
&lt;/h3&gt;&lt;p&gt;由外部系统生成 JSON 或 YAML 文件，Prometheus 定期读取文件中的 Target：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;file_sd_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/prometheus/*.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h3 id="kubernetes-sd"&gt;Kubernetes SD
&lt;/h3&gt;&lt;p&gt;Prometheus 通过 Kubernetes API 发现 Pod、Service、Node 等对象，再配合 relabel 选择需要抓取的目标：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubernetes-pods&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;honor_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kubernetes_sd_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;实际使用时还需要配置 Kubernetes API 访问权限，并通过 &lt;code&gt;relabel_configs&lt;/code&gt; 过滤 Namespace、Annotation 或 Label。&lt;/p&gt;
&lt;h3 id="consul-sd"&gt;Consul SD
&lt;/h3&gt;&lt;p&gt;服务注册到 Consul 后，Prometheus 根据服务标签和健康状态自动发现目标：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;consul-services&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consul_sd_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.151.91.180&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8500&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datacenter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dc1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h3 id="aws-ec2-sd"&gt;AWS EC2 SD
&lt;/h3&gt;&lt;p&gt;在 AWS 环境中可以通过 EC2 服务发现获取实例信息，通常使用实例角色提供权限，避免把 Access Key 直接写入配置文件：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ec2-node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ec2_sd_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ap-southeast-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;h2 id="target-监控不到如何排查"&gt;Target 监控不到如何排查？
&lt;/h2&gt;&lt;p&gt;先从 Prometheus 的 &lt;code&gt;/targets&lt;/code&gt; 页面或 API 查看 Target 处于哪一种状态：&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://prometheus:9090/api/v1/targets
&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;h3 id="target-不存在"&gt;Target 不存在
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;检查 &lt;code&gt;static_configs&lt;/code&gt;、File SD 文件和服务发现配置是否生效。&lt;/li&gt;
&lt;li&gt;检查 Prometheus 或 vmagent 是否有权限访问 Kubernetes API、Consul 或云厂商 API。&lt;/li&gt;
&lt;li&gt;检查 &lt;code&gt;relabel_configs&lt;/code&gt; 是否误删了 Target，尤其是 &lt;code&gt;action: drop&lt;/code&gt; 和 &lt;code&gt;action: keep&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果使用 File SD，确认文件路径、JSON/YAML 格式和文件权限正确。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="target-存在但状态为-down"&gt;Target 存在但状态为 DOWN
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;从 Prometheus 或 vmagent 所在的 Pod/主机执行 &lt;code&gt;curl&lt;/code&gt;，确认目标地址和端口可达。&lt;/li&gt;
&lt;li&gt;检查 &lt;code&gt;metrics_path&lt;/code&gt;、&lt;code&gt;scheme&lt;/code&gt;、端口、HTTP 认证和 TLS 证书配置。&lt;/li&gt;
&lt;li&gt;检查安全组、防火墙、NetworkPolicy、Service 和 Endpoints 是否放行流量。&lt;/li&gt;
&lt;li&gt;查看 Target 的 &lt;code&gt;Last Error&lt;/code&gt;，区分连接拒绝、连接超时、DNS 失败、TLS 失败和返回非 2xx。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="target-up-但查询不到指标"&gt;Target UP 但查询不到指标
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;直接访问目标的 &lt;code&gt;/metrics&lt;/code&gt;，确认指标确实被应用或 Exporter 暴露。&lt;/li&gt;
&lt;li&gt;检查 &lt;code&gt;metric_relabel_configs&lt;/code&gt; 或 Remote Write 过滤规则是否丢弃了指标。&lt;/li&gt;
&lt;li&gt;检查 PromQL 中的指标名、Label、时间范围和数据源是否正确。&lt;/li&gt;
&lt;li&gt;检查 Grafana 数据源、远程存储写入链路和数据保留策略。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;排障时要先确认“Target 是否存在”，再确认“是否能抓取”，最后确认“指标是否被写入和查询”，不要一开始就只看 Grafana 面板。&lt;/p&gt;</description></item><item><title>SRE面试题汇总 | Network</title><link>https://hangliuc.github.io/topic/interview/network/</link><pubDate>Thu, 04 Dec 2025 19:36:01 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/network/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/network_interview_cover.png" alt="Featured image of post SRE面试题汇总 | Network" /&gt;&lt;h2 id="osi-七层模型"&gt;OSI 七层模型
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;发送端（电脑A） 接收端（电脑B）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------+ +----------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 应用层：Data | | 应用层：Data |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &amp;#34;Hi&amp;#34; | | &amp;#34;Hi&amp;#34; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 表示层：Data + 表示头 表示层：Data（剥离表示头）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 会话层：Data + 会话头 会话层：Data（剥离会话头）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 传输层：Segment（Data + 端口头） 传输层：Data（剥离端口头）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 网络层：Packet（Segment + IP头） 网络层：Segment（剥离IP头）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 数据链路层：Frame（Packet + MAC头 + CRC）数据链路层：Packet（剥离MAC头+CRC）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 物理层：Bits（Frame转换） 物理层：Frame（Bits转换）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------+--------+ +-------^--------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 物理介质（网线/无线）
&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;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OSI 层&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;/td&gt;
&lt;td&gt;提供应用程序之间的通信&lt;/td&gt;
&lt;td&gt;浏览器、FTP客户端、SMTP客户端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;管理会话连接&lt;/td&gt;
&lt;td&gt;会话ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传输层&lt;/td&gt;
&lt;td&gt;端到端通信&lt;/td&gt;
&lt;td&gt;TCP、UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络层&lt;/td&gt;
&lt;td&gt;跨网络路由与 IP 地址识别&lt;/td&gt;
&lt;td&gt;路由器、三层交换机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据链路层&lt;/td&gt;
&lt;td&gt;帧传输与 MAC 地址识别&lt;/td&gt;
&lt;td&gt;网卡、交换机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;物理层&lt;/td&gt;
&lt;td&gt;比特流传输&lt;/td&gt;
&lt;td&gt;网线、光纤&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="http11-和-http2-的区别"&gt;HTTP/1.1 和 HTTP/2 的区别
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;HTTP/1.1&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;HTTP/1.1 管线化实践有限，通常需要多个连接并行请求&lt;/td&gt;
&lt;td&gt;单个 TCP 连接上可以同时承载多个数据流，减少队头阻塞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;不压缩或简单压缩，冗余信息多&lt;/td&gt;
&lt;td&gt;使用 HPACK 压缩，减少冗余，提高加载速度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="tcp-协议"&gt;TCP 协议
&lt;/h2&gt;&lt;h3 id="tcp-的连接状态"&gt;TCP 的连接状态
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;ESTABLISHED&lt;/code&gt; 的字面含义是“已建立、已确立”。在 TCP 状态机中，它表示三次握手已经完成，双方可以正常收发数据，并不表示连接已经建立了很长时间或已经投入使用很久。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hangliuc.github.io/topic/interview/network/tcp_netstat.webp"
width="1600"
height="494"
srcset="https://hangliuc.github.io/topic/interview/network/tcp_netstat_hu_6a5f765682e47419.webp 480w, https://hangliuc.github.io/topic/interview/network/tcp_netstat_hu_217ce285f570315.webp 1024w"
loading="lazy"
alt="TCP 连接状态图"
class="gallery-image"
data-flex-grow="323"
data-flex-basis="777px"
&gt;&lt;/p&gt;
&lt;p&gt;下面这张图补充了 TCP 从建立连接到关闭连接的主要状态变化：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hangliuc.github.io/topic/interview/network/tcp_state_transition.png"
width="473"
height="484"
srcset="https://hangliuc.github.io/topic/interview/network/tcp_state_transition_hu_76b978733a73188d.png 480w, https://hangliuc.github.io/topic/interview/network/tcp_state_transition_hu_29f63eb82c51d8d0.png 1024w"
loading="lazy"
alt="TCP 建连与断连状态转换"
class="gallery-image"
data-flex-grow="97"
data-flex-basis="234px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;建立连接&lt;/strong&gt;：客户端从 &lt;code&gt;SYN_SENT&lt;/code&gt; 开始，服务器从 &lt;code&gt;LISTEN&lt;/code&gt; 进入 &lt;code&gt;SYN_RCVD&lt;/code&gt;；第三次握手完成后，双方都进入 &lt;code&gt;ESTABLISHED&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主动关闭的一方&lt;/strong&gt;：通常依次经历 &lt;code&gt;FIN_WAIT_1&lt;/code&gt;、&lt;code&gt;FIN_WAIT_2&lt;/code&gt;、&lt;code&gt;TIME_WAIT&lt;/code&gt;，最后进入 &lt;code&gt;CLOSED&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;被动关闭的一方&lt;/strong&gt;：收到 FIN 后进入 &lt;code&gt;CLOSE_WAIT&lt;/code&gt;，应用关闭连接后发送 FIN，再进入 &lt;code&gt;LAST_ACK&lt;/code&gt;，收到 ACK 后进入 &lt;code&gt;CLOSED&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;TIME_WAIT&lt;/code&gt;&lt;/strong&gt;：主动关闭方为确保最后的 ACK 能够重传，并让旧报文在网络中自然过期而暂时保留连接状态，通常持续约两个最大报文段寿命（2MSL）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="客户端出现大量-time_wait-的原因"&gt;客户端出现大量 &lt;code&gt;TIME_WAIT&lt;/code&gt; 的原因
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;短连接过多&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Keep-Alive 未开启&lt;/li&gt;
&lt;li&gt;使用 HTTP/1.0 或 &lt;code&gt;Connection: close&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;数据库、Redis、RPC 连接池没有复用&lt;/li&gt;
&lt;li&gt;连接池配置过小或配置错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求量或连接创建速率很高&lt;/strong&gt;，例如高 QPS 场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超时、重试或熔断配置不合理&lt;/strong&gt;，导致连接反复建立和关闭。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负载均衡代理配置不合理&lt;/strong&gt;，例如负载均衡器、Nginx 或网关的 &lt;code&gt;idle timeout&lt;/code&gt; 不匹配，导致连接频繁断开和重建。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="为什么-tcp-是三次握手"&gt;为什么 TCP 是三次握手
&lt;/h3&gt;&lt;p&gt;TCP 三次握手的目的，是在正式传输数据之前，让通信双方确认彼此具备收发能力，并协商连接参数（如初始序列号），建立可靠连接。&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Client Server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="l"&gt;SYN(seq=100)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nn"&gt;---&lt;/span&gt;-------------------------&lt;span class="l"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SYN(seq=500)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ACK=101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="l"&gt;&amp;lt;----------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="l"&gt;ACK=501&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="nn"&gt;---&lt;/span&gt;-------------------------&lt;span class="l"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="l"&gt;Connection Established&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;第一次握手，客户端发送 SYN 报文，请求建立连接，并携带自己的初始序列号。&lt;/p&gt;
&lt;p&gt;第二次握手，服务器收到后返回 SYN+ACK，一方面确认客户端的 SYN，另一方面发送自己的初始序列号。&lt;/p&gt;
&lt;p&gt;第三次握手，客户端发送 ACK，确认服务器的 SYN。至此，双方进入 &lt;code&gt;ESTABLISHED&lt;/code&gt; 状态，可以开始可靠的数据传输。&lt;/p&gt;
&lt;h4 id="为什么不是-2-次握手"&gt;为什么不是 2 次握手
&lt;/h4&gt;&lt;p&gt;两次握手只能让服务器确认收到了客户端的 SYN，不能让客户端确认服务器已经收到自己的报文，也不能让服务器确认客户端已经收到了自己的 SYN+ACK。若网络中存在延迟到达的旧 SYN，服务器还可能为一个实际上已经失效的请求分配连接资源，形成半连接或错误连接。&lt;/p&gt;
&lt;h4 id="为什么不是-4-次或更多"&gt;为什么不是 4 次或更多？
&lt;/h4&gt;&lt;p&gt;3 次已经足以建立连接，4 次或更多次握手会增加复杂性和资源浪费&lt;/p&gt;
&lt;h3 id="tcp-的核心特点"&gt;TCP 的核心特点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;面向连接&lt;/li&gt;
&lt;li&gt;保证数据可靠到达&lt;/li&gt;
&lt;li&gt;具有重传机制&lt;/li&gt;
&lt;li&gt;保证数据有序&lt;/li&gt;
&lt;li&gt;具有流量控制&lt;/li&gt;
&lt;li&gt;具有拥塞控制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="udp-的核心特点"&gt;UDP 的核心特点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;无连接&lt;/li&gt;
&lt;li&gt;不保证送达&lt;/li&gt;
&lt;li&gt;通常不负责重传&lt;/li&gt;
&lt;li&gt;延迟较低、开销较小&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="什么是滑动窗口"&gt;什么是滑动窗口？
&lt;/h3&gt;&lt;p&gt;发送方不需要每发送一个数据段就等待 ACK，而是可以在窗口允许的范围内连续发送多个数据段。接收方通过 ACK 和接收窗口（&lt;code&gt;rwnd&lt;/code&gt;）通知发送方哪些数据已经收到、还能接收多少数据，发送窗口会随着 ACK 的到来不断向前滑动，因此称为滑动窗口。&lt;/p&gt;
&lt;p&gt;实际可发送的数据量还会受到拥塞窗口（&lt;code&gt;cwnd&lt;/code&gt;）的限制，因此有效发送窗口通常取 &lt;code&gt;min(rwnd, cwnd)&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="dns-解析流程"&gt;DNS 解析流程
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端访问域名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;例如：www.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 查询浏览器 DNS 缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 返回 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 未命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 查询操作系统 DNS 缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 返回 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 未命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 查询 hosts 文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Linux：/etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Windows：hosts 文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 返回 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 未命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 向配置的 DNS Resolver 发起查询
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /etc/resolv.conf 中的 nameserver
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 例如本地路由器、运营商 DNS、公共 DNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. DNS Resolver 查询自身缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 根据 TTL 返回 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 未命中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. DNS 迭代查询
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 根 DNS 服务器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 顶级域 DNS 服务器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 例如：.com、.cn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 权威 DNS 服务器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 例如：Route &lt;span class="m"&gt;53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 获得域名对应的 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7. Resolver 将结果返回客户端
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 同时根据 TTL 进行缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8. 客户端拿到 IP 地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9. 发起 TCP 三次握手
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10. 建立连接并开始传输数据
&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;Route 53 可能位于流程中的两环：&lt;/p&gt;
&lt;p&gt;在公网域名解析流程中，Route 53 通常位于：权威 DNS 服务器（迭代查询）&lt;/p&gt;
&lt;p&gt;Route 53 VPC Resolver：递归 DNS Resolver（/etc/resolv.conf）&lt;/p&gt;
&lt;h2 id="cookiesessiontoken"&gt;Cookie、Session、Token
&lt;/h2&gt;&lt;p&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;th&gt;典型特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cookie&lt;/td&gt;
&lt;td&gt;客户端浏览器&lt;/td&gt;
&lt;td&gt;浏览器按域名和路径自动携带&lt;/td&gt;
&lt;td&gt;适合浏览器会话；可设置 &lt;code&gt;HttpOnly&lt;/code&gt;、&lt;code&gt;Secure&lt;/code&gt;、&lt;code&gt;SameSite&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;服务端，客户端通常只保存 Session ID&lt;/td&gt;
&lt;td&gt;Session ID 通常放在 Cookie 中&lt;/td&gt;
&lt;td&gt;服务端保存状态，便于主动失效，但需要处理共享存储或会话粘滞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;通常由客户端保存，服务端负责校验&lt;/td&gt;
&lt;td&gt;常放在 &lt;code&gt;Authorization&lt;/code&gt; 请求头中&lt;/td&gt;
&lt;td&gt;适合 API、移动端和服务间认证；可设计为无状态或配合服务端存储&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Cookie、Session、Token 的安全性都取决于具体实现，Token 并不天然加密。JWT 默认是编码和签名，不能把其中的内容当作机密数据；需要保密时应使用加密或避免放入敏感信息。&lt;/li&gt;
&lt;li&gt;Cookie 不是“天然不安全”：认证 Cookie 通常应设置 &lt;code&gt;HttpOnly&lt;/code&gt;、&lt;code&gt;Secure&lt;/code&gt; 和合适的 &lt;code&gt;SameSite&lt;/code&gt;，同时防范 CSRF 和 XSS。&lt;/li&gt;
&lt;li&gt;Token 也不是天然支持跨域。跨域请求仍受 CORS、Cookie 的 &lt;code&gt;SameSite&lt;/code&gt;/&lt;code&gt;Domain&lt;/code&gt;、请求头配置等规则约束；使用 &lt;code&gt;localStorage&lt;/code&gt; 保存 Token 时，还要重点防范 XSS。&lt;/li&gt;
&lt;li&gt;Cookie 常用于登录状态、用户偏好和会话保持；Session 适合购物车、表单流程等服务端状态较多的场景；Token 常用于 API 访问控制、SSO 和移动应用认证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="http-状态码和原因"&gt;HTTP 状态码和原因
&lt;/h2&gt;&lt;p&gt;一些高频考察的状态码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;200 OK&lt;/code&gt;：请求成功。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;201 Created&lt;/code&gt;：资源创建成功，常见于 &lt;code&gt;POST&lt;/code&gt; 请求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;301 Moved Permanently&lt;/code&gt;：资源已永久移动，常用于域名或 URL 迁移。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;302 Found&lt;/code&gt;：临时重定向，常用于登录跳转；具体语义还要结合请求方法和客户端行为判断。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;400 Bad Request&lt;/code&gt;：请求格式、参数或协议不符合要求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;401 Unauthorized&lt;/code&gt;：未认证或认证信息无效；不是“没有权限”的唯一表示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;403 Forbidden&lt;/code&gt;：服务器理解请求，但拒绝执行，例如 Token 有效但权限不足。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;404 Not Found&lt;/code&gt;：请求的资源不存在，或服务端不希望暴露其是否存在。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt;：请求频率超过限制。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;：服务端发生未被更具体状态码描述的异常。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;502 Bad Gateway&lt;/code&gt;：网关或反向代理从上游服务收到无效响应，或无法正确解析上游响应。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;503 Service Unavailable&lt;/code&gt;：服务暂时不可用，可能处于过载、维护或没有可用实例的状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;504 Gateway Timeout&lt;/code&gt;：网关等待上游响应超时。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔥502、503、504的区别&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;网关 / Nginx / Load Balancer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;上游服务
&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;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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端请求
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;网关连接上游
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 上游连接失败或返回非法响应
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 502
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 没有健康的上游实例
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 503
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 上游处理很慢，超过网关超时时间
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 504
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 正常返回
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 返回上游实际响应
&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;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;502 Bad Gateway&lt;/td&gt;
&lt;td&gt;网关从上游收到无效响应&lt;/td&gt;
&lt;td&gt;上游进程崩溃、连接被重置、响应格式错误、协议或 TLS 握手异常&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503 Service Unavailable&lt;/td&gt;
&lt;td&gt;当前没有可用服务处理请求&lt;/td&gt;
&lt;td&gt;服务过载、正在发布、实例全部不健康、线程池/连接池耗尽、限流或熔断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;504 Gateway Timeout&lt;/td&gt;
&lt;td&gt;网关等待上游响应超时&lt;/td&gt;
&lt;td&gt;上游处理太慢、数据库查询慢、网络延迟、网关超时时间过短&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="linux-网络丢包排查"&gt;Linux 网络丢包排查
&lt;/h2&gt;&lt;p&gt;排查链路：&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;应用 → 系统调用 → Linux 网络栈 → 网卡队列 → 云网络 → 外部链路 → 对端
&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;h3 id="从应用和连接现象开始"&gt;从应用和连接现象开始
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;查看应用日志，确认是连接超时、连接被拒绝、读超时，还是接口 QPS 突增。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;wget&lt;/code&gt; 或业务客户端复现，区分 DNS、TCP、TLS 和 HTTP 哪一层失败。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;ss&lt;/code&gt; 查看连接状态，用 &lt;code&gt;tcpdump&lt;/code&gt; 验证报文是否发出、是否收到响应：&lt;/li&gt;
&lt;/ul&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ss -s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ss -antp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tcpdump -i eth0 host &amp;lt;peer-ip&amp;gt; -w app.pcap
&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;h3 id="检查网卡内核网络栈和-cpu"&gt;检查网卡、内核网络栈和 CPU
&lt;/h3&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip -s link show dev eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ethtool -S eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ethtool -g eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netstat -s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nstat -az
&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;
&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;code&gt;rx_dropped&lt;/code&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;code&gt;rx_errors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;接收错误&lt;/td&gt;
&lt;td&gt;CRC、帧格式或驱动错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tx_errors&lt;/code&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;code&gt;rx_no_buffer&lt;/code&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;code&gt;rx_over_errors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;接收队列溢出&lt;/td&gt;
&lt;td&gt;CPU、软中断或队列处理能力不足&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;检查内核队列和 TCP 缓冲区：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.core.netdev_max_backlog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.core.rmem_default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.core.wmem_default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.ipv4.tcp_rmem
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl net.ipv4.tcp_wmem
&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;如果丢包伴随 CPU 较高，还要观察软中断和网卡多队列配置：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mpstat -P ALL &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/interrupts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ethtool -l eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ethtool -k eth0
&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;h3 id="检查路由防火墙和网络路径"&gt;检查路由、防火墙和网络路径
&lt;/h3&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip addr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip route get &amp;lt;target-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip neigh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ping -c &lt;span class="m"&gt;4&lt;/span&gt; &amp;lt;target-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mtr -rwzbc &lt;span class="m"&gt;100&lt;/span&gt; &amp;lt;target-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;traceroute &amp;lt;target-ip&amp;gt;
&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;code&gt;ping&lt;/code&gt; 或 &lt;code&gt;mtr&lt;/code&gt; 丢包不一定代表业务 TCP 丢包，部分设备会限制 ICMP 或降低 ICMP 优先级，最终仍应结合业务端口和抓包判断。&lt;/p&gt;
&lt;p&gt;检查端口监听、防火墙和连接跟踪：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ss -lntp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nft list ruleset
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo iptables -L -n -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo conntrack -S
&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;h3 id="用抓包定位丢包位置"&gt;用抓包定位丢包位置
&lt;/h3&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 本机抓取指定主机和端口的报文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tcpdump -i eth0 -nn host &amp;lt;peer-ip&amp;gt; and port &lt;span class="m"&gt;443&lt;/span&gt; -w local.pcap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只看 TCP 握手、重传和连接关闭相关信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tcpdump -i eth0 -nn &lt;span class="s1"&gt;&amp;#39;tcp[tcpflags] &amp;amp; (tcp-syn|tcp-fin|tcp-rst) != 0&amp;#39;&lt;/span&gt;
&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;
&lt;h3 id="其他常用工具"&gt;其他常用工具
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sar -n DEV 1&lt;/code&gt;：查看网卡吞吐和错误统计。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sar -n TCP,ETCP 1&lt;/code&gt;：观察 TCP 建连、重传和失败情况。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iperf3&lt;/code&gt;：在两台受控主机之间验证带宽、延迟和吞吐能力。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ethtool&lt;/code&gt;：查看网卡协商、Ring Buffer、Offload 和硬件统计。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见网络排查命令"&gt;常见网络排查命令
&lt;/h2&gt;&lt;p&gt;上面的内容是按丢包链路排查，下面按命令类别整理一份面试和实际排障时常用的速查表。&lt;/p&gt;
&lt;h3 id="网卡ip路由"&gt;网卡、IP、路由
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip addr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看网卡和 IP&lt;/td&gt;
&lt;td&gt;IP、子网、网卡状态&lt;/td&gt;
&lt;td&gt;IP 配置错误、网卡未启用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看网卡链路状态&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UP&lt;/code&gt;、&lt;code&gt;DOWN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;网卡或链路故障&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip route&lt;/code&gt;&lt;/td&gt;
&lt;td&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;code&gt;ip route get 8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看访问目标 IP 的实际路径&lt;/td&gt;
&lt;td&gt;出口网卡、网关、源 IP&lt;/td&gt;
&lt;td&gt;流量走错出口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip neigh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 ARP 邻居&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REACHABLE&lt;/code&gt;、&lt;code&gt;FAILED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ARP 异常、网关不可达&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip -s link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看网卡收发包统计&lt;/td&gt;
&lt;td&gt;&lt;code&gt;errors&lt;/code&gt;、&lt;code&gt;dropped&lt;/code&gt;、&lt;code&gt;overruns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;网卡丢包、驱动异常&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="dns-解析"&gt;DNS 解析
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dig example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询域名解析&lt;/td&gt;
&lt;td&gt;A、AAAA、CNAME、TTL&lt;/td&gt;
&lt;td&gt;解析记录错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dig @8.8.8.8 example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定 DNS 查询&lt;/td&gt;
&lt;td&gt;不同 DNS 返回结果&lt;/td&gt;
&lt;td&gt;DNS 污染或 DNS 不一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dig +trace example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看完整迭代过程&lt;/td&gt;
&lt;td&gt;根 DNS、顶级域、权威 DNS&lt;/td&gt;
&lt;td&gt;委派链路异常&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getent hosts example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按系统实际流程解析&lt;/td&gt;
&lt;td&gt;hosts、NSS、系统 DNS&lt;/td&gt;
&lt;td&gt;程序和 &lt;code&gt;dig&lt;/code&gt; 结果不一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat /etc/resolv.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 DNS 配置&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nameserver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS Server 配置错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat /etc/hosts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看本地映射&lt;/td&gt;
&lt;td&gt;是否存在错误记录&lt;/td&gt;
&lt;td&gt;hosts 覆盖了正确解析&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="网络连通性和路径"&gt;网络连通性和路径
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ping -c 4 8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;测试 IP 连通性&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;code&gt;traceroute 8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&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;code&gt;tracepath 8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看路径和 MTU&lt;/td&gt;
&lt;td&gt;MTU、路径变化&lt;/td&gt;
&lt;td&gt;MTU 不匹配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mtr -rw 8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&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;code&gt;nc -vz 10.0.0.10 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;测试 TCP 端口&lt;/td&gt;
&lt;td&gt;是否能建立连接&lt;/td&gt;
&lt;td&gt;防火墙、端口未监听&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; 不通不一定代表服务不可用，因为 ICMP 可能被防火墙禁止；排查业务时还要使用目标端口进行验证。&lt;/p&gt;
&lt;h3 id="端口和-tcp-连接"&gt;端口和 TCP 连接
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ss -lntup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看监听端口和进程&lt;/td&gt;
&lt;td&gt;监听地址、端口、PID&lt;/td&gt;
&lt;td&gt;服务未监听、只监听 &lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ss -antp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看所有 TCP 连接&lt;/td&gt;
&lt;td&gt;TCP 状态、对端地址&lt;/td&gt;
&lt;td&gt;连接堆积、连接泄漏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ss -s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看连接汇总&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ESTABLISHED&lt;/code&gt;、&lt;code&gt;TIME-WAIT&lt;/code&gt;、&lt;code&gt;CLOSE-WAIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;连接数量异常&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ss -ant state time-wait&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 TIME_WAIT&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;code&gt;ss -ant state close-wait&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 CLOSE_WAIT&lt;/td&gt;
&lt;td&gt;数量是否持续增长&lt;/td&gt;
&lt;td&gt;应用没有及时 close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lsof -i :8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看端口占用进程&lt;/td&gt;
&lt;td&gt;PID、进程名&lt;/td&gt;
&lt;td&gt;端口被错误进程占用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fuser -n tcp 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看端口对应进程&lt;/td&gt;
&lt;td&gt;PID&lt;/td&gt;
&lt;td&gt;快速定位端口进程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="httphttps-和应用层"&gt;HTTP、HTTPS 和应用层
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curl -v http://example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 HTTP 访问过程&lt;/td&gt;
&lt;td&gt;请求头、响应头、状态码&lt;/td&gt;
&lt;td&gt;502、503、504、重定向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curl -I https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只查看响应头&lt;/td&gt;
&lt;td&gt;HTTP 状态、&lt;code&gt;Location&lt;/code&gt;、&lt;code&gt;Server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;网关、重定向、服务状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curl -k -v https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;排查 HTTPS/TLS&lt;/td&gt;
&lt;td&gt;证书、TLS 握手、协议版本&lt;/td&gt;
&lt;td&gt;证书错误、TLS 握手失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curl -o /dev/null -sS -w '时间统计' https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看分阶段耗时&lt;/td&gt;
&lt;td&gt;DNS、TCP、TLS、TTFB、总耗时&lt;/td&gt;
&lt;td&gt;定位请求慢在哪个阶段&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其中，&lt;code&gt;curl -w&lt;/code&gt; 可以输出 &lt;code&gt;%{time_namelookup}&lt;/code&gt;、&lt;code&gt;%{time_connect}&lt;/code&gt;、&lt;code&gt;%{time_appconnect}&lt;/code&gt;、&lt;code&gt;%{time_starttransfer}&lt;/code&gt; 和 &lt;code&gt;%{time_total}&lt;/code&gt; 等字段，用来拆分请求耗时。&lt;/p&gt;
&lt;h3 id="tcpdump-抓包"&gt;tcpdump 抓包
&lt;/h3&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;code&gt;tcpdump -nn -i any host 10.0.0.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取指定 IP 流量&lt;/td&gt;
&lt;td&gt;是否有请求和响应&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -i eth0 port 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取指定端口流量&lt;/td&gt;
&lt;td&gt;TCP 建连、数据传输&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -i any 'tcp[tcpflags] &amp;amp; tcp-syn != 0'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 SYN&lt;/td&gt;
&lt;td&gt;是否发出 SYN、是否收到 SYN-ACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -i any 'tcp[tcpflags] &amp;amp; tcp-rst != 0'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 RST&lt;/td&gt;
&lt;td&gt;谁重置了连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -i any 'tcp[tcpflags] &amp;amp; tcp-fin != 0'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 FIN&lt;/td&gt;
&lt;td&gt;谁主动关闭连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -i any -c 100 -s 0 -w /tmp/test.pcap port 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取并保存报文&lt;/td&gt;
&lt;td&gt;后续使用 Wireshark 分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcpdump -nn -r /tmp/test.pcap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读取抓包文件&lt;/td&gt;
&lt;td&gt;离线分析报文&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tcpdump-参数含义"&gt;tcpdump 参数含义
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;code&gt;-i eth0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定抓包网卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取所有网卡，Linux 常用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不把 IP 解析成域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-nn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不解析 IP，也不把端口解析成服务名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c 100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取 100 个报文后退出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-s 0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抓取完整报文，避免内容被截断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v&lt;/code&gt;、&lt;code&gt;-vv&lt;/code&gt;、&lt;code&gt;-vvv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显示更多详细信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;以 ASCII 显示报文内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;同时显示十六进制和 ASCII&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-w file.pcap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保存为抓包文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r file.pcap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读取抓包文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-tttt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显示完整可读时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显示 MAC 地址等二层信息&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tcpdump-过滤条件"&gt;tcpdump 过滤条件
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;code&gt;host 10.0.0.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;来源或目标是指定 IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src host 10.0.0.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;来源 IP 是指定 IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dst host 10.0.0.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目标 IP 是指定 IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;port 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;来源或目标端口是 8080&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src port 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;来源端口是 8080&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dst port 8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目标端口是 8080&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只抓 TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;udp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只抓 UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;icmp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只抓 ICMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;and&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;并且&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;or&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;或者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;not&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;排除&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="网络性能和协议统计"&gt;网络性能和协议统计
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sar -n DEV 1&lt;/code&gt;&lt;/td&gt;
&lt;td&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;code&gt;sar -n TCP,ETCP 1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 TCP 统计&lt;/td&gt;
&lt;td&gt;建连、关闭、重传&lt;/td&gt;
&lt;td&gt;TCP 重传、连接失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nstat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看协议栈统计&lt;/td&gt;
&lt;td&gt;Retrans、RST、失败&lt;/td&gt;
&lt;td&gt;内核协议栈异常&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ethtool -S eth0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看网卡底层统计&lt;/td&gt;
&lt;td&gt;CRC、队列、丢包&lt;/td&gt;
&lt;td&gt;网卡驱动或硬件问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iperf3 -s&lt;/code&gt; / &lt;code&gt;iperf3 -c &amp;lt;IP&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;测试两台机器吞吐&lt;/td&gt;
&lt;td&gt;带宽、重传&lt;/td&gt;
&lt;td&gt;链路带宽不足&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="防火墙连接跟踪和内核参数"&gt;防火墙、连接跟踪和内核参数
&lt;/h3&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;th&gt;常见问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nft list ruleset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 nftables 规则&lt;/td&gt;
&lt;td&gt;DROP、REJECT&lt;/td&gt;
&lt;td&gt;防火墙拦截&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iptables -L -n -v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 iptables 规则和命中数&lt;/td&gt;
&lt;td&gt;DROP、REJECT、计数&lt;/td&gt;
&lt;td&gt;规则误拦截&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conntrack -S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看连接跟踪状态&lt;/td&gt;
&lt;td&gt;是否接近容量上限&lt;/td&gt;
&lt;td&gt;NAT 表满&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sysctl net.ipv4.ip_local_port_range&lt;/code&gt;&lt;/td&gt;
&lt;td&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;code&gt;sysctl -a | grep tcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看 TCP 内核参数&lt;/td&gt;
&lt;td&gt;backlog、重传、端口复用&lt;/td&gt;
&lt;td&gt;内核参数配置不合理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="长连接短连接websocket-的区别和使用场景"&gt;长连接、短连接、WebSocket 的区别和使用场景
&lt;/h2&gt;&lt;h3 id="短连接"&gt;短连接
&lt;/h3&gt;&lt;p&gt;客户端与服务器之间的连接在一次请求完成后关闭。HTTP/1.0 默认倾向于短连接；HTTP/1.1 通常使用 Keep-Alive，因此不能简单把“HTTP 请求”都等同于短连接。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适合交互频率低、请求完成后不需要保持连接的场景。&lt;/li&gt;
&lt;li&gt;连接建立和关闭成本较高，高并发场景通常会配合连接池或连接复用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="长连接"&gt;长连接
&lt;/h3&gt;&lt;p&gt;一次 TCP 连接中可以进行多次请求和响应，减少频繁建立连接的开销。HTTP/1.1 默认支持持久连接，MySQL、Redis 等客户端也通常通过连接池复用连接。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适合频繁请求、连接建立成本较高或需要保持会话的场景。&lt;/li&gt;
&lt;li&gt;需要合理设置空闲超时、最大连接数和心跳，否则可能积累大量空闲连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="websocket"&gt;WebSocket
&lt;/h3&gt;&lt;p&gt;WebSocket 通常先通过 HTTP Upgrade 建立连接，随后在同一条 TCP 连接上进行全双工通信，服务器可以主动向客户端推送数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适合在线协作、即时消息、实时行情、在线游戏和部分 IoT 场景。&lt;/li&gt;
&lt;li&gt;如果只是客户端周期性拉取数据，短轮询或 SSE 可能更简单；选型要结合通信方向、连接规模和代理兼容性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mac-地址和-ip-地址如何转换"&gt;MAC 地址和 IP 地址如何转换
&lt;/h2&gt;&lt;p&gt;在 IPv4 局域网中，ARP 用于根据目标 IP 查询下一跳的 MAC 地址，并通过 ARP 缓存保存映射关系。IPv6 不使用 ARP，而是使用邻居发现协议（NDP）。&lt;/p&gt;
&lt;p&gt;以同一局域网内通信为例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;源主机查看 ARP 缓存；没有记录时，广播 ARP Request，携带源 IP、源 MAC 和待查询的目标 IP。&lt;/li&gt;
&lt;li&gt;目标主机发现请求中的目标 IP 是自己后，单播返回 ARP Reply，携带自己的 IP 和 MAC；两端也会根据报文更新缓存。&lt;/li&gt;
&lt;li&gt;源主机拿到目标 MAC 后，把 IP 数据包封装成以太网帧发送。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果目标 IP 不在本地网段，源主机查询的不是目标主机 MAC，而是默认网关的 MAC，然后由路由器逐跳转发。&lt;/p&gt;
&lt;h2 id="lvsnginxhaproxy-的区别和使用场景"&gt;LVS、Nginx、HAProxy 的区别和使用场景
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LVS&lt;/strong&gt;：主要工作在四层，通过 IP、端口等信息转发 TCP/UDP 流量，性能和吞吐能力强，常用于大规模集群的基础负载均衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx&lt;/strong&gt;：主要工作在七层，擅长 HTTP/HTTPS 反向代理、静态资源、TLS 终止、基于域名或 URL 的路由；&lt;code&gt;stream&lt;/code&gt; 模块也可以代理部分 TCP/UDP 流量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HAProxy&lt;/strong&gt;：同时支持四层和七层代理，健康检查、连接管理和负载均衡能力较强，常用于高性能 TCP 或 HTTP 代理场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际架构中经常组合使用，例如 LVS 做四层流量分发，Nginx 或 HAProxy 在后端做七层路由和业务治理。&lt;/p&gt;
&lt;h2 id="常见的负载均衡算法"&gt;常见的负载均衡算法
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轮询（Round Robin）&lt;/strong&gt;：按顺序将请求分配给后端实例，适合实例配置相近的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权轮询（Weighted Round Robin）&lt;/strong&gt;：按权重分配流量，适合实例规格不同或需要灰度的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最少连接（Least Connections）&lt;/strong&gt;：优先转发到当前连接数较少的实例，适合请求耗时差异较大的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权最少连接&lt;/strong&gt;：同时考虑实例权重和连接数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随机（Random）&lt;/strong&gt;：随机选择一个后端实例处理请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权随机（Weighted Random）&lt;/strong&gt;：按照后端权重比例随机选择实例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP Hash / 一致性哈希&lt;/strong&gt;：让同一客户端或同一 Key 尽量落到同一实例，适合需要会话粘滞的场景，但要注意实例扩缩容和热点问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随机或最短响应时间&lt;/strong&gt;：根据随机结果或历史延迟选择后端，具体效果依赖实现和监控数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="alb-和-nlb-的区别"&gt;ALB 和 NLB 的区别
&lt;/h2&gt;&lt;p&gt;以下以云厂商常见的命名方式为例，不同厂商的具体能力和限制可能不同：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;ALB&lt;/th&gt;
&lt;th&gt;NLB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;工作层级&lt;/td&gt;
&lt;td&gt;七层，通常处理 HTTP/HTTPS&lt;/td&gt;
&lt;td&gt;四层，通常处理 TCP/UDP，也可能支持 TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;路由依据&lt;/td&gt;
&lt;td&gt;域名、URL、请求头、Cookie 等&lt;/td&gt;
&lt;td&gt;IP、端口和连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;典型能力&lt;/td&gt;
&lt;td&gt;URL 路由、TLS 终止、重写、WAF 集成&lt;/td&gt;
&lt;td&gt;高吞吐、低延迟、长连接和静态 IP 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;Web、API、微服务网关&lt;/td&gt;
&lt;td&gt;数据库代理、TCP 服务、实时通信和高并发连接&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="cdn-常见面试题"&gt;CDN 常见面试题
&lt;/h2&gt;&lt;h3 id="cdn-如何实现就近访问"&gt;CDN 如何实现就近访问？
&lt;/h3&gt;&lt;p&gt;用户访问加速域名时，通常先通过 DNS 或 GSLB 将请求调度到合适的 CDN 节点。调度时会综合地域、运营商、节点健康状态、负载和网络质量等信息。节点命中缓存时直接返回，未命中时向源站回源并缓存响应。&lt;/p&gt;
&lt;h3 id="为什么域名要使用-cname"&gt;为什么域名要使用 CNAME？
&lt;/h3&gt;&lt;p&gt;业务域名通过 CNAME 指向 CDN 厂商提供的调度域名，厂商就可以根据实时节点状态和网络情况返回合适的节点 IP。直接配置固定 IP 会失去动态调度和故障切换能力。&lt;/p&gt;
&lt;h3 id="什么情况下-cdn-会回源"&gt;什么情况下 CDN 会回源？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;缓存未命中（Cache MISS）。&lt;/li&gt;
&lt;li&gt;缓存已过期，或通过 &lt;code&gt;ETag&lt;/code&gt; / &lt;code&gt;Last-Modified&lt;/code&gt; 校验后需要重新获取内容。&lt;/li&gt;
&lt;li&gt;源站通过 &lt;code&gt;Cache-Control&lt;/code&gt; 指定不缓存，或请求携带了会绕过缓存的条件。&lt;/li&gt;
&lt;li&gt;动态请求、个性化请求，或 CDN 配置为不缓存的资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cdn-缓存由哪些-http-头控制"&gt;CDN 缓存由哪些 HTTP 头控制？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cache-Control: max-age=3600&lt;/code&gt;：指定浏览器缓存 3600 秒。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cache-Control: s-maxage=3600&lt;/code&gt;：指定共享缓存（如 CDN）缓存 3600 秒，可以让浏览器较快更新，同时避免 CDN 频繁回源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no-cache&lt;/code&gt;：可以缓存，但使用前必须向源站重新验证。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no-store&lt;/code&gt;：不应存储响应内容。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ETag&lt;/code&gt;、&lt;code&gt;Last-Modified&lt;/code&gt;：用于条件请求和协商缓存，减少重复传输。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="purge-和-preload-有什么区别"&gt;Purge 和 Preload 有什么区别？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purge（刷新/清除缓存）&lt;/strong&gt;：删除 CDN 节点上的旧缓存，使后续请求重新回源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preload（预热）&lt;/strong&gt;：提前把资源从源站拉取到 CDN 节点，降低首次访问的回源延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如何处理缓存击穿缓存雪崩和热点-key"&gt;如何处理缓存击穿、缓存雪崩和热点 Key？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;为不同资源设置合理且带随机抖动的 TTL，避免大量缓存同时过期。&lt;/li&gt;
&lt;li&gt;对热点资源使用多级缓存、源站保护或请求合并，避免大量请求同时回源：&lt;/li&gt;
&lt;/ul&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&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;User
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L1 Edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;L2 Regional Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Origin Shield
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Origin
&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;ul&gt;
&lt;li&gt;&lt;strong&gt;Origin Shield&lt;/strong&gt;：CDN 和源站之间的一层集中缓存或回源保护层，减少多个边缘节点同时访问源站。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求合并&lt;/strong&gt;：将大量相同资源请求合并为一个回源请求，其他请求共享结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Singleflight&lt;/strong&gt;：针对相同 Key，只允许一个请求真正执行，其他请求等待并共享结果。&lt;/li&gt;
&lt;li&gt;对必须实时更新的内容采用版本化 URL、精确刷新和灰度发布，减少大范围清缓存。&lt;/li&gt;
&lt;li&gt;对源站增加限流、熔断和降级，防止 CDN 回源流量压垮应用。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRE面试题汇总 | SRE</title><link>https://hangliuc.github.io/topic/interview/sre/</link><pubDate>Thu, 04 Dec 2025 18:06:35 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/sre/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/sre_interview_cover.png" alt="Featured image of post SRE面试题汇总 | SRE" /&gt;&lt;h2 id="slaslosli"&gt;SLA、SLO、SLI
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;SLI（Service Level Indicator）：服务水平指标，用于量化衡量服务表现，例如成功率、延迟和可用性等。&lt;/li&gt;
&lt;li&gt;SLO（Service Level Objective）：服务水平目标，是针对某个 SLI 设定的目标值，必须明确统计周期或时间窗口，例如“按月统计的可用性不低于 99.9%”。&lt;/li&gt;
&lt;li&gt;SLA（Service Level Agreement）：服务水平协议，是服务提供方与客户之间约定的服务标准，通常包含 SLO 以及未达标时的补偿或处理方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单来说，SLI 用于衡量实际表现，SLO 是公司内部设定的服务目标，SLA 则是对客户的外部承诺。&lt;/p&gt;
&lt;h2 id="mttr"&gt;MTTR
&lt;/h2&gt;&lt;p&gt;MTTR：平均故障修复时间（Mean Time to Repair）&lt;/p&gt;
&lt;p&gt;MTTR = 故障修复总时长 ÷ 故障次数&lt;/p&gt;
&lt;h3 id="如何降低-mttr"&gt;如何降低 MTTR？
&lt;/h3&gt;&lt;h3 id="监控"&gt;监控
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;完善监控告警体系
&lt;ul&gt;
&lt;li&gt;业务指标监控&lt;/li&gt;
&lt;li&gt;系统指标监控&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;告警降噪
&lt;ul&gt;
&lt;li&gt;告警分级：P1、P2、P3&lt;/li&gt;
&lt;li&gt;告警升级：当某告警等级为 P2，且在 1 小时内未被处理（未关闭、未屏蔽等）时，自动升级为 P1&lt;/li&gt;
&lt;li&gt;告警间隔：设置合理的重复通知间隔，避免同一告警频繁发送&lt;/li&gt;
&lt;li&gt;告警淹没：设置合理的告警策略，避免告警过多导致重要告警被忽略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="快速定位"&gt;快速定位
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;标准化排障 SOP
&lt;ul&gt;
&lt;li&gt;CPU、内存飙高怎么查&lt;/li&gt;
&lt;li&gt;ELB 5xx 怎么查&lt;/li&gt;
&lt;li&gt;Pod CrashLoop 怎么查&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自动抓取现场信息
&lt;ul&gt;
&lt;li&gt;C++ core dump&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;统一日志平台
&lt;ul&gt;
&lt;li&gt;ELK / Loki&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;全链路追踪&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="快速修复"&gt;快速修复
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;灰度发布 / 金丝雀发布&lt;/li&gt;
&lt;li&gt;配置中心（Apollo）+ 动态切流（必要时像开关一样关闭某个模块）&lt;/li&gt;
&lt;li&gt;自动扩容（根据业务流量自动扩容，例如 HPA）&lt;/li&gt;
&lt;li&gt;脚本化修复
&lt;ul&gt;
&lt;li&gt;一键重启&lt;/li&gt;
&lt;li&gt;一键清理 DNS 缓存&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="高可用部署"&gt;高可用部署
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;服务多实例和多 AZ 部署&lt;/li&gt;
&lt;li&gt;自动故障转移&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="持续演练--可靠性测试"&gt;持续演练 &amp;amp; 可靠性测试
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;混沌工程（提前演练故障）&lt;/li&gt;
&lt;li&gt;增加缺失监控点&lt;/li&gt;
&lt;li&gt;持续复盘并完善故障应急预案&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRE面试题汇总 | Linux</title><link>https://hangliuc.github.io/topic/interview/liunx/</link><pubDate>Wed, 03 Dec 2025 10:56:44 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/liunx/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/linux_interview_cover.png" alt="Featured image of post SRE面试题汇总 | Linux" /&gt;&lt;h2 id="cpu-使用率很高怎么排查"&gt;CPU 使用率很高，怎么排查？
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先通过 &lt;code&gt;top&lt;/code&gt;、&lt;code&gt;ps&lt;/code&gt; 等命令，定位占用 CPU 最高的进程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;top -Hp &amp;lt;PID&amp;gt;&lt;/code&gt;，定位进程中占用 CPU 最高的线程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;导出并分析线程堆栈。以 Java 为例，可以将线程 ID 转换为十六进制，再在 &lt;code&gt;jstack&lt;/code&gt; 输出中匹配对应的线程，定位具体的方法和类。&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;span class="lnt"&gt;2
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%x\n&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;1235&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jstack &amp;lt;PID&amp;gt;
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;常见原因及处理方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;死循环或密集计算：&lt;/strong&gt; 代码中存在 &lt;code&gt;while (true)&lt;/code&gt; 等没有退出条件的循环，或复杂的递归与大规模计算，需要优化算法或修复代码逻辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频繁垃圾回收（GC）：&lt;/strong&gt; 内存不足或对象创建过于频繁，导致 Full GC 频繁触发，CPU 花费大量时间在垃圾回收上，可以使用 &lt;code&gt;jstat -gcutil&lt;/code&gt; 进一步确认。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高并发请求冲击：&lt;/strong&gt; 系统本身没有故障，只是瞬时流量过大，超出了服务器的负载能力，需要考虑限流、扩容或优化请求处理逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="cpu-性能指标速查"&gt;CPU 性能指标速查
&lt;/h3&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;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;code&gt;us&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用户态 CPU 时间占比&lt;/td&gt;
&lt;td&gt;应用程序本身消耗了大量 CPU&lt;/td&gt;
&lt;td&gt;大量计算、QPS 增加、死循环、频繁 GC&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;top -H -p &amp;lt;PID&amp;gt;&lt;/code&gt;、&lt;code&gt;perf top&lt;/code&gt; 及语言自带工具（如 Go 的 &lt;code&gt;pprof&lt;/code&gt;、Java 的 &lt;code&gt;jstack&lt;/code&gt;）；优化算法、修复死循环或横向扩容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;内核态 CPU 时间占比&lt;/td&gt;
&lt;td&gt;CPU 主要消耗在内核层面&lt;/td&gt;
&lt;td&gt;大量系统调用（&lt;code&gt;open/read/write/futex&lt;/code&gt;）、频繁创建和销毁线程、上下文切换过多&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;strace -c -p &amp;lt;PID&amp;gt;&lt;/code&gt;、&lt;code&gt;vmstat 1&lt;/code&gt;、&lt;code&gt;pidstat -w&lt;/code&gt;；减少锁竞争，使用连接池/线程池，批量处理 I/O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ni&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;由 nice 调整过的用户态进程所消耗的 CPU&lt;/td&gt;
&lt;td&gt;低优先级后台任务占用 CPU&lt;/td&gt;
&lt;td&gt;批处理任务、备份脚本等&lt;/td&gt;
&lt;td&gt;通常属于预期行为；可通过调整任务执行时间或 Nice 值进行控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;空闲 CPU 时间占比&lt;/td&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt; 很低表示 CPU 忙&lt;/td&gt;
&lt;td&gt;CPU 容量不足或存在突发流量&lt;/td&gt;
&lt;td&gt;结合 &lt;code&gt;us&lt;/code&gt;、&lt;code&gt;sy&lt;/code&gt;、&lt;code&gt;wa&lt;/code&gt; 等指标判断 CPU 忙碌原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等待 I/O 的 CPU 时间占比&lt;/td&gt;
&lt;td&gt;CPU 主要在等待 I/O 完成&lt;/td&gt;
&lt;td&gt;磁盘 IOPS 瓶颈、同步刷盘、磁盘故障导致延迟升高&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;iostat -xz 1&lt;/code&gt;、&lt;code&gt;pidstat -d&lt;/code&gt;、&lt;code&gt;iotop&lt;/code&gt;；排查磁盘、存储和 I/O 调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;硬件中断时间占比&lt;/td&gt;
&lt;td&gt;CPU 花费大量时间处理网卡、磁盘等硬件中断&lt;/td&gt;
&lt;td&gt;网络流量或硬件中断过多&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;cat /proc/interrupts&lt;/code&gt; 查看中断分布；配置网卡多队列和 &lt;code&gt;irqbalance&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;si&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;软件中断时间占比&lt;/td&gt;
&lt;td&gt;CPU 花费大量时间处理软件中断&lt;/td&gt;
&lt;td&gt;常见于网络包量大、TCP 连接建立和销毁频繁，也可能与定时器或块设备 I/O 有关&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;mpstat -I SUM -P ALL 1&lt;/code&gt;、&lt;code&gt;sar -n DEV 1&lt;/code&gt;；优化网络连接复用、RPS/RFS 和相关内核参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;st&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;被虚拟机宿主机占用的 CPU 时间占比&lt;/td&gt;
&lt;td&gt;虚拟机拿不到足够的 CPU&lt;/td&gt;
&lt;td&gt;宿主机超卖或其他虚拟机争抢资源&lt;/td&gt;
&lt;td&gt;联系云厂商排查宿主机负载，或迁移到其他节点/独占实例&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="cpu-使用率不高但-load-很高"&gt;CPU 使用率不高，但 Load 很高
&lt;/h2&gt;&lt;p&gt;CPU 使用率不高但 Load 很高，通常说明有大量进程处于可运行状态（R），或处于不可中断睡眠状态（D）。D 状态通常与磁盘、网络存储等 I/O 等待有关，也需要关注锁竞争、NFS 和文件系统问题。&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&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-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Load 高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 先确认是否真的异常
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; uptime / nproc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 1min 高，5/15min 低
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 可能是瞬时突发
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查流量、定时任务、发布、批处理
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 1/5/15min 都高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 或 Load 持续高于 CPU 核数 / 历史基线
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 查看 CPU 是总体高、单核高，还是不高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; top
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mpstat -P ALL 1 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 某个 CPU Core 很高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 单核或绑核问题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查热点线程、CPU affinity、taskset
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 所有 CPU Core 都高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ CPU 容量不足
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查高 CPU 进程、线程和业务流量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ top -H / pidstat -u -t 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 总体和单核 CPU 都不高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 重点排查资源等待
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 使用 vmstat 对问题分类
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vmstat 1 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ b（不可中断进程）高或 wa（I/O 等待）高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 大量任务阻塞或等待 I/O
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 进入「I/O 排查」
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ si / so 持续较高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 发生 Swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ swapon --show
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 排查内存不足
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ st 高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 虚拟机被宿主机抢占 CPU
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 排查宿主机超卖和资源争抢
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ r 高（等待运行的进程数），但 CPU 使用率不高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 任务等待 CPU，但 CPU 没有充分利用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查 CPU affinity、容器 CPU quota、
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ CPU throttling 和虚拟机 steal time
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ r、b、wa、si/so、st 都不明显
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 延长采样时间，并检查 D 状态、
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 锁竞争、NFS、文件系统和驱动
&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;h3 id="io-排查"&gt;I/O 排查
&lt;/h3&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&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-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I/O 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 查看是否存在大量 D 状态进程
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ps -eo pid=,ppid=,stat=,pcpu=,wchan:25=,comm= |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; awk &amp;#39;$3 ~ /^[DR]/&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 或 top -H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 没有大量 D 状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 继续检查 R 状态、CPU 调度和 cgroup 限制
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 存在大量 D 状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 查看进程卡在哪个内核等待点
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat /proc/&amp;lt;PID&amp;gt;/wchan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat /proc/&amp;lt;PID&amp;gt;/stack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. 检查磁盘和存储性能
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iostat -xz 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pidstat -d 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iotop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ await、aqu-sz、%util 较高
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 磁盘或底层存储性能不足
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查 IOPS、吞吐、队列、慢盘、云盘、RAID、Ceph、SAN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 本地磁盘或云盘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ df -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ df -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ dmesg -T
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ journalctl -k
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ NFS、EFS、Ceph 或其他网络存储
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ findmnt / mount
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 检查网络延迟、挂载状态和远端存储服务
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 磁盘指标正常
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 继续排查锁竞争、文件系统、网络存储
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 以及内核或驱动异常
&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;h2 id="进程线程协程"&gt;进程、线程、协程
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;进程：操作系统分配资源的基本单位，一个进程可以拥有多个线程，并拥有独立的地址空间和资源。&lt;/li&gt;
&lt;li&gt;线程：进程内的执行单位，同一进程中的线程共享进程的大部分资源，但拥有独立的栈和寄存器状态。&lt;/li&gt;
&lt;li&gt;协程：由用户态运行时调度的轻量级执行单元，不直接由内核调度，通常运行在线程之上。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="linux-中的进程优先级与设置方法"&gt;Linux 中的进程优先级与设置方法
&lt;/h2&gt;&lt;p&gt;进程的优先级决定了其获取 CPU 时间片的顺序。优先级更高（数值更低）的进程会优先获取 CPU 时间片。
对于普通进程，Nice 值会影响其调度优先级，范围是 -20（最高优先级）到 19（最低优先级）。实时进程还使用独立的实时优先级。
默认情况下，进程的 Nice 值为 0。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nice 命令：nice 命令用于启动一个进程，并设置其 Nice 值。例如，nice -n 10 command 会以 Nice 值为 10 来启动 command。&lt;/li&gt;
&lt;li&gt;renice 命令：renice 命令用于修改已经在运行的进程的 Nice 值。例如，&lt;code&gt;renice +5 -p 1234&lt;/code&gt; 会将 PID 为 1234 的进程的 Nice 值增加 5。需要注意的是，只有 root 用户或具备 &lt;code&gt;CAP_SYS_NICE&lt;/code&gt; 权限的进程才能降低 Nice 值、提高调度优先级。&lt;/li&gt;
&lt;li&gt;在代码中调用 nice() 或 setpriority() 函数：如果你正在编写一个程序，你可以在代码中调用 nice() 或 setpriority() 函数来改变你的进程的优先级。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什么是僵尸进程"&gt;什么是僵尸进程
&lt;/h2&gt;&lt;p&gt;僵尸进程是指一个已经终止运行、但父进程尚未回收其退出状态的进程。此时内核仍会保留少量进程描述信息，供父进程通过 &lt;code&gt;wait()&lt;/code&gt; 等系统调用读取；进程占用的大部分资源已经释放。&lt;/p&gt;
&lt;h2 id="什么是中断"&gt;什么是中断
&lt;/h2&gt;&lt;p&gt;中断是系统用来响应硬件设备请求的一种机制，会打断进程的正常调度和执行，然后调用内核的中断处理程序来响应设备的请求。
取外卖案例，不用苦苦等待，打电话的动作就是中断。
中断是一种异步处理机制，可以提高系统的并发处理能力。&lt;/p&gt;
&lt;h3 id="软中断硬中断不可中断进程"&gt;软中断、硬中断、不可中断进程
&lt;/h3&gt;&lt;p&gt;Linux 通常将中断处理分为上半部分和下半部分：
上半部分直接处理硬件请求，特点是快速执行（硬中断）。
下半部分延后处理耗时工作，特点是延迟执行（软中断或其他下半部机制）。
不可中断进程（D 状态）表示进程正在等待某些不可中断的内核操作，常见于 I/O 等待。进程长时间处于 D 状态，通常需要排查存储、网络文件系统或驱动问题。&lt;/p&gt;
&lt;h2 id="进程间通信的方式及其使用场景"&gt;进程间通信的方式及其使用场景
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;管道（Pipe）和命名管道（Named pipe）：管道通常用于具有父子关系的进程间通信；命名管道可以用于没有亲缘关系的进程。它们主要用于数据的流式传输，双向通信通常需要两个管道或使用 Socket。&lt;/li&gt;
&lt;li&gt;消息队列（Message Queue）：消息队列是一种列表结构，可以存储要发送的消息。进程可以向消息队列中添加消息，也可以从中读取消息。消息队列常用于不同进程间的数据交换和同步。&lt;/li&gt;
&lt;li&gt;共享内存（Shared Memory）：共享内存是最快的 IPC 方式，它允许两个或多个进程访问同一块内存区域。这种方式常用于大量数据的交换。&lt;/li&gt;
&lt;li&gt;信号（Signal）：信号是一种异步的通信方式，用于通知接收进程某个事件已经发生。例如，当一个进程结束时，它会发送一个 SIGCHLD 信号给其父进程。&lt;/li&gt;
&lt;li&gt;套接字（Socket）：套接字可以用于不同机器之间的进程通信，也可以用于同一机器上的进程通信。它支持 TCP、UDP 等多种协议，常用于网络通信。&lt;/li&gt;
&lt;li&gt;信号量（Semaphore）：信号量主要用于解决竞态条件，保护关键资源的访问。当多个进程需要访问同一资源时，可以使用信号量进行同步。&lt;/li&gt;
&lt;li&gt;文件锁（File Locking）：文件锁可以用于控制多个进程对同一文件的访问。当一个进程正在访问某个文件时，其他进程必须等待，直到该进程释放了文件锁。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="cgroup-中限制-cpu-的方式有哪些"&gt;cgroup 中限制 CPU 的方式有哪些
&lt;/h2&gt;&lt;p&gt;cgroups 是 control groups（控制组）的缩写，是 Linux 内核提供的资源管理机制，可以限制、控制和隔离进程使用的 CPU、内存、磁盘 I/O 等资源。
常见的 CPU 限制方式有两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于 CPU 配额的硬限制：cgroup v1 使用 &lt;code&gt;cpu.cfs_quota_us&lt;/code&gt; 和 &lt;code&gt;cpu.cfs_period_us&lt;/code&gt;，cgroup v2 使用 &lt;code&gt;cpu.max&lt;/code&gt;，限制进程在一个周期内最多使用的 CPU 时间。&lt;/li&gt;
&lt;li&gt;基于相对权重的限制：cgroup v1 使用 &lt;code&gt;cpu.shares&lt;/code&gt;，cgroup v2 使用 &lt;code&gt;cpu.weight&lt;/code&gt;，用于 CPU 竞争时按比例分配资源，并不是绑定到固定的 CPU 核心。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="内存中的-buffers-与-cached-的区别"&gt;内存中的 Buffers 与 Cached 的区别
&lt;/h2&gt;&lt;p&gt;设计目的是提升系统的 I/O 性能。&lt;/p&gt;
&lt;p&gt;Buffers 是内核块设备缓冲区使用的内存，对应 &lt;code&gt;/proc/meminfo&lt;/code&gt; 中的 &lt;code&gt;Buffers&lt;/code&gt; 值。
Cache 是内核页缓存和可回收 Slab 使用的内存，对应 &lt;code&gt;/proc/meminfo&lt;/code&gt; 中的 &lt;code&gt;Cached&lt;/code&gt; 与 &lt;code&gt;SReclaimable&lt;/code&gt; 等字段。&lt;/p&gt;
&lt;p&gt;Buffers 是用于临时存储待写入硬盘的数据，而 Cached 是用于存储已经从硬盘读取的数据，以便快速访问。
Buffer 是对磁盘数据的缓存。而 Cache 是文件数据的缓存，它们既会用在读请求中，也会用在写请求中。&lt;/p&gt;
&lt;p&gt;Linux是尽可能使用内存原则，内存会把剩余的空间申请为cache，而cache不属于free，当系统运行时间很长，我们会发现cache很大。&lt;/p&gt;
&lt;p&gt;当我们看到系统内存使用率很高，free几乎为0时，并不代表系统内存容量有瓶颈！只是系统充分发挥了内存作用。而当有进程需要申请大文件内存时，内核会将部分cache空间回收，回收的内存再分配给进程程序使用。&lt;/p&gt;
&lt;h2 id="栈内存和堆内存的区别"&gt;栈内存和堆内存的区别
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;栈内存（Stack）
特点：栈内存是自动分配和释放的，具有先进后出（LIFO，Last In First Out）的特性。栈内存中的变量会在函数调用时创建，并在函数返回时自动销毁。其管理由编译器控制，因此效率较高。
用途：通常用于存储局部变量、函数参数等临时数据。栈内存的分配通常很快，因为它只是调整一个指针来跟踪当前的栈顶位置。
优点：内存分配和释放速度快，不容易产生内存碎片。
缺点：栈内存的大小通常有限，不能用于存储大量数据或长时间使用的数据。&lt;/li&gt;
&lt;li&gt;堆内存（Heap）
特点：堆内存是动态分配的，大小不固定，需要程序员手动分配和释放。如果忘记释放，可能会导致内存泄漏。它没有严格的先进后出的顺序，可以在程序的任何位置请求内存分配。
用途：用于存储需要动态分配的大量数据，如对象、全局数据等。通过 malloc() 或 new 等操作分配，通过 free() 或 delete 等操作释放。
优点：适合长时间使用的数据或较大的数据结构，比如链表、树等。堆内存的大小相对栈来说几乎是无限的（受制于物理内存和系统限制）。
缺点：由于需要手动管理，堆内存分配和释放速度较慢，且容易导致内存碎片。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;区别总结：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生命周期：栈内存中的数据在函数调用期间有效，而堆内存的数据在手动释放前一直有效。&lt;/li&gt;
&lt;li&gt;分配方式：栈是由系统自动分配和管理，堆是由程序员动态分配和管理。&lt;/li&gt;
&lt;li&gt;效率：栈内存效率高，堆内存分配和释放较慢&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="进程最大数最大线程数进程打开的文件数怎么调整"&gt;进程最大数、最大线程数、进程打开的文件数，怎么调整
&lt;/h2&gt;&lt;h3 id="查看当前限制"&gt;查看当前限制
&lt;/h3&gt;&lt;p&gt;以下限制针对当前 Shell 或当前用户会话：&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;ulimit&lt;/span&gt; -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;ulimit&lt;/span&gt; -u &lt;span class="c1"&gt;# 当前用户可创建的进程/线程数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;ulimit&lt;/span&gt; -n &lt;span class="c1"&gt;# 单个进程可打开的文件描述符数&lt;/span&gt;
&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;h3 id="调整最大文件数"&gt;调整最大文件数
&lt;/h3&gt;&lt;p&gt;临时生效
ulimit -n 65535&lt;/p&gt;
&lt;p&gt;永久生效
sudo vim /etc/security/limits.conf&lt;/p&gt;
&lt;p&gt;添加如下内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soft nofile 65535&lt;/li&gt;
&lt;li&gt;hard nofile 65535&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="调整最大进程数--最大线程数"&gt;调整最大进程数 / 最大线程数
&lt;/h3&gt;&lt;p&gt;临时生效
ulimit -u 65535&lt;/p&gt;
&lt;p&gt;永久生效
sudo vim /etc/security/limits.conf&lt;/p&gt;
&lt;p&gt;添加如下内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soft nproc 65535&lt;/li&gt;
&lt;li&gt;hard nproc 65535&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="注意事项"&gt;注意事项
&lt;/h3&gt;&lt;p&gt;soft 软限制：当前会话实际生效的限制，用户可以将它提高到 hard 限制以内。
hard 硬限制：软限制可以达到的上限，通常只有 root 或具备相应权限的用户才能提高。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/sysctl.conf&lt;/code&gt; 用于配置系统级内核参数，可通过 &lt;code&gt;sysctl -p&lt;/code&gt; 立即加载，通常不需要重启。
&lt;code&gt;/etc/security/limits.conf&lt;/code&gt; 用于配置用户级限制，通常需要重新登录才能对新会话生效；systemd 服务还需要在 unit 中配置对应的 &lt;code&gt;LimitNOFILE&lt;/code&gt;、&lt;code&gt;TasksMax&lt;/code&gt; 等参数。&lt;/p&gt;
&lt;h2 id="load-和-cpu-使用率的区别"&gt;Load 和 CPU 使用率的区别
&lt;/h2&gt;&lt;p&gt;Load 平均负载是指一段时间内，处于可运行状态（R）和不可中断睡眠状态（D）的任务数的平均值。
CPU 使用率是指一段时间内，CPU 用于处理任务的时间占总时间的比例。&lt;/p&gt;
&lt;p&gt;最理想的情况：平均负载接近 CPU 核心数，每个核心上都有一个可运行任务。&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;查看CPU核心数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="s1"&gt;&amp;#39;model name&amp;#39;&lt;/span&gt; /proc/cpuinfo &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uptime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 06:44:50 up &lt;span class="m"&gt;190&lt;/span&gt; days, 22:44, &lt;span class="m"&gt;4&lt;/span&gt; users, load average: 0.42, 0.14, 0.04
&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;h3 id="两者之间关系"&gt;两者之间关系
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;CPU 密集型进程，使用大量 CPU 会导致平均负载升高，此时这两者是一致的&lt;/li&gt;
&lt;li&gt;I/O 密集型进程，等待 I/O 也会导致平均负载升高，但 CPU 使用率不一定很高&lt;/li&gt;
&lt;li&gt;大量等待 CPU 的进程调度也会导致平均负载升高，此时的 CPU 使用率也会比较高&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dudf-查看磁盘结果不一致"&gt;du、df 查看磁盘结果不一致
&lt;/h2&gt;&lt;p&gt;系统中可能存在大量被删除的文件（僵尸文件），且有运行的进程在使用这些文件的句柄。&lt;/p&gt;
&lt;p&gt;当一个文件被删除后，如果有进程仍然打开着该文件，du 不会统计这部分空间，因为文件已经从目录结构中移除；然而，df 会统计这部分空间，因为磁盘空间实际上还被占用。&lt;/p&gt;
&lt;h3 id="解决方法"&gt;解决方法
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;重启相关服务：重启仍持有文件句柄的进程，释放已删除文件占用的空间。生产环境应优先采用平滑重启。&lt;/li&gt;
&lt;li&gt;查找并关闭进程：使用 lsof 或 fuser 等工具查找并关闭使用僵尸文件的进程。
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsof &lt;span class="p"&gt;|&lt;/span&gt; grep deleted
&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;/li&gt;
&lt;li&gt;如果暂时不能重启进程，可以结合业务情况，通过进程自身的日志切割或文件截断机制释放空间；不要重复删除已经显示为 &lt;code&gt;deleted&lt;/code&gt; 的文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="硬链接和软链接的区别"&gt;硬链接和软链接的区别
&lt;/h2&gt;&lt;p&gt;硬链接和软链接是两种不同类型的文件系统链接，用于在目录之间共享文件。&lt;/p&gt;
&lt;h3 id="硬链接"&gt;硬链接：
&lt;/h3&gt;&lt;p&gt;a. 具有相同inode节点号的多个文件互为硬链接文件；
b. 硬链接文件是文件的另一个入口
c. 可以通过给文件设置硬链接文件来防止重要文件被误删；
d. 删除硬链接文件或者删除源文件，文件实体不会被删除，只有都删除才会生效&lt;/p&gt;
&lt;h3 id="软连接"&gt;软连接：
&lt;/h3&gt;&lt;p&gt;a. 软链接类似windows系统的快捷方式
b. 软链接里面存放的是源文件的路径，指向源文件
c. 删除源文件，软链接依然存在，但无法访问源文件内容
d. 软链接和源文件是不同的文件，文件类型也不同，inode号也不同；&lt;/p&gt;
&lt;h2 id="lvm-怎么划分"&gt;LVM 怎么划分
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;创建物理卷（PV）&lt;/li&gt;
&lt;li&gt;创建卷组（VG）&lt;/li&gt;
&lt;li&gt;创建逻辑卷（LV）&lt;/li&gt;
&lt;li&gt;格式化逻辑卷（LV）&lt;/li&gt;
&lt;li&gt;挂载逻辑卷（LV）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在公有云运维中，很少见到使用 LVM 划分云盘，这属于常见情况。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;云盘可以直接扩容，不需要 LVM 的 PV/VG/LV&lt;/li&gt;
&lt;li&gt;传统环境中，LVM 与 RAID 可以配合使用，但二者职责不同；云盘底层通常已经提供多副本和冗余能力&lt;/li&gt;
&lt;li&gt;Kubernetes 弱化了主机侧 LVM 的使用，容器数据通常通过 PVC 管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见的-raid-有哪些使用场景是什么"&gt;常见的 RAID 有哪些，使用场景是什么
&lt;/h2&gt;&lt;p&gt;常见的 RAID 级别有以下几种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAID 0：striping（条带化），将数据分成多个块，并行写入多个磁盘，提高读写速度。但不提供数据冗余，一旦磁盘故障，数据将丢失。&lt;/li&gt;
&lt;li&gt;RAID 1：mirroring（镜像），将数据在多个磁盘上进行镜像备份，提供数据冗余。但写入速度受限于较慢的磁盘。&lt;/li&gt;
&lt;li&gt;RAID 5：striping with parity（条带化加校验），将数据分成多个块，并行写入多个磁盘，同时存储校验信息，可容忍一块磁盘故障，但写入会产生额外的校验开销。&lt;/li&gt;
&lt;li&gt;RAID 6：striping with double parity（条带化加双校验），在 RAID 5 的基础上增加一组校验信息，可容忍两块磁盘故障。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAID 0：用于对性能要求较高的场景，如数据库、视频编辑等。&lt;/li&gt;
&lt;li&gt;RAID 1：用于对数据冗余要求较高的场景，如企业关键数据存储。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如何创建和管理自定义-systemd-服务"&gt;如何创建和管理自定义 systemd 服务
&lt;/h2&gt;&lt;p&gt;自定义服务配置文件位置：&lt;code&gt;/etc/systemd/system/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;创建或者修改单元文件后需要重新加载配置生效
sudo systemctl daemon-reload&lt;/p&gt;
&lt;h2 id="linux-系统中-proc-是做什么的"&gt;Linux 系统中 &lt;code&gt;/proc&lt;/code&gt; 是做什么的
&lt;/h2&gt;&lt;p&gt;用户和内核交互的接口，性能工具数据（top、free、ps）的来源&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;启动当前进程的完整命令：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/proc/&amp;lt;进程号&amp;gt;/cmdline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;当前进程的环境变量列表：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/proc/&amp;lt;进程号&amp;gt;/environ
&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;code&gt;/proc&lt;/code&gt; 中的部分文件使用 NUL 字符分隔内容，例如 &lt;code&gt;cmdline&lt;/code&gt;，需要转换后才能按行阅读：&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/3824/cmdline &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;
&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;h2 id="lsof-命令使用场景"&gt;lsof 命令使用场景
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;查看某个进程打开的文件
lsof -p 1234&lt;/li&gt;
&lt;li&gt;查看哪个进程正在使用特定端口
lsof -i :80&lt;/li&gt;
&lt;li&gt;查看所有网络连接
lsof -i&lt;/li&gt;
&lt;li&gt;查看某个用户打开文件
lsof -u username&lt;/li&gt;
&lt;li&gt;文件已经被删除，但仍然被某个进程占用
lsof | grep deleted&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>面试 | 滴滴运维开发工程师</title><link>https://hangliuc.github.io/topic/interview/experience/%E6%BB%B4%E6%BB%B4%E8%BF%90%E7%BB%B4%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88/</link><pubDate>Tue, 02 Dec 2025 15:20:45 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/experience/%E6%BB%B4%E6%BB%B4%E8%BF%90%E7%BB%B4%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post 面试 | 滴滴运维开发工程师" /&gt;&lt;h2 id="tcp-的连接方式"&gt;TCP 的连接方式
&lt;/h2&gt;&lt;h2 id="502504区别"&gt;502、504区别
&lt;/h2&gt;&lt;h2 id="常用的网络命令"&gt;常用的网络命令
&lt;/h2&gt;&lt;h2 id="如何查看80端口的进程id"&gt;如何查看80端口的进程ID
&lt;/h2&gt;&lt;h2 id="你对稳定性方面做了哪些东西"&gt;你对稳定性方面做了哪些东西
&lt;/h2&gt;</description></item><item><title>面试 | 智谱华章运维工程师</title><link>https://hangliuc.github.io/topic/interview/experience/%E6%99%BA%E8%B0%B1%E5%8D%8E%E7%AB%A0%E8%BF%90%E7%BB%B4%E5%B7%A5%E7%A8%8B%E5%B8%88/</link><pubDate>Tue, 02 Dec 2025 15:20:29 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/experience/%E6%99%BA%E8%B0%B1%E5%8D%8E%E7%AB%A0%E8%BF%90%E7%BB%B4%E5%B7%A5%E7%A8%8B%E5%B8%88/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post 面试 | 智谱华章运维工程师" /&gt;&lt;h2 id="ls-按照时间排序"&gt;ls 按照时间排序
&lt;/h2&gt;&lt;h2 id="两个文件如何按照行diff"&gt;两个文件如何按照行diff
&lt;/h2&gt;&lt;h2 id="awk-获取最后一行"&gt;awk 获取最后一行
&lt;/h2&gt;&lt;h2 id="k8s-中几种探针方式"&gt;k8s 中几种探针方式
&lt;/h2&gt;&lt;h2 id="k8s集群组件"&gt;k8s集群组件
&lt;/h2&gt;&lt;h2 id="创建-pod-的过程"&gt;创建 pod 的过程
&lt;/h2&gt;&lt;h2 id="ingrss-创建方式"&gt;ingrss 创建方式
&lt;/h2&gt;&lt;h2 id="dockerfile-中-add-copy区别"&gt;dockerfile 中 add 、copy区别
&lt;/h2&gt;&lt;h2 id="如何减少镜像体积"&gt;如何减少镜像体积
&lt;/h2&gt;&lt;h2 id="如何将运行的容器打印成镜像"&gt;如何将运行的容器打印成镜像
&lt;/h2&gt;&lt;h2 id="cicd的设计流程"&gt;CICD的设计流程
&lt;/h2&gt;</description></item><item><title>面试 | 百度信息安全运维</title><link>https://hangliuc.github.io/topic/interview/experience/%E7%99%BE%E5%BA%A6%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E8%BF%90%E7%BB%B4/</link><pubDate>Tue, 02 Dec 2025 15:19:58 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/experience/%E7%99%BE%E5%BA%A6%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E8%BF%90%E7%BB%B4/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post 面试 | 百度信息安全运维" /&gt;&lt;h2 id="pod-可能存在哪些状态"&gt;pod 可能存在哪些状态
&lt;/h2&gt;&lt;h2 id="你们告警架构"&gt;你们告警架构
&lt;/h2&gt;&lt;h2 id="counter和gauge-区别什么场景下用counter"&gt;Counter和Gauge 区别？什么场景下用Counter
&lt;/h2&gt;&lt;h2 id="502504区别"&gt;502、504区别
&lt;/h2&gt;&lt;h2 id="1921681025-所有的ip地址范围"&gt;192.168.1.0/25 所有的IP地址范围
&lt;/h2&gt;&lt;h2 id="一台机器如何放行80拒绝所有端口"&gt;一台机器如何放行80，拒绝所有端口
&lt;/h2&gt;&lt;h2 id="python-使用装饰器统计函数运行时间"&gt;python 使用装饰器统计函数运行时间
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&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-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wraps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timer_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@wraps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 保留原函数的元信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 高精度计时开始&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 执行原函数并获取结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 计时结束&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;函数 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 执行耗时: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 秒&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="c1"&gt;# 返回原函数结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@timer_decorator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 模拟耗时操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 调用函数，自动计时&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sum_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;计算结果: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sum_result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&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;</description></item><item><title>面试 | 字节国际电商</title><link>https://hangliuc.github.io/topic/interview/experience/%E5%AD%97%E8%8A%82%E5%9B%BD%E9%99%85%E7%94%B5%E5%95%86sre/</link><pubDate>Tue, 02 Dec 2025 15:19:21 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/experience/%E5%AD%97%E8%8A%82%E5%9B%BD%E9%99%85%E7%94%B5%E5%95%86sre/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post 面试 | 字节国际电商" /&gt;&lt;h2 id="一轮面试"&gt;一轮面试
&lt;/h2&gt;&lt;h3 id="k8s-中几种探针方式"&gt;k8s 中几种探针方式
&lt;/h3&gt;&lt;h3 id="跨region-双写三写数据一致性问题"&gt;跨region 双写、三写数据一致性问题
&lt;/h3&gt;&lt;h3 id="pod-资源节点抢占解决方案"&gt;pod 资源节点抢占解决方案
&lt;/h3&gt;&lt;h3 id="k8s-服务中扩缩怎样实现"&gt;k8s 服务中扩缩怎样实现
&lt;/h3&gt;&lt;h3 id="一次troubleshooting"&gt;一次troubleshooting
&lt;/h3&gt;&lt;h3 id="报警架构如何做的"&gt;报警架构如何做的
&lt;/h3&gt;&lt;h3 id="当前工作中的存在的痛点"&gt;当前工作中的存在的痛点
&lt;/h3&gt;&lt;h3 id="你会关注业务哪些指标"&gt;你会关注业务哪些指标
&lt;/h3&gt;&lt;h3 id="广告竞价返回的数据格式"&gt;广告竞价返回的数据格式
&lt;/h3&gt;&lt;h3 id="一道力扣题-复原ip地址"&gt;一道力扣题 复原IP地址
&lt;/h3&gt;</description></item><item><title>SRE面试题汇总 | 面试专题的一些规划</title><link>https://hangliuc.github.io/topic/interview/structure/</link><pubDate>Tue, 02 Dec 2025 15:06:33 +0800</pubDate><guid>https://hangliuc.github.io/topic/interview/structure/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/interview_cover.webp" alt="Featured image of post SRE面试题汇总 | 面试专题的一些规划" /&gt;&lt;ul&gt;
&lt;li&gt;面试经历&lt;/li&gt;
&lt;li&gt;liunx&lt;/li&gt;
&lt;li&gt;container &amp;amp;&amp;amp; k8s&lt;/li&gt;
&lt;li&gt;network&lt;/li&gt;
&lt;li&gt;database&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;program&lt;/li&gt;
&lt;li&gt;SRE&lt;/li&gt;
&lt;li&gt;&amp;hellip;..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部分面试题来自崔亮的博客&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.cuiliangblog.cn/detail/article/89" target="_blank" rel="noopener"
&gt;https://www.cuiliangblog.cn/detail/article/89&lt;/a&gt;&lt;/p&gt;</description></item><item><title>mysql 常用命令</title><link>https://hangliuc.github.io/ops/mysql/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 01 Dec 2025 21:14:56 +0800</pubDate><guid>https://hangliuc.github.io/ops/mysql/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post mysql 常用命令" /&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&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-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 切换到mysql数据库
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="n"&gt;MySQL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="k"&gt;none&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- 用户查看
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="n"&gt;MySQL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- 查看用户拥有权限
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="n"&gt;MySQL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;grants&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- 创建用户
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xxx&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xxxx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- 授权
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;数据库&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;数据表&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- 删除用户
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DROP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XXX&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;</description></item><item><title>ASG Node 数据盘挂载失败</title><link>https://hangliuc.github.io/ops/linux/asg-node-disk-issue/</link><pubDate>Mon, 01 Dec 2025 11:45:14 +0800</pubDate><guid>https://hangliuc.github.io/ops/linux/asg-node-disk-issue/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post ASG Node 数据盘挂载失败" /&gt;&lt;h2 id="问题背景"&gt;问题背景
&lt;/h2&gt;&lt;p&gt;data 数据盘挂载失败，日志文件会写入根盘，导致磁盘多次报警&lt;/p&gt;
&lt;p&gt;内核还没有来得及刷新分区表生成 /dev/nvme1n1p1 设备文件，就执行mkfs 命令，导致格式化失败。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hangliuc.github.io/ops/linux/asg-node-disk-issue/disk_error.webp"
width="1567"
height="983"
srcset="https://hangliuc.github.io/ops/linux/asg-node-disk-issue/disk_error_hu_38870736248a0a09.webp 480w, https://hangliuc.github.io/ops/linux/asg-node-disk-issue/disk_error_hu_99af62288789de4d.webp 1024w"
loading="lazy"
alt="磁盘错误截图"
class="gallery-image"
data-flex-grow="159"
data-flex-basis="382px"
&gt;&lt;/p&gt;
&lt;h2 id="解决方法"&gt;解决方法
&lt;/h2&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install parted -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parted -s /dev/nvme1n1 -- mklabel gpt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parted -s /dev/nvme1n1 -- mkpart primary ext4 0% 100%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;partprobe /dev/nvme1n1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;udevadm settle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -e /dev/nvme1n1p1 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; sleep 1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs -t ext4 /dev/nvme1n1p1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount /dev/nvme1n1p1 /data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/dev/nvme1n1p1 /data ext4 defaults 0 0&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&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;h2 id=""&gt;
&lt;/h2&gt;&lt;h3 id="parted-中-0-与-0-的区别"&gt;parted 中 0 与 0% 的区别
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0&lt;/strong&gt;：表示强制要求分区从磁盘的 第 0 个字节/扇区 开始。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0%&lt;/strong&gt;：自动对齐，最佳对齐点 开始分区。parted 会自动跳过前面的保留空间，通常将起始位置设定在 扇区 2048 开始。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="partprobe-devnvme1n1"&gt;partprobe /dev/nvme1n1
&lt;/h3&gt;&lt;p&gt;通知内核（Kernel）立即重读分区表&lt;/p&gt;
&lt;h3 id="udevadm-settle"&gt;udevadm settle
&lt;/h3&gt;&lt;p&gt;阻塞（暂停）脚本执行，直到 udev 处理完所有设备事件。
所有设备文件都创建好，脚本才能继续执行。&lt;/p&gt;
&lt;h2 id="用户数据脚本"&gt;用户数据脚本
&lt;/h2&gt;&lt;p&gt;用户脚本位置：
/var/lib/cloud/instance/user-data.txt&lt;/p&gt;
&lt;p&gt;日志位置：
/var/log/cloud-init-output.log&lt;/p&gt;</description></item><item><title>Hugo ｜ 基础规划和使用方法</title><link>https://hangliuc.github.io/topic/blogging/hugo_usage_method/</link><pubDate>Thu, 27 Nov 2025 15:16:29 +0800</pubDate><guid>https://hangliuc.github.io/topic/blogging/hugo_usage_method/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/blog_cover.webp" alt="Featured image of post Hugo ｜ 基础规划和使用方法" /&gt;&lt;h2 id="hugo-目录结构"&gt;Hugo 目录结构
&lt;/h2&gt;&lt;p&gt;content/: 存放你的 Markdown 文章（数据库）。&lt;/p&gt;
&lt;p&gt;layouts/ &amp;amp; themes/: 存放前端代码（HTML/CSS 模版）。&lt;/p&gt;
&lt;p&gt;static/: 存放图片、CNAME 文件等静态资源。&lt;/p&gt;
&lt;p&gt;hugo.toml (或 .yaml/.json): 整个站点的配置文件（相当于 k8s 的 configmap）&lt;/p&gt;
&lt;h2 id="评论系统"&gt;评论系统
&lt;/h2&gt;&lt;p&gt;Giscus 评论系统
&lt;a class="link" href="https://giscus.app/zh-CN" target="_blank" rel="noopener"
&gt;https://giscus.app/zh-CN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;hugo.yaml&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ... 其他配置 ...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;giscus &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 将默认的 disqus 改为 giscus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;giscus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hangliuc/blog-hugo &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 换成你的 &amp;#34;用户名/仓库名&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;repoID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;R_kgD...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 填入第二步获取的 data-repo-id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 你选择的分类名&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;categoryID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DIC_kw...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;--- 填入第二步获取的 data-category-id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pathname&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;light&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;darkTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dark_dimmed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reactionsEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;emitMetadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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;除此之外需要去GitHub 授权 Giscus 评论系统
参考链接 &lt;a class="link" href="https://giscus.app/zh-CN" target="_blank" rel="noopener"
&gt;https://giscus.app/zh-CN&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="分类和标签"&gt;分类和标签
&lt;/h2&gt;&lt;p&gt;Categories (分类)：像文件夹一样，通常是树状、排他性的。一篇文章通常属于 1-2 个分类（例如“运维”、“容器化”）。&lt;/p&gt;
&lt;p&gt;Tags (标签)：像便利贴一样，是扁平、描述性的。一篇文章可以有多个标签（例如“Docker”、“网络”、“Troubleshooting”、“Linux”）。&lt;/p&gt;
&lt;h2 id="一些可用链接"&gt;一些可用链接
&lt;/h2&gt;&lt;p&gt;图标下载网站 &lt;a class="link" href="https://tabler.io/icons" target="_blank" rel="noopener"
&gt;https://tabler.io/icons&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="一些使用-hugo-theme-stack-搭建的优秀网站"&gt;一些使用 hugo-theme-stack 搭建的优秀网站
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://liuhouliang.com/categories/web/" target="_blank" rel="noopener"
&gt;https://liuhouliang.com/categories/web/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.reincarnatey.net/" target="_blank" rel="noopener"
&gt;https://blog.reincarnatey.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://zfj1441.com/archives/" target="_blank" rel="noopener"
&gt;https://zfj1441.com/archives/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://hyrtee.github.io/2023/start-blog/#%E8%AF%84%E8%AE%BA" target="_blank" rel="noopener"
&gt;https://hyrtee.github.io/2023/start-blog/#%E8%AF%84%E8%AE%BA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.shaohantian.com/" target="_blank" rel="noopener"
&gt;https://www.shaohantian.com/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Vim 使用技巧</title><link>https://hangliuc.github.io/ops/linux/vim/</link><pubDate>Thu, 27 Nov 2025 11:02:53 +0800</pubDate><guid>https://hangliuc.github.io/ops/linux/vim/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post Vim 使用技巧" /&gt;&lt;h1 id="vim-常用命令"&gt;vim 常用命令
&lt;/h1&gt;&lt;h2 id="光标移动"&gt;光标移动
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;h&lt;/strong&gt; 或 &lt;strong&gt;退格&lt;/strong&gt;：左移一个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;l&lt;/strong&gt; 或 &lt;strong&gt;空格&lt;/strong&gt;：右移一个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;j&lt;/strong&gt;：下移一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k&lt;/strong&gt;：上移一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gj&lt;/strong&gt;：移动到一段内的下一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gk&lt;/strong&gt;：移动到一段内的上一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+&lt;/strong&gt; 或 &lt;strong&gt;Enter&lt;/strong&gt;：移至下一行第一个非空白字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-&lt;/strong&gt;：移至上一行第一个非空白字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;w&lt;/strong&gt;：前移一个单词，停在下一个单词开头&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;W&lt;/strong&gt;：前移一个单词（忽略部分标点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;e&lt;/strong&gt;：前移一个单词，停在下一个单词末尾&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt;：前移一个单词，停在标点（如有）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;b&lt;/strong&gt;：后移一个单词，停在上一个单词开头&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B&lt;/strong&gt;：后移一个单词（忽略部分标点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(&lt;/strong&gt;：前移 1 句&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;)&lt;/strong&gt;：后移 1 句&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;{&lt;/strong&gt;：前移 1 段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;}&lt;/strong&gt;：后移 1 段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gg&lt;/strong&gt;：到文件头部&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G&lt;/strong&gt;：到文件尾部&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$&lt;/strong&gt;：到行尾&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt;：到行首&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="翻屏"&gt;翻屏
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + f&lt;/strong&gt;：下翻一屏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + b&lt;/strong&gt;：上翻一屏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + d&lt;/strong&gt;：下翻半屏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + u&lt;/strong&gt;：上翻半屏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + e&lt;/strong&gt;：向下滚动一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + y&lt;/strong&gt;：向上滚动一行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n%&lt;/strong&gt;：到文件 n% 位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zz&lt;/strong&gt;：当前行移到屏幕中央&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zt&lt;/strong&gt;：当前行移到屏幕顶端&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zb&lt;/strong&gt;：当前行移到屏幕底端&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="插入"&gt;插入
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt;：在当前行第一个非空字符前插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gI&lt;/strong&gt;：在当前行第一列插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a&lt;/strong&gt;：在光标后插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;：在当前行末尾插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;o&lt;/strong&gt;：在下方新建一行插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O&lt;/strong&gt;：在上方新建一行插入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;:r filename&lt;/strong&gt;：在当前位置插入另一个文件内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;:[n]r filename&lt;/strong&gt;：在第 n 行插入另一个文件内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="剪切和复制"&gt;剪切和复制
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[n]x&lt;/strong&gt;：剪切光标右边 n 个字符（相当于 d[n]l）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[n]X&lt;/strong&gt;：剪切光标左边 n 个字符（相当于 d[n]h）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y&lt;/strong&gt;：复制可视模式下选中的文本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;yy&lt;/strong&gt; 或 &lt;strong&gt;Y&lt;/strong&gt;：复制整行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y[n]w&lt;/strong&gt;：复制 n 个词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y[n]l&lt;/strong&gt;：复制光标右边 n 个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y[n]h&lt;/strong&gt;：复制光标左边 n 个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y$&lt;/strong&gt;：从光标到行尾复制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y0&lt;/strong&gt;：从光标到行首复制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;:m,ny&lt;/strong&gt;：复制第 m 到 n 行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;y1G&lt;/strong&gt; 或 &lt;strong&gt;ygg&lt;/strong&gt;：复制光标以上所有行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;yG&lt;/strong&gt;：复制光标以下所有行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d&lt;/strong&gt;：删除（剪切）可视模式下选中的文本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d$&lt;/strong&gt; 或 &lt;strong&gt;D&lt;/strong&gt;：删除到行尾&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d[n]w&lt;/strong&gt;：删除 n 个单词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d[n]l&lt;/strong&gt;：删除光标右边 n 个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d[n]h&lt;/strong&gt;：删除光标左边 n 个字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d0&lt;/strong&gt;：删除到行首&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p&lt;/strong&gt;：在光标后粘贴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;：在光标前粘贴&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="查找和替换"&gt;查找和替换
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/something&lt;/strong&gt;：向后查找 something&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;?something&lt;/strong&gt;：向前查找 something&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n&lt;/strong&gt;：向后查找下一个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&lt;/strong&gt;：向前查找下一个&lt;/li&gt;
&lt;li&gt;s/old/new：替换当前行第一个 old&lt;/li&gt;
&lt;li&gt;s/old/new/g：替换当前行所有 old&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%s/old/new/g&lt;/strong&gt;：替换整个文件的所有 old&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技巧"&gt;技巧
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:set paste&lt;/strong&gt;：解决粘贴时格式错乱问题&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description></item><item><title>Containerd命令行管理工具</title><link>https://hangliuc.github.io/ops/docker/containerd%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/</link><pubDate>Thu, 27 Nov 2025 10:51:50 +0800</pubDate><guid>https://hangliuc.github.io/ops/docker/containerd%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post Containerd命令行管理工具" /&gt;&lt;h1 id="containerd-命令行管理工具"&gt;Containerd 命令行管理工具
&lt;/h1&gt;&lt;h2 id="kubernetes-从-docker-转向-containerd-的原因"&gt;Kubernetes 从 Docker 转向 containerd 的原因
&lt;/h2&gt;&lt;h3 id="架构层面的原因"&gt;架构层面的原因
&lt;/h3&gt;&lt;p&gt;kubelet 启动一个容器的流程:&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 CRI 接口&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dockershim &lt;span class="o"&gt;(&lt;/span&gt;K8s 维护的 CRI 转换层&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 Docker Engine API&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Engine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 containerd API&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 OCI 接口&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;runc &lt;span class="o"&gt;(&lt;/span&gt;OCI runtime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─&amp;gt; 真正创建 Linux 容器 &lt;span class="o"&gt;(&lt;/span&gt;namespace, cgroups, rootfs...&lt;span class="o"&gt;)&lt;/span&gt;
&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;ul&gt;
&lt;li&gt;Docker Engine 是一个 完整平台（构建镜像、管理网络、Volume、Swarm 等），这些对 K8s 来说都是多余的。&lt;/li&gt;
&lt;li&gt;dockershim 只是为了把 CRI（K8s 语言）翻译成 Docker API（Docker 语言）。&lt;/li&gt;
&lt;li&gt;实际执行容器的，依然是 containerd + runc。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当 kubelet 直接使用 containerd 时，调用链简化为：&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 CRI 接口&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd &lt;span class="o"&gt;(&lt;/span&gt;内置 CRI 插件&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &lt;span class="o"&gt;(&lt;/span&gt;调用 OCI 接口&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;runc &lt;span class="o"&gt;(&lt;/span&gt;OCI runtime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─&amp;gt; 真正创建 Linux 容器 &lt;span class="o"&gt;(&lt;/span&gt;namespace, cgroups, rootfs...&lt;span class="o"&gt;)&lt;/span&gt;
&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;h3 id="减少维护成本"&gt;减少维护成本
&lt;/h3&gt;&lt;p&gt;kubernetes 从 1.24 开始，默认使用 containerd 作为容器运行时。不再去维护中间dockershim&lt;/p&gt;
&lt;h3 id="性能提升"&gt;性能提升
&lt;/h3&gt;&lt;p&gt;少一层调用，性能和稳定性更好。&lt;/p&gt;
&lt;h2 id="ctr--containerd自带的命令行管理工具"&gt;ctr &amp;ndash; Containerd自带的命令行管理工具
&lt;/h2&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;span class="lnt"&gt;2
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列出所有命名空间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr namespaces list
&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;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;span class="lnt"&gt;2
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 镜像相关命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr -n&lt;span class="o"&gt;=&lt;/span&gt;k8s.io images -h
&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;strong&gt;ctr 上传、拉取镜像时不支持登陆认证，只能通过&amp;ndash;user携带用户密码操作&lt;/strong&gt;&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr -n&lt;span class="o"&gt;=&lt;/span&gt;k8s.io images pull &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --user &amp;lt;username&amp;gt;:&amp;lt;password&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; myregistry.example.com/myrepo/nginx:latest
&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;h2 id="nerdctl-最接近docker-cli"&gt;nerdctl (最接近docker CLI)
&lt;/h2&gt;&lt;p&gt;基本和docker CLI命令一致，只是在命令前添加了&lt;code&gt;nerdctl&lt;/code&gt;前缀&lt;/p&gt;
&lt;h3 id="安装nerdctl"&gt;安装nerdctl
&lt;/h3&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.2.0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 自动识别架构&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname -m&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Unsupported architecture: &lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOWNLOAD_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://github.com/containerd/nerdctl/releases/download/v&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/nerdctl-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Downloading nerdctl v&lt;/span&gt;&lt;span class="nv"&gt;$VERSION&lt;/span&gt;&lt;span class="s2"&gt; for &lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOWNLOAD_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -O nerdctl.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Extracting...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzf nerdctl.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压后会得到 nerdctl、containerd、runc 等二进制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一般 nerdctl 位于当前目录的 nerdctl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TARGET_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/bin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Moving binaries to &lt;/span&gt;&lt;span class="nv"&gt;$TARGET_DIR&lt;/span&gt;&lt;span class="s2"&gt; (require sudo)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv nerdctl &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cleaning up…&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f nerdctl.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;🎉 nerdctl installation completed!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Version check:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/nerdctl --version
&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;To list local Kubernetes containers:&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nerdctl --namespace k8s.io ps -a
&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;</description></item><item><title>容器网络影响宿主机入网问题排查</title><link>https://hangliuc.github.io/ops/docker/docker-network-issue/</link><pubDate>Wed, 26 Nov 2025 10:38:20 +0800</pubDate><guid>https://hangliuc.github.io/ops/docker/docker-network-issue/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post 容器网络影响宿主机入网问题排查" /&gt;&lt;h1 id="容器网络影响宿主机入网问题排查"&gt;容器网络影响宿主机入网问题排查
&lt;/h1&gt;&lt;h2 id="问题描述"&gt;问题描述
&lt;/h2&gt;&lt;p&gt;发现172.27.0.0/16，172.26.0.0/16 网段的服务无法访问宿主机的服务&lt;/p&gt;
&lt;h2 id="问题排查"&gt;问题排查
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://hangliuc.github.io/ops/docker/docker-network-issue/ifconfig.webp"
width="1046"
height="1028"
srcset="https://hangliuc.github.io/ops/docker/docker-network-issue/ifconfig_hu_4dcb2cc1b38c7b37.webp 480w, https://hangliuc.github.io/ops/docker/docker-network-issue/ifconfig_hu_d3f1ef0eff0562c1.webp 1024w"
loading="lazy"
alt="网卡配置"
class="gallery-image"
data-flex-grow="101"
data-flex-basis="244px"
&gt;&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;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker network ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NETWORK ID NAME DRIVER SCOPE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8eacdcbf22d7 7b-full_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f22af6f77037 bridge bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4a56201be716 host host local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6e36d25cdbb0 llama2-13b-lora_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fb2839792d18 llama3-8b_lora_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;d1f916892b02 none null local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2c9c2578ecce tgi_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;446845acbad5 v2-9b_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;d1301d605f3c v2-27b-it_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;c3d523d51ee4 v3-8b_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1d3cf7bd9665 v4-9b_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;59aecf59ca81 v31-8b_default bridge local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;42cca879c18f webui-docker_default bridge local
&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;发现1d3cf7bd9665、1d3cf7bd9665占用了172.27.0.0/16，172.26.0.0/16 网段，导致路由冲突。Linux 内核的路由机制会优先选择 最匹配的路由，它会覆盖默认路由，流量会被错误的流向docker。&lt;/p&gt;
&lt;h2 id="解决方法"&gt;解决方法
&lt;/h2&gt;&lt;h3 id="修改docker-配置不使用冲突网段"&gt;修改docker 配置，不使用冲突网段
&lt;/h3&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;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&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-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;bip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;192.168.100.1/24&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default-address-pools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;192.168.200.0/20&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&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;h3 id="创建容器时使用特定网络"&gt;创建容器时使用特定网络
&lt;/h3&gt;&lt;p&gt;docker network create &amp;ndash;subnet=xx.xx.xx.xx/24 my_custom_network&lt;/p&gt;
&lt;h3 id="如果必须保留冲突网段修改宿主机路由让外部网络优先"&gt;如果必须保留冲突网段，修改宿主机路由，让外部网络优先
&lt;/h3&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;span class="lnt"&gt;2
&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-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip route del 172.27.0.0/16
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip route add 172.27.0.0/16 via &amp;lt;外部网关&amp;gt; metric &lt;span class="m"&gt;100&lt;/span&gt;
&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;</description></item><item><title>ansible | 缓存ssh密钥避免每次输入密码</title><link>https://hangliuc.github.io/ops/ansible/ansible-%E7%BC%93%E5%AD%98ssh%E5%AF%86%E9%92%A5/</link><pubDate>Tue, 26 Nov 2024 10:00:00 +0800</pubDate><guid>https://hangliuc.github.io/ops/ansible/ansible-%E7%BC%93%E5%AD%98ssh%E5%AF%86%E9%92%A5/</guid><description>&lt;img src="https://hangliuc.github.io/img/cover/ops_cover.webp" alt="Featured image of post ansible | 缓存ssh密钥避免每次输入密码" /&gt;&lt;h1 id="背景"&gt;背景
&lt;/h1&gt;&lt;p&gt;使用ansible时，为了避免每次执行任务都需要输入ssh密码，我们可以缓存ssh密钥。&lt;/p&gt;
&lt;h1 id="ansible-缓存ssh密钥"&gt;ansible 缓存ssh密钥
&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;启动 ssh-agent 后台程序&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;eval &amp;ldquo;$(ssh-agent -s)&amp;rdquo;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;将密钥添加至 ssh-add，只输入一次密码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ssh-add ~/.ssh/xxx&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;验证密钥是否缓存成功&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ssh-add -l&lt;/p&gt;</description></item><item><title>Hello World</title><link>https://hangliuc.github.io/posts/hello-world/</link><pubDate>Sun, 26 Nov 2023 10:00:00 +0800</pubDate><guid>https://hangliuc.github.io/posts/hello-world/</guid><description>&lt;p&gt;这是我的第一篇 Hugo 博客！&lt;/p&gt;
&lt;h2 id="为什么选择-hugo"&gt;为什么选择 Hugo？
&lt;/h2&gt;&lt;p&gt;作为 SRE，我喜欢静态二进制文件的简单和纯粹。&lt;/p&gt;
&lt;h2 id="hugo-目录结构"&gt;Hugo 目录结构
&lt;/h2&gt;&lt;p&gt;content/: 存放你的 Markdown 文章（数据库）。&lt;/p&gt;
&lt;p&gt;layouts/ &amp;amp; themes/: 存放前端代码（HTML/CSS 模版）。&lt;/p&gt;
&lt;p&gt;static/: 存放图片、CNAME 文件等静态资源。&lt;/p&gt;
&lt;p&gt;hugo.toml (或 .yaml/.json): 整个站点的配置文件（相当于 k8s 的 configmap）&lt;/p&gt;</description></item><item><title>关于我</title><link>https://hangliuc.github.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://hangliuc.github.io/about/</guid><description>&lt;h2 id="-你好"&gt;👋 你好！
&lt;/h2&gt;&lt;p&gt;我是 &lt;strong&gt;Liu Hang&lt;/strong&gt;，一名 SRE。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💻 &lt;strong&gt;Site Reliability Engineer&lt;/strong&gt; | ☁️ &lt;strong&gt;Cloud Native Enthusiast&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Automate everything, monitor the rest.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="-技术栈"&gt;🛠️ 技术栈
&lt;/h3&gt;&lt;p align="center"&gt;
&lt;a href="https://skillicons.dev"&gt;
&lt;img src="https://skillicons.dev/icons?i=py,go,git,gitlab,kubernetes,docker,grafana,prometheus,jenkins,nginx,vim,aws,gcp,redis,mysql,vscode,terraform,redhat,powershell,github" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id="-为什么做这个博客"&gt;❔ 为什么做这个博客
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;构建私有知识库，记录工作中遇到的问题和解决方法，把一次经验转为长期可复用资产。尽量避免更新一些基础的知识，这些问题通过浏览器搜索/AI获取即可，增强搜索知识的能力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在搭建过程中也对之前的技术进行了融合再学习，docker、nginx、certbot&amp;hellip; 对于工作生产环境，一些基础知识可能并不会用到（比如 nginx 配置、docker-compose 、Go 语言等），但是在搭建过程中也会遇到一些问题，解决途中有一些新的领悟。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从0-1实践一个完整小项目，比如监控告警系统、ELK日志、CDN 加速与缓存策略等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当然也可以作为简历展示，和各个技术平台进行融合，提升自己的技术水平和商业变现能力。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如果有什么建议或者问题，欢迎评论或者联系我。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="-博客架构"&gt;🚂 博客架构
&lt;/h3&gt;&lt;p&gt;目前关于blog 的一些todo &lt;a class="link" href="https://hangliuc.github.io/topic/blogging/todo/" target="_blank" rel="noopener"
&gt;todo.md&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="-联系我"&gt;📫 联系我
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Email: &lt;a class="link" href="mailto:iliuhang@163.com" &gt;iliuhang@163.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: @hangliuc&lt;/li&gt;
&lt;li&gt;weichat：hangliuc-&lt;/li&gt;
&lt;li&gt;csdn：hangliuc&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>归档</title><link>https://hangliuc.github.io/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://hangliuc.github.io/archives/</guid><description/></item><item><title>搜索</title><link>https://hangliuc.github.io/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://hangliuc.github.io/search/</guid><description>&lt;link href="https://hangliuc.github.io/pagefind/pagefind-ui.css" rel="stylesheet"&gt;
&lt;script src="https://hangliuc.github.io/pagefind/pagefind-ui.js"&gt;&lt;/script&gt;
&lt;div id="search"&gt;&lt;/div&gt;
&lt;script&gt;
window.addEventListener('DOMContentLoaded', (event) =&gt; {
const search = new PagefindUI({
element: "#search",
showSubResults: true,
translations: {
placeholder: "搜索文档...",
zero_results: "没有找到 [SEARCH_TERM]",
count_one: "找到 1 篇",
count_many: "找到 [COUNT] 篇",
}
});
const keyword = new URLSearchParams(window.location.search).get("keyword");
if (keyword) search.triggerSearch(keyword);
});
&lt;/script&gt;
&lt;style&gt;
#search {
margin-top: 20px;
min-height: 200px;
}
.pagefind-ui__result-title {
font-weight: bold;
color: var(--primary);
}
&lt;/style&gt;</description></item></channel></rss>