<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>EasonYin&apos;s blog</title><description>YINSHILIN</description><link>https://blog.easonyin.xyz/</link><language>zh_CN</language><item><title>超详细教程：如何在 Linux 上安装和配置 Sublime Text</title><link>https://blog.easonyin.xyz/posts/linux-sublime-text/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/linux-sublime-text/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sublime Text 是一款风靡全球的源代码编辑器，凭借其极快的启动速度、流畅的交互体验以及强大的插件扩展能力，它早已成为无数开发者手中的&quot;神兵利器&quot;。无论你是刚入门编程的萌新，还是刚刚从 Windows 或 macOS 切换到 Linux 系统的资深码农，Sublime Text 都能为你提供一致且高效的编码环境。它支持几乎所有主流的编程语言（如 Python、JavaScript、C++、Go 等）和标记语言（如 HTML、CSS、Markdown），并提供了命令面板、多行编辑、自动补全、代码片段等实用功能。&lt;/p&gt;
&lt;p&gt;更重要的是，Sublime Text 完美覆盖了 Linux、macOS 和 Windows 三大平台。本文将为你奉上一份保姆级的指南，涵盖在各类 Linux 发行版上安装 Sublime Text 的多种方法，以及安装后必做的初始化配置，帮助你快速上手。&lt;/p&gt;
&lt;h2&gt;一、使用系统包管理器安装（推荐）&lt;/h2&gt;
&lt;p&gt;绝大多数 Linux 发行版都内置了强大的包管理器，通过包管理器安装软件不仅能自动处理依赖关系，还便于后续的更新与卸载。Sublime Text 官方为以下主流发行版提供了专属的软件源，操作非常简便。&lt;/p&gt;
&lt;h3&gt;1. Ubuntu / Debian 及其衍生版（如 Linux Mint）&lt;/h3&gt;
&lt;p&gt;对于 Ubuntu 和 Debian 系用户，我们使用 APT 包管理器。首先需要添加官方的 GPG 密钥，以确保下载的软件包是安全且未被篡改的。打开终端（快捷键 &lt;code&gt;Ctrl+Alt+T&lt;/code&gt;），依次执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 下载并添加 GPG 密钥
wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -

# 2. 将 Sublime Text 官方存储库添加到系统源列表
echo &quot;deb https://download.sublimetext.com/ apt/dev/&quot; | sudo tee /etc/apt/sources.list.d/sublime-text.list

# 3. 更新本地软件包缓存并安装
sudo apt update
sudo apt install sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装过程大约需要一两分钟。完成后，你可以在应用程序菜单中搜索 &quot;Sublime Text&quot; 并启动它。如果未来想要卸载该软件，只需执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Arch Linux 及其衍生版（如 Manjaro）&lt;/h3&gt;
&lt;p&gt;Arch Linux 以其滚动更新和简洁性著称，我们使用 pacman 来管理软件包。首先同样需要导入 GPG 密钥，然后添加仓库信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 下载并导入 GPG 密钥
curl -O https://download.sublimetext.com/sublimehq-pub.gpg
sudo pacman-key --add sublimehq-pub.gpg
sudo pacman-key --lsign-key 8A8F901A
rm sublimehq-pub.gpg

# 2. 将仓库地址追加到 pacman.conf 配置文件（注意架构，此处以 aarch64 为例，x86_64 请替换）
echo -e &quot;\n[sublime-text]\nServer = https://download.sublimetext.com/arch/stable/aarch64&quot; | sudo tee -a /etc/pacman.conf

# 3. 同步仓库并安装
sudo pacman -Syu
sudo pacman -S sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -R sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. CentOS / RHEL 系列&lt;/h3&gt;
&lt;p&gt;CentOS 用户习惯使用 YUM 包管理器。操作流程与 Ubuntu 类似，先导入密钥，再添加仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 导入 RPM GPG 密钥
sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg

# 2. 添加官方 YUM 仓库
sudo yum-config-manager --add-repo https://download.sublimetext.com/rpm/stable/x86_64/sublime-text.repo

# 3. 更新并安装
sudo yum update
sudo yum install sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若需删除，执行 &lt;code&gt;sudo yum remove sublime-text&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;4. Fedora&lt;/h3&gt;
&lt;p&gt;Fedora 采用了新一代的 DNF 包管理器，本质上是 YUM 的升级版，命令几乎一致：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 导入密钥
sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg

# 2. 添加 DNF 仓库
sudo dnf config-manager --add-repo https://download.sublimetext.com/rpm/stable/x86_64/sublime-text.repo

# 3. 更新并安装
sudo dnf update
sudo dnf install sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载命令：&lt;code&gt;sudo dnf remove sublime-text&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;5. openSUSE&lt;/h3&gt;
&lt;p&gt;openSUSE 使用 Zypper 作为包管理工具，操作方法同样非常直观：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 导入密钥
sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg

# 2. 添加仓库（-g -f 参数表示自动信任并刷新）
sudo zypper addrepo -g -f https://download.sublimetext.com/rpm/stable/x86_64/sublime-text.repo

# 3. 更新并安装
sudo zypper update
sudo zypper install sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载则使用 &lt;code&gt;sudo zypper rm sublime-text&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;二、通用安装方案：使用 Snap&lt;/h2&gt;
&lt;p&gt;如果你的 Linux 发行版不在上述列表之中（例如某些小众发行版），或者你在使用包管理器安装时遇到了依赖冲突等棘手问题，那么 Snap 将是你的最佳备选方案。Snap 是一种容器化的软件包格式，几乎能在所有现代 Linux 上运行，且自带了所有所需的依赖库。&lt;/p&gt;
&lt;p&gt;首先，你需要确认系统中是否已安装 Snap。在终端中输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;snap
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出了一串命令帮助信息，说明已安装；如果提示 &quot;command not found&quot;，则需先参照官方文档安装 Snapd 服务。安装好 Snap 后，只需一行命令即可搞定 Sublime Text：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo snap install sublime-text --classic
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;--classic&lt;/code&gt; 参数赋予了 Sublime Text 访问系统文件的权限，这是作为代码编辑器所必需的。卸载同样简单：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo snap remove sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;值得注意的是，Snap 版本通常会稍晚于官方 APT/YUM 仓库版本，但稳定性极佳，非常适合不想折腾环境的新手。&lt;/p&gt;
&lt;h2&gt;三、安装后的初始化配置与优化&lt;/h2&gt;
&lt;p&gt;软件装好了，但还只是个&quot;毛坯房&quot;。为了让编码体验更上一层楼，我们还需要进行一些必要的&quot;精装修&quot;。首次启动 Sublime Text 时，你会发现界面非常简洁，甚至有些功能默认是关闭的。别担心，跟着我一步步来。&lt;/p&gt;
&lt;h3&gt;1. 启用小地图视口（Sublime Text 4 专属）&lt;/h3&gt;
&lt;p&gt;如果你是 Sublime Text 的老用户，一定对右侧那个方便预览全局代码的&quot;小地图&quot;印象深刻。但在最新的 Sublime Text 4 中，小地图视口（即高亮显示当前可视区域的方框）默认被隐藏了。&lt;/p&gt;
&lt;p&gt;恢复方法很简单：点击顶部菜单栏的 Preferences（偏好设置） &amp;gt; Settings（设置）。这会打开一个名为 &lt;code&gt;Preferences.sublime-settings&lt;/code&gt; 的 JSON 配置文件。在花括号 &lt;code&gt;{}&lt;/code&gt; 内部，另起一行添加以下配置项：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;always_show_minimap_viewport&quot;: true,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存文件（快捷键 &lt;code&gt;Ctrl+S&lt;/code&gt;）。回到编辑界面，你会发现小地图右侧那个半透明的白色方框又回来了，浏览长文件时再也不会迷失方向。&lt;/p&gt;
&lt;h3&gt;2. 统一默认字体大小&lt;/h3&gt;
&lt;p&gt;很多新手会发现，Sublime Text 默认字体太小，看着费眼。每次手动调整又太麻烦。我们可以直接在配置文件中固定字体大小。在上面的同一个设置文件中加入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;font_size&quot;: 14,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数字 14 可以按需替换为 16 或 18，根据自己的屏幕和视力习惯来即可。从此打开任何文件，字体大小都会保持一致。&lt;/p&gt;
&lt;h3&gt;3. 设置缩进规则：Tab 转空格&lt;/h3&gt;
&lt;p&gt;在 Python、YAML 等对缩进严格的语言中，混用 Tab 和空格简直是灾难。Sublime Text 允许我们强制将 Tab 键转换为空格。在配置文件中添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;tab_size&quot;: 2,
&quot;translate_tabs_to_spaces&quot;: true,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我将 Tab 宽度设为 2（可根据团队规范改为 4），并开启自动转换。这样按下 Tab 键时，实际插入的就是空格，彻底避免缩进报错。&lt;/p&gt;
&lt;h3&gt;4. 安装 Package Control（插件管理器）&lt;/h3&gt;
&lt;p&gt;如果说 Sublime Text 是一把利剑，那么 Package Control 就是剑上的锋芒。它是 Sublime Text 的灵魂所在，没有它，你就无法便捷地安装各种第三方插件。&lt;/p&gt;
&lt;p&gt;安装步骤极其简单：点击菜单栏 Tools（工具） &amp;gt; Install Package Control...（安装 Package Control）。点击后，界面底部会显示正在安装，通常只需几秒钟，无需任何额外操作即可完成。&lt;/p&gt;
&lt;p&gt;安装成功后，按下快捷键 &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; 调出命令面板，输入 &quot;Package Control&quot;，你会看到一大堆相关命令，这代表安装已成功。&lt;/p&gt;
&lt;h3&gt;5. 实战演练：安装 Git 插件&lt;/h3&gt;
&lt;p&gt;作为示例，我们利用 Package Control 安装 Git 插件，方便在编辑器内直接管理版本控制。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按下 &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; 打开命令面板。&lt;/li&gt;
&lt;li&gt;输入 &lt;code&gt;Package Control: Install Package&lt;/code&gt; 并回车（选中该项）。&lt;/li&gt;
&lt;li&gt;在弹出的搜索框中输入 &lt;code&gt;Git&lt;/code&gt;，在结果列表中找到 &quot;Git&quot; 并点击安装。&lt;/li&gt;
&lt;li&gt;稍等片刻，安装完成后，你会在顶部菜单的 Tools 下看到 Git 的相关选项。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;请注意，这只是一个 Git 交互增强插件，你需要在系统层面自行安装原生的 Git 命令行工具（&lt;code&gt;sudo apt install git&lt;/code&gt; 或 &lt;code&gt;sudo dnf install git&lt;/code&gt;）才能配合使用。&lt;/p&gt;
&lt;h2&gt;四、结语&lt;/h2&gt;
&lt;p&gt;至此，你已经成功在 Linux 上安装了 Sublime Text，并完成了小地图修复、字体调优、缩进规整以及插件管理器的配置。现在的 Sublime Text 已经具备了一定的生产力基础。随着你使用时间的增长，你还会发现更多好用的插件（如 Emmet、Prettier、Dockerfile 语法高亮等），而这一切都可以通过 Package Control 轻松获取。&lt;/p&gt;
&lt;p&gt;Sublime Text 虽然轻量，但功能绝不轻量。希望这篇教程能够帮助你在 Linux 平台下搭建起得心应手的开发环境，让写代码这件事变得更加优雅和高效。如果在安装过程中遇到任何问题，不妨检查一下网络连接或确认 GPG 密钥是否正确导入，通常都能顺利解决。祝你编码愉快！&lt;/p&gt;
</content:encoded></item><item><title>这周开始用AI写代码，说说真实感受</title><link>https://blog.easonyin.xyz/posts/yong-ai-xie-daima/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/yong-ai-xie-daima/</guid><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;同事安利了快一个月，我一直没怎么当回事，这周终于抽空装上试了试，用AI工具辅助写代码，说说这几天用下来的实际感受，不吹不黑。&lt;/p&gt;
&lt;p&gt;第一天上手是有点懵的，一开始不太会问问题，描述需求描述得含糊，出来的代码也是驴唇不对马嘴。后来慢慢摸出点门道，需求说得越具体，比如明确要用什么库、输入输出是什么格式、边界情况怎么处理，出来的东西就越靠谱。跟带新人有点像，你说得清楚，对方才能干得对。&lt;/p&gt;
&lt;p&gt;最有用的场景其实不是从零写一个新功能，而是那种重复性高、但又不算难的活。比如写一堆结构类似的表单校验逻辑，或者把一个函数改写成另一种写法，这种活我以前得手动敲半天，现在描述一下规则，出来的代码大部分能直接用，改改细节就行，确实省了不少时间。&lt;/p&gt;
&lt;p&gt;但也踩了坑。有次让它帮我改一段涉及数据库事务的逻辑，看起来写得挺像那么回事，逻辑通顺、变量命名也规范，结果跑起来发现有个边界条件没处理对，并发情况下会出问题。这种bug比较隐蔽，代码读起来完全正常，不细测根本发现不了。这件事之后我对AI写的代码多了个心眼，尤其是涉及钱、涉及并发这种地方，会格外多测几遍，不敢直接无脑合并。&lt;/p&gt;
&lt;p&gt;另外一个体会是，它写的代码&quot;看起来很对&quot;这件事本身有点危险。因为格式工整、命名规范，容易让人下意识觉得靠谱，反而降低了警惕心，我自己就有一次差点直接提交了一段没跑通的代码，还好跑单测的时候发现不对。&lt;/p&gt;
&lt;p&gt;总的用下来，我现在把它当成一个手速很快、但需要盯着点的实习生用，简单重复的活交给它干效率确实高，核心逻辑和关键路径还是自己盯着写、自己测。工具是好工具，但脑子还是得自己带着。&lt;/p&gt;
</content:encoded></item><item><title>为什么手机晚上拍照总是一堆噪点</title><link>https://blog.easonyin.xyz/posts/wanshang-paizhao-zaodian/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/wanshang-paizhao-zaodian/</guid><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前几天晚上跟朋友吃饭，随手拍了张照片发朋友圈，放大一看画面全是密密麻麻的彩色小颗粒，跟撒了把沙子似的，尤其是暗的地方更明显。这玩意就是常说的噪点，白天拍基本看不出来，一到晚上就原形毕露。&lt;/p&gt;
&lt;p&gt;说白了噪点这东西，根子在于手机的传感器太小。跟单反、微单比起来，手机摄像头的感光元件面积小得多，能接收到的光线本来就有限。白天光线充足，传感器捕捉到的信号足够&quot;扎实&quot;，噪点自然不明显。晚上光线弱，传感器为了让画面看起来够亮，只能把信号放大，也就是提高ISO，这个放大的过程会把信号里混杂的电子噪声一起放大，画面就变颗粒感了。&lt;/p&gt;
&lt;p&gt;这个原理其实跟音响开得特别大声，底噪也跟着变大是一个道理，本来听不见的电流声，音量拉满之后就明显了。&lt;/p&gt;
&lt;p&gt;现在手机厂商为了解决这个问题，普遍用了个招数叫多帧合成，就是快门按下去的一瞬间其实连续拍了好几张甚至十几张，算法把这些照片对齐叠加，用统计学的方式把随机分布的噪点&quot;平均&quot;掉，同时保留真实的画面细节。这也是为什么现在手机夜景模式按下快门之后要等个一两秒才出图，因为后台在忙着算这些东西。&lt;/p&gt;
&lt;p&gt;想拍得干净点也有几个笨办法。手尽量端稳，拍摄时长了才能让多帧合成效果好；实在手抖就找个地方架一下，桌子边缘、栏杆都行；另外别硬开最大变焦拍暗处，数码变焦本身就是裁切放大，会让噪点更明显，能靠近点拍就靠近点拍。&lt;/p&gt;
&lt;p&gt;如果拍出来的照片已经有噪点了，后期修图软件里的降噪功能能救一部分，但降噪和保留细节永远是拿一个换一个，降太狠画面会发糊，跟蒙了层雾似的，所以前期能拍好还是尽量前期解决，后期只能算亡羊补牢。&lt;/p&gt;
</content:encoded></item><item><title>攒了台新电脑，说说这次踩的坑</title><link>https://blog.easonyin.xyz/posts/zan-xin-diannao/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/zan-xin-diannao/</guid><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用了快五年的台式机终于扛不住了，风扇一转就跟拖拉机似的，上个月狠心决定自己攒一台。本来以为这种事现在网上教程一搜一大把，应该挺简单，结果还是踩了不少坑，记一下。&lt;/p&gt;
&lt;p&gt;第一个坑是主板和内存不兼容。我买的内存是市面上比较新的一批条子，主板BIOS版本比较老，插上去直接不开机，黑屏，风扇转但没有任何显示信号。折腾了一晚上以为是内存坏了，去店里换了根新的还是一样。后来在论坛里搜到有人说这种情况可能是主板BIOS没适配新内存的时序，得先拿旧内存把BIOS刷到最新版本，再换回新内存。跑了趟电脑城借了根旧内存条把系统点亮、刷完BIOS，再插回新内存，果然就好了。这个坑纯粹是信息差，早知道能少跑两趟。&lt;/p&gt;
&lt;p&gt;第二个是电源线材没配齐。买电源的时候图便宜买了个模组电源，结果显卡需要的12VHPWR接口那根线压根没在标配里，得单独买。当时东西都装好了才发现显卡插不上电，又等了两天快递，机箱开着盖子晾在那儿。&lt;/p&gt;
&lt;p&gt;第三个是散热器扣具装反了，第一次开机CPU温度直接干到90多度，风扇狂转跟拖拉机没区别（就是想换这个才攒的新机，结果新机比旧的还吵）。拆开一看是散热器底座没完全贴合CPU，重新涂了硅脂、扣具方向调了一下，温度立马降到四十多度，风扇也安静下来了。&lt;/p&gt;
&lt;p&gt;最后一个比较无语的坑是忘记装机箱前置IO线的时候看清楚正负极，开机键接反了，按了半天没反应，还以为主板坏了，排查了快一个小时才发现是这么点小事。&lt;/p&gt;
&lt;p&gt;整个装机过程从满心期待到几度想撂挑子，前前后后花了快一周才彻底搞定，中间有两次半夜两点还在群里问人。不过现在开机安静、跑分也上去了，之前卡成PPT的游戏现在能流畅玩了，回头看这些坑虽然烦，倒也算是学明白了不少东西，下次再装应该能顺手很多。&lt;/p&gt;
</content:encoded></item><item><title>手机电池为什么用两年就不耐用了</title><link>https://blog.easonyin.xyz/posts/shouji-dianchi-buhengyong/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/shouji-dianchi-buhengyong/</guid><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我这台手机用了刚好两年，最近充满电出门逛一天，回家就只剩百分之十几，以前同样的用法能撑到晚上十点还有三成。设置里看了眼电池健康度，78%，怪不得感觉这么明显。&lt;/p&gt;
&lt;p&gt;很多人以为电池不耐用是因为&quot;电池坏了&quot;，其实锂电池这东西天生就是消耗品，跟手机好不好没太大关系，纯粹是化学反应决定的。&lt;/p&gt;
&lt;p&gt;锂电池充放电的本质，是锂离子在正负极之间来回跑。每充一次电、放一次电，就叫一次循环，官方一般标的是500到800次循环后容量会衰减到80%左右。问题是这个&quot;循环&quot;不是你插一次充电线就算一次，而是按总充电量算的，比如你今天充了30%，明天又充了70%，加起来才算一次完整循环。所以哪怕你天天少量补电，循环次数照样在悄悄累积。&lt;/p&gt;
&lt;p&gt;衰减的根本原因是电极材料在反复的锂离子嵌入脱出过程中会发生细微的结构变化，用久了活性物质会逐渐&quot;失活&quot;，能存的电自然就变少了。这个过程没法逆转，跟手机新旧没关系，纯粹是时间和使用量堆出来的。&lt;/p&gt;
&lt;p&gt;高温是加速衰减最狠的因素之一，比夏天暴晒在车里，或者一边充电一边打游戏发烫，都会明显加快电池老化。我自己现在夏天尽量不把手机放太阳底下，边充电边玩游戏这种事也尽量少干。&lt;/p&gt;
&lt;p&gt;还有个误区是&quot;电量要用到没电才充&quot;，这其实对锂电池反而不友好。锂电池最舒服的区间是20%到80%之间来回充放，频繁跑到0%或者一直插着到100%不拔，长期这样都会加速衰减。不过说实话现在手机基本都有过充保护，插着睡一晚问题不大，主要还是别老是把电量放空。&lt;/p&gt;
&lt;p&gt;如果电池健康度掉到80%以下用着已经明显吃力，换电池比换手机划算多了，官方售后一般也就两三百块，比重新买一台便宜太多。&lt;/p&gt;
</content:encoded></item><item><title>笔记本进水之后我做的几件事</title><link>https://blog.easonyin.xyz/posts/bijiben-jinshui/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/bijiben-jinshui/</guid><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周六晚上十点半，我端着一杯水放在床头柜上，结果被猫尾巴一扫，整杯水浇在了正开着的笔记本键盘上。当时脑子一片空白，第一反应是赶紧长按电源键关机——事后查了才知道这个是错的，应该直接拔电源，别管它是不是还在开机状态，越晚断电风险越大。&lt;/p&gt;
&lt;p&gt;反正当时已经手忙脚乱按了关机键，屏幕黑了那一下我心跳都漏了一拍。&lt;/p&gt;
&lt;p&gt;冷静下来之后做的事，写下来给以后可能遇到同样情况的人（包括我自己）：&lt;/p&gt;
&lt;p&gt;先把电池拆了（如果是可拆卸的），拔掉所有外接设备。我这台是不可拆卸电池的，所以只能干等着，长按电源键强制断电，然后立刻断开电源适配器。&lt;/p&gt;
&lt;p&gt;接着把笔记本倒扣成&quot;人字形&quot;放着，键盘朝下，让水顺着缝隙往外流，不要正面朝上放，不然水会顺着往主板里渗。&lt;/p&gt;
&lt;p&gt;然后拿吹风机，冷风，隔着二三十厘米慢慢吹，千万别用热风，热风会让水汽在机器内部形成雾气，反而渗得更深。我吹了大概二十分钟，键盘缝里还在往外渗水珠。&lt;/p&gt;
&lt;p&gt;最要命的是等待期。网上说至少要晾24到48小时再开机，我熬到第二天下午实在忍不住开了一次，屏幕亮了但是键盘有几个键失灵，字母D和空格键按下去没反应。悬着的心又提起来了。&lt;/p&gt;
&lt;p&gt;后来又晾了一整天，第三天再开，键盘恢复了，暂时看着一切正常，但我这几天一直提心吊胆，总觉得主板会不会哪天突然短路。找了个修电脑的师傅问了下，他说如果开机正常用了三五天没异常，基本就没大问题了，进水最怕的是当下没断电继续通电，短路才是真正致命的。&lt;/p&gt;
&lt;p&gt;现在这台笔记本正常用着，键盘也没再出问题。但这次之后我买了个带盖的水杯，桌上再也不放敞口的杯子了，猫尾巴什么时候扫过来真是防不胜防。&lt;/p&gt;
</content:encoded></item><item><title>WiFi满格但是网速很慢，到底怎么回事</title><link>https://blog.easonyin.xyz/posts/wifi-manzhen-quewangman/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/wifi-manzhen-quewangman/</guid><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;家里网最近老是这样：手机右上角WiFi图标满格，打开网页却半天转圈，看视频动不动就缓冲。我妈还以为是不是欠费了，其实跟这个真没关系。&lt;/p&gt;
&lt;p&gt;信号满格只是说明你手机离路由器&quot;够近&quot;、接收强度够，但强度和速度根本是两回事。你可以理解成，信号格数量表示的是&quot;你能不能听清对方说话&quot;，而不是&quot;对方说话的语速&quot;。哪怕信号拉满，只要下面几个东西出问题，照样卡。&lt;/p&gt;
&lt;p&gt;最常见的是同一个频段挤太多人。现在小区里几乎家家都有WiFi，2.4GHz这个频段信道就那么几个，大家默认设置基本都挤在同一个信道上，相当于一群人在同一个频道里同时说话，互相干扰。路由器后台一般能手动切信道，我上次把信道从默认的6换成11，网速肉眼可见好转，一分钱没花。&lt;/p&gt;
&lt;p&gt;另一个坑是路由器本身带宽跑满了。比如你家里有人在下大文件，或者电视在放4K，剩下的带宽就那么点，分给你手机的自然就少了。这种情况信号照样满格，因为信号强弱和路由器出口带宽是两码事。&lt;/p&gt;
&lt;p&gt;还有个容易被忽略的，是运营商那头的问题，尤其是晚高峰。八九点钟一堆人下班回家开始刷视频，小区共享的那根光纤可能就有点吃紧，这种情况自己家里怎么折腾都没用，纯粹看运气和网络运营商的调度。&lt;/p&gt;
&lt;p&gt;我自己现在的习惯是：卡的时候先看看是不是家里人在下载东西，没有的话就换个信道试试，还不行就重启一下路由器（虽然听起来很敷衍，但是真的经常管用）。实在不行就认命，可能是小区宽带真的到高峰期了。&lt;/p&gt;
&lt;p&gt;顺带一提，5GHz频段抗干扰能力比2.4GHz好很多，就是穿墙能力差点，隔个房间信号就弱不少。所以如果路由器离得近，优先连5GHz，能省不少事。&lt;/p&gt;
</content:encoded></item><item><title>楼下那家奶茶店关门了</title><link>https://blog.easonyin.xyz/posts/naicha-dianguan-le/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/naicha-dianguan-le/</guid><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周三下班路过楼下，发现那家开了快两年的奶茶店卷帘门拉下来了，玻璃上贴了张A4纸，&quot;旺铺转让&quot;，电话号码是手写的，歪歪扭扭。&lt;/p&gt;
&lt;p&gt;说实话我也没多喜欢喝奶茶，一个月去不了两次，但每次路过看到那个招牌就觉得挺安心的，好像这条街还是原来的样子。现在突然没了，倒有点不习惯。&lt;/p&gt;
&lt;p&gt;老板是个四十多岁的大姐，记性特别好，我去过三四次她就记住我喜欢少糖去冰。有次我加班到十点多路过，她还在收摊，看见我说&quot;今天这么晚啊&quot;，随手给我加了份椰果没收钱。就这么点小事，我到现在还记得。&lt;/p&gt;
&lt;p&gt;也不知道是不是房租涨了，还是生意本来就不好。这条街这两年开了关关了开好几家店，隔壁的水果店也换了三次老板。可能开店真的挺难的，尤其是这种夫妻店，没什么品牌加成，全靠回头客撑着。&lt;/p&gt;
&lt;p&gt;昨天特意绕过去看了一眼，那张转让的纸还贴着，没人接手。也不知道大姐现在去哪了，希望她别太亏。&lt;/p&gt;
&lt;p&gt;写这个也没什么特别的意思，就是觉得生活里这种小事，过了就过了，没人会专门记下来，那我就随手记一笔吧。&lt;/p&gt;
</content:encoded></item><item><title>如何使用GitHub搭建我的世界服务器</title><link>https://blog.easonyin.xyz/posts/github-minecraft-server/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/github-minecraft-server/</guid><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;搭建自己的我的世界（Minecraft）服务器不仅能够带给玩家无与伦比的游戏体验，还能够提升开发技能和对网络服务器的理解。通过GitHub，我们可以更方便地管理代码、版本控制以及与他人协作。本文将详细介绍如何使用GitHub搭建我的世界服务器。&lt;/p&gt;
&lt;h2&gt;1. 准备工作&lt;/h2&gt;
&lt;p&gt;在搭建服务器之前，我们需要进行一些准备工作，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装Java：Minecraft服务器是基于Java的，因此需要确保你的计算机上已安装Java。&lt;/li&gt;
&lt;li&gt;下载Minecraft服务器程序：前往Minecraft官方网站下载最新的服务器程序。&lt;/li&gt;
&lt;li&gt;创建GitHub账号：如果还没有账号，可以前往GitHub官网注册一个。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 使用GitHub创建新项目&lt;/h2&gt;
&lt;h3&gt;2.1 创建仓库&lt;/h3&gt;
&lt;p&gt;登录GitHub，点击右上角的&quot;+&quot;图标，选择&quot;New repository&quot;。
为你的项目命名，如&quot;Minecraft-Server&quot;。
选择公开或私有，点击&quot;Create repository&quot;。&lt;/p&gt;
&lt;h3&gt;2.2 上传服务器程序&lt;/h3&gt;
&lt;p&gt;使用Git或GitHub Desktop将Minecraft服务器程序上传到你刚刚创建的仓库中。
确保上传所有相关的文件，包括server.jar和其他配置文件。&lt;/p&gt;
&lt;h2&gt;3. 配置Minecraft服务器&lt;/h2&gt;
&lt;p&gt;在服务器文件夹中，我们需要创建一个eula.txt文件，并将其内容改为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eula=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这表明你同意Minecraft的最终用户许可协议。&lt;/p&gt;
&lt;h3&gt;3.1 修改服务器配置&lt;/h3&gt;
&lt;p&gt;创建一个server.properties文件，并根据需要配置以下参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;max-players：最大玩家数量&lt;/li&gt;
&lt;li&gt;level-name：世界名称&lt;/li&gt;
&lt;li&gt;gamemode：游戏模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 在GitHub上托管服务器&lt;/h2&gt;
&lt;p&gt;使用GitHub的Actions功能，可以实现服务器的自动部署。&lt;/p&gt;
&lt;h3&gt;4.1 创建GitHub Actions&lt;/h3&gt;
&lt;p&gt;在你的仓库中，创建一个名为&lt;code&gt;.github/workflows&lt;/code&gt;的文件夹。
创建一个名为&lt;code&gt;deploy.yml&lt;/code&gt;的文件，添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy Minecraft Server
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Java
        uses: actions/setup-java@v1
        with:
          java-version: &apos;11&apos;
      - name: Start Server
        run: java -Xmx1024M -Xms1024M -jar server.jar nogui
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 启动你的服务器&lt;/h2&gt;
&lt;p&gt;在配置完成后，你可以通过GitHub Actions启动服务器。每当你向main分支推送代码时，服务器将会自动构建并启动。&lt;/p&gt;
&lt;h2&gt;6. 连接到你的服务器&lt;/h2&gt;
&lt;p&gt;在游戏中，选择&quot;多人游戏&quot;，然后添加你的服务器IP地址。确保在你的路由器上配置了端口转发，默认端口为25565。&lt;/p&gt;
&lt;h2&gt;FAQ（常见问题解答）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;如何查看Minecraft服务器的日志？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你可以在服务器文件夹中找到logs目录，查看latest.log文件以获得服务器的详细日志信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服务器启动失败的常见原因是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java未安装：确保Java已正确安装。&lt;/li&gt;
&lt;li&gt;端口占用：检查25565端口是否被其他程序占用。&lt;/li&gt;
&lt;li&gt;配置错误：检查server.properties中的配置是否正确。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如何让其他人加入我的服务器？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;确保你将服务器的IP地址和端口分享给他们，并在路由器中进行必要的端口转发设置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可以在GitHub上托管免费的Minecraft服务器吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可以，GitHub主要用于代码管理和版本控制，不提供服务器托管服务，但可以使用GitHub Actions来自动化服务器的构建和部署。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;需要多少内存才能运行Minecraft服务器？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;建议至少1GB内存用于基础的Minecraft服务器，具体取决于最大玩家数量和世界大小。&lt;/p&gt;
&lt;p&gt;通过以上步骤，你就可以顺利搭建一个基于GitHub的Minecraft服务器。这个过程不仅能帮助你提高编程能力，也能为你的朋友们带来欢乐。希望本文对你有所帮助！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;(C)2026 Android Group(Not Google company)(By EasonYin)
yinshiya123@gmail.com
yinshilin12345@outlook.com
github:nameefef&lt;/p&gt;
</content:encoded></item><item><title>2026 最强 Cloudflare 免费节点！永久可用+免费域名｜10分钟搭建｜解锁 ChatGPT / Gemini ！</title><link>https://blog.easonyin.xyz/posts/cloudflare-free-node/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/cloudflare-free-node/</guid><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;图片来源与互联网，侵权联系 yinshiya123@gmail.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你在找一种真正&quot;长期可用&quot;的免费节点方案，那么2026年，这套基于 Cloudflare 的搭建方式，可能是目前最值得尝试的一种选择。&lt;/p&gt;
&lt;p&gt;它最大的特点只有三个：免费、稳定、速度极快！不需要服务器、不需要额外成本，甚至连域名都可以免费获取；整个搭建过程从零开始，大约10分钟就能完成。同时，由于依托 Cloudflare 本身的网络基础，这套方案在稳定性和可用性方面，也远远优于传统的临时节点或不稳定方案。&lt;/p&gt;
&lt;p&gt;相比过去那些复杂、容易失效、需要频繁维护的方式，这种方案更像是一种&quot;轻量级长期解决方案&quot;：一次搭建，持续可用，几乎不需要额外折腾，非常适合个人用户或轻度使用场景。&lt;/p&gt;
&lt;p&gt;接下来，我会从准备工作开始，一步一步带你完整搭建这套 Cloudflare 免费节点方案，并把过程中所有关键细节和容易踩坑的地方，全部讲清楚。&lt;/p&gt;
&lt;p&gt;部署步骤：&lt;/p&gt;
&lt;h2&gt;第一步&lt;/h2&gt;
&lt;p&gt;注册一个永久免费的域名，下方我提供了2种免费域名的注册链接，第二种我们之前已经介绍过了，所以这次我们就用第一种方式：
https://www.dnshe.com/&lt;/p&gt;
&lt;p&gt;注册登入以后，即可注册5个永久免费的域名，根域名选择ccwu.cc 或者 us.ci 都是完全免费的！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/b69ad7a4-49f6-44ee-8817-da8f1f011e0a&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;第二步&lt;/h2&gt;
&lt;p&gt;注册并登入 Cloudflare 平台，然后将上方注册的免费域名托管进去&lt;/p&gt;
&lt;p&gt;【&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;长按注册&lt;/a&gt;】&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/99e958b2-3ed4-4bb9-938e-941cb6ddd8b4&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;第三步&lt;/h2&gt;
&lt;p&gt;创建KV 空间，在Cloudflare后台找到：存储和数据库 – Worker KV，来创建一个KV空间以备后面对接。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/de4cc104-f029-4c33-836e-485d96d9de88&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;第四步&lt;/h2&gt;
&lt;p&gt;创建Pages,在Cloudflare后台找到 Workers 和 Pages&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/5c494d93-796f-466c-a7c2-8e398738c5be&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入以后，选择下方第二个选项，就是创建Pages，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/7ea9f4ef-9e54-4721-b116-6b0b89566cb3&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着需要上传由 &lt;a href=&quot;https://github.com/cmliu/edgetunnel&quot;&gt;CMliu&lt;/a&gt; 开源的程序，他的源码是明文的，你可以自己去&lt;a href=&quot;https://github.com/cmliu/edgetunnel/blob/main/_worker.js&quot;&gt;获取查看&lt;/a&gt;，目前是开源到GitHub上。或者直接下载Pages的专属安装包！&lt;/p&gt;
&lt;p&gt;下载以后直接将附件上传到Pages，进行步骤即可&lt;/p&gt;
&lt;p&gt;部署完成后点击 继续处理站点 后，选择 设置 &amp;gt; 环境变量 &amp;gt; 制作为生产环境定义变量 &amp;gt; 添加变量。 变量名称填写ADMIN，值则为你的管理员密码，后点击 保存即可。&lt;/p&gt;
&lt;p&gt;返回 部署 选项卡，在右下角点击 创建新部署 后，重新上传 &lt;a href=&quot;https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip&quot;&gt;main.zip&lt;/a&gt; 文件后点击 保存并部署 即可。&lt;/p&gt;
&lt;p&gt;绑定 KV 命名空间：&lt;/p&gt;
&lt;p&gt;在 设置选项卡中选择 绑定 &amp;gt; + 添加 &amp;gt; KV 命名空间，然后选择一个已有的命名空间或创建一个新的命名空间进行绑定。&lt;/p&gt;
&lt;p&gt;变量名称填写KV，然后点击 保存后重试部署即可。&lt;/p&gt;
&lt;p&gt;给 Pages绑定 CNAME自定义域：&lt;/p&gt;
&lt;p&gt;在 Pages控制台的 自定义域选项卡，下方点击 设置自定义域。&lt;/p&gt;
&lt;p&gt;填入你的自定义次级域名，注意不要使用你的根域名，例如： 您分配到的域名是 EasonYin.ccwu.cc，则添加自定义域填入 EasonYin.ccwu.cc即可；&lt;/p&gt;
&lt;p&gt;按照 CF 的要求将返回你的域名DNS服务商，添加 该自定义域 lizi的 CNAME记录 edgetunnel.pages.dev 后，点击 激活域即可。&lt;/p&gt;
&lt;p&gt;访问后台：&lt;/p&gt;
&lt;p&gt;访问 https://example.ccwu.cc/admin 输入管理员密码即可登录后台。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/d1e13199-a204-4435-8b39-9ff735c5304b&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着把上方的节点链接格式或者自适应订阅地址，导入到你的代理软件里，他支持 VLESS、Trojan 等主流协议，深度集成加密传输。&lt;/p&gt;
&lt;h2&gt;✨ 核心特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🛡️ 协议支持：支持 VLESS、Trojan 等主流协议，深度集成加密传输。&lt;/li&gt;
&lt;li&gt;📊 管理面板：内置可视化后台，支持实时配置修改、日志查看及流量统计。&lt;/li&gt;
&lt;li&gt;🛠️ 部署灵活：完整适配 CF Workers 及 CF Pages (GitHub / 上传)。&lt;/li&gt;
&lt;li&gt;🔄 订阅系统：内置自动订阅生成及混淆转换，适配主流客户端（Clash, Sing-box, Surge 等）。&lt;/li&gt;
&lt;li&gt;⚡ 性能加速：支持自定义 ProxyIP、SOCKS5/HTTP 链式代理及优选 API，优化网络延迟。&lt;/li&gt;
&lt;li&gt;🌐 多台适配：完美适配 Windows, Android, iOS, MacOS 及各种软路由固件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如我们可以使用常见的 &lt;a href=&quot;https://github.com/2dust/v2rayN&quot;&gt;V2Ray&lt;/a&gt; 客户来进行导入代理节点，就可以愉快的使用Cloudflare永久免费的VPN节点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/b203b655-9cee-4629-80b4-54c5a8aed37b&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当然如果你需要自定义更多的选项，比如优选订阅地址，指定ProxyIP订阅，那么可以点击顶部的：我是高手！我就是要折腾！&lt;/p&gt;
&lt;p&gt;优选订阅地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Cm.Soso.Edu.Kg
Sub.Cmliussss.Net
Owo.O00o.Ooo
PROXYIP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;订阅:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ProxyIP.US.CMLiussss.Net
ProxyIP.SG.CMLiussss.Net
ProxyIP.JP.CMLiussss.Net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以玩出更多花样更多高级功能&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;(C)EasonYin2026 pic from Iternet
powered by AndroidGroup(TM)&lt;/p&gt;
</content:encoded></item><item><title>一次诡异的MySQL连接超时排查，让我重新认识了TCP握手</title><link>https://blog.easonyin.xyz/posts/mysql-tcp-timeout/</link><guid isPermaLink="true">https://blog.easonyin.xyz/posts/mysql-tcp-timeout/</guid><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周五下午，正准备摸鱼等下班，运维突然在群里@我：线上某个服务的错误日志暴涨，全是 &lt;code&gt;MySQL Connection timed out&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我第一反应是：数据库挂了？&lt;/p&gt;
&lt;p&gt;赶紧连上跳板机看了看数据库监控，CPU、连接数、慢查询都正常。ping了下内网也通。这就奇怪了。&lt;/p&gt;
&lt;h2&gt;重启大法失效&lt;/h2&gt;
&lt;p&gt;试了重启业务容器，没用。重启数据库？不敢，线上核心库。&lt;/p&gt;
&lt;p&gt;看了下业务日志，错误很规律：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ERROR] 2024-05-20 14:23:15 - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
Communications link failure. The last packet sent successfully to the server was 0 milliseconds ago.
The driver has not received any packets from the server.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键信息是：&lt;code&gt;0 milliseconds ago&lt;/code&gt; —— 这说明连接根本没建立起来。&lt;/p&gt;
&lt;h2&gt;第一直觉：连接池爆了&lt;/h2&gt;
&lt;p&gt;看应用配置的HikariCP，最大连接数20，数据库那边&lt;code&gt;show processlist&lt;/code&gt;一看，才接了15个连接。&lt;/p&gt;
&lt;p&gt;不对。&lt;/p&gt;
&lt;p&gt;试着用&lt;code&gt;mysql -h xxx -P 3306 -u root -p&lt;/code&gt;手动连接，卡住了。过了大概10秒才返回&lt;code&gt;ERROR 2003 (HY000): Can&apos;t connect to MySQL server on &apos;xxx&apos; (110)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;110错误码？查了下是&lt;code&gt;ETIMEDOUT&lt;/code&gt;，连接超时。&lt;/p&gt;
&lt;p&gt;这里有个细节：不是拒绝连接，是超时。说明TCP包发出去后，数据库根本没回。&lt;/p&gt;
&lt;h2&gt;抓包看真相&lt;/h2&gt;
&lt;p&gt;在业务机器上开tcpdump：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tcpdump -i eth0 host 数据库IP and port 3306 -nn -S
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;抓到的东西让我有点懵：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;14:30:01.123456 IP 10.0.1.100.54321 &amp;gt; 10.0.0.200.3306: Flags [S], seq 123456789, win 29200
14:30:10.234567 IP 10.0.1.100.54321 &amp;gt; 10.0.0.200.3306: Flags [S], seq 123456789, win 29200
14:30:29.345678 IP 10.0.1.100.54321 &amp;gt; 10.0.0.200.3306: Flags [S], seq 123456789, win 29200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TCP三次握手的第一步SYN包发出去后，没有收到SYN+ACK。重试了两次（默认的重试机制），最后放弃。&lt;/p&gt;
&lt;p&gt;所以问题是：数据库为什么不回SYN-ACK？&lt;/p&gt;
&lt;h2&gt;排查数据库端&lt;/h2&gt;
&lt;p&gt;登录数据库服务器，看&lt;code&gt;/proc/sys/net/ipv4/tcp_syn_retries&lt;/code&gt;，默认是5。没问题。&lt;/p&gt;
&lt;p&gt;用&lt;code&gt;ss -lnt&lt;/code&gt;看了下监听状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port
LISTEN  1024    0              0.0.0.0:3306          0.0.0.0:*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Recv-Q是1024？正常应该是0。&lt;/p&gt;
&lt;p&gt;这里暴露问题了：Recv-Q 不为0，说明全连接队列满了。&lt;/p&gt;
&lt;p&gt;解释一下：TCP建立连接分半连接队列（SYN队列）和全连接队列（Accept队列）。ss输出的Recv-Q是全连接队列里等待accept的连接数。Send-Q是队列最大长度。&lt;/p&gt;
&lt;p&gt;1024/1024，满了，所以内核直接丢弃新来的SYN包。&lt;/p&gt;
&lt;h2&gt;为什么全连接队列会满&lt;/h2&gt;
&lt;p&gt;查了下应用的连接池配置，有个参数被上游哥们在两周前改过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;maximum-pool-size: 100  # 从20改到了100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是数据库的max_connections还是120。理论上100 &amp;lt; 120，够用啊。&lt;/p&gt;
&lt;p&gt;问题在于：全连接队列的大小是 min(backlog, net.core.somaxconn)。服务端调用listen()时传入的backlog参数，MySQL默认是128。而系统的net.core.somaxconn是128。所以队列最大128。&lt;/p&gt;
&lt;p&gt;应用突然从20个连接涨到100，高峰期加上其他服务，瞬间全连接队列就满了。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;p&gt;三个方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;调大net.core.somaxconn到1024&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sysctl -w net.core.somaxconn=1024
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;调整MySQL的backlog（需要重启），在my.cnf里加：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;back_log = 1024
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;紧急情况先调小应用连接池，让队列消化掉&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;选了方案1+2，改完后Recv-Q明显降下来了，连接恢复正常。&lt;/p&gt;
&lt;h2&gt;一点感悟&lt;/h2&gt;
&lt;p&gt;TCP三次握手的细节，平时觉得&quot;懂了就行&quot;，真踩坑才理解为什么要懂。&lt;/p&gt;
&lt;p&gt;还有就是，线上改动一定要走Review。那个改连接池配置的同学没通知任何人，测试环境也没验证过，直接上生产。虽然锅是他背，但事后我们也补了监控：全连接队列使用率超过80%就告警。&lt;/p&gt;
&lt;p&gt;这次排查用了半天，其实最开始看&lt;code&gt;ss -lnt&lt;/code&gt;的Recv-Q就能定位问题，绕了一大圈。写出来给遇到类似问题的同学省点时间。&lt;/p&gt;
&lt;p&gt;最后留个问题：Recv-Q和Send-Q在TCP的不同状态下分别代表什么含义？搞懂这个，很多网络问题都不用瞎猜了。&lt;/p&gt;
</content:encoded></item></channel></rss>