<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Socket · XB 现场笔记</title><link>https://hk.xbcatm.com/zh/tags/socket/</link><description>基于 HTTP、DNS、TLS、Caddy、SSH、发布与恢复的可复现运维现场笔记。</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://hk.xbcatm.com/zh/tags/socket/index.xml" rel="self" type="application/rss+xml"/><item><title>socket 激活让服务按需启动</title><link>https://hk.xbcatm.com/zh/posts/systemd-socket-activation-ka/</link><pubDate>Tue, 01 Feb 2028 00:00:00 +0000</pubDate><guid>https://hk.xbcatm.com/zh/posts/systemd-socket-activation-ka/</guid><description>区分监听器与逐连接激活，评估应用自行实现的空闲退出、冷启动延迟与实际资源节省。</description><content:encoded>&lt;p&gt;一个 socket 单元可以在兼容应用停止时继续提供监听端点，从而减少少用服务的常驻内存与周期性工作。但套接字、内核队列和管理器仍然占用资源，已经安装的软件也仍然需要安全更新。监听可用还取决于绑定成功、权限正确以及 socket 单元保持活动。端口正在监听，只表示客户端有机会请求工作，并不能证明应用已经初始化或能够返回正确结果；这些条件必须分别观察。&lt;/p&gt;
&lt;p&gt;交接方式由配置决定。Accept=no 把监听描述符交给守护进程，由它自己接受连接；Accept=yes 则先接受连接，再启动适合处理该连接的服务实例。客户端可能在应用初始化之前完成连接，随后等待响应，甚至等到超时。应测量从连接到应用回复的完整延迟，不能因为交接对客户端接口透明，就推断冷启动和常驻服务在时延、失败诊断或实际资源成本上没有区别。&lt;/p&gt;
&lt;figure class="technical-diagram"&gt;&lt;img loading="lazy" src="https://hk.xbcatm.com/visuals/posts-systemd-socket-activation-ka.detail.zh.svg" alt="socket 单元活动时，请求可以启动兼容服务。应用明确定义的空闲退出可使进程停止，后续需求再触发启动；没有空闲退出时，服务仍继续运行。应在真实负载下测量连接至首个响应的冷启动延迟、客户端截止时间和常驻资源。监控可能同时唤醒多个服务，因此需要验证聚合启动负载。仅示意所选机制；原文仍为搁置/待审，不为其错误泛化背书。" width="720" height="2250"&gt;&lt;figcaption&gt;socket 单元活动时，请求可以启动兼容服务。应用明确定义的空闲退出可使进程停止，后续需求再触发启动；没有空闲退出时，服务仍继续运行。应在真实负载下测量连接至首个响应的冷启动延迟、客户端截止时间和常驻资源。监控可能同时唤醒多个服务，因此需要验证聚合启动负载。仅示意所选机制；原文仍为搁置/待审，不为其错误泛化背书。 仅示意选定的原文机制；本轮没有执行示例。&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id="让监听器先等着"&gt;让监听器先等着&lt;/h2&gt;
&lt;p&gt;socket 单元启动时，systemd 打开 ListenStream 指定的端点。Accept=no 通常由 foo.socket 激活 foo.service 并传递监听器，Service= 可以指定其他服务；Accept=yes 通常使用 foo@.service 模板，为每条接受的流连接生成实例。数据报套接字不采用这种逐连接模型。程序必须匹配选定的描述符契约，不能只因为两个单元名称相近，就认为普通绑定逻辑可以原样使用。&lt;/p&gt;
&lt;p&gt;这种分离可以减少启动顺序上的耦合，但不会消除依赖。客户端使用套接字之前，socket 单元必须已经活动并监听，所需的服务、挂载、设备与先后顺序依赖仍然适用。兼容服务启动时，连接可以在有限的内核积压队列中等待，但客户端仍可能在应用就绪前失败或超时。当然积压长度也要调：启动慢的服务遇上开机早期的连接洪峰，溢出起来和普通监听队列一样。&lt;/p&gt;
&lt;h2 id="服务按需唤醒"&gt;服务按需唤醒&lt;/h2&gt;
&lt;p&gt;按需激活可以在 socket 保持活动时推迟应用的首次启动，但不会让已运行的守护进程自动休眠，也不会自动停止进入空闲的程序。管理服务、罕用协议处理器是否适合这种方式，要看激活接口、请求截止时间与资源画像。其他依赖或人工启动仍然可能提前激活服务，因此不能把首次连接当成所有环境中唯一的启动入口，更不能从文章标题推导永久的运行限制。&lt;/p&gt;
&lt;p&gt;要形成反复节省资源的循环，应用必须明确实现安全的空闲退出，先完成或转交进行中的工作，并让管理器持有的监听器继续可用。socket 单元仍活动时，后续需求可以请求再次启动；没有空闲退出逻辑，守护进程可能在第一次激活后一直常驻。这两种情况都不是零成本状态，也不保证套接字永远不会关闭。应验证待处理请求和退出边界，而不是仅设置一个空闲秒数就认定节省已经成立。&lt;/p&gt;
&lt;h2 id="用速度换内存"&gt;用速度换内存&lt;/h2&gt;
&lt;p&gt;冷启动预算应从连接开始，一直计算到首个有效应用响应，并在有代表性的负载下比较常驻内存。假设启动三百毫秒能够节省八百 MB，在一种工作负载中可能合适，在另一种场景却可能超过请求期限。二十秒预热对异步任务也许可接受，对交互请求则可能不可用。这些数字只是说明取舍，并不是实测结果或通用决策阈值。&lt;/p&gt;
&lt;p&gt;有些工作无法承受启动间隙。健康检查本身可能唤醒服务，也可能在初始化时把端点判为不可用；客户端截止时间和负载均衡策略必须匹配实际启动行为。若稳定响应时间比空闲内存更重要，保持守护进程运行可能更简单。开机预热一次并不会自动实现之后的空闲退出，也不能替代对长时间停用后恢复状态的检查。&lt;/p&gt;
&lt;h2 id="坏掉的样子"&gt;坏掉的样子&lt;/h2&gt;
&lt;p&gt;一轮监控可能同时唤醒很多服务，引发总体 CPU 或内存尖峰。错峰检查可以减少同时到来的需求，单服务启动速率限制则约束该单元反复启动的次数，并不能限制整机并发数量或总内存。过短的空闲超时还可能增加启停抖动。应测试聚合启动负载，并使用合适资源控制，而不是把几个独立单元上的限制误认为全机容量保证。&lt;/p&gt;
&lt;p&gt;若守护进程启动时再次绑定已经占用的端点，就可能因地址被占用而失败。程序必须通过原生激活接口或受支持的 inetd 风格接口使用传入的描述符；仅仅继承一个描述符再执行不知情的程序，不会改变它内部的 bind 逻辑。协议适配器需要单独验证，不能承诺一个通用的小包装就能让任意网络守护进程支持激活。&lt;/p&gt;
&lt;h2 id="快速验证"&gt;快速验证&lt;/h2&gt;
&lt;p&gt;下面只是检查草图，前提是另有经过配置与授权的 foo.socket/foo.service，在回环地址的 8080 端口提供健康端点。本文没有给出这组单元的完整配置，本轮也没有执行这些命令：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl status foo.socket foo.service
ss -ltnp | grep &amp;#39;:8080&amp;#39;
curl -m 10 localhost:8080/health; systemctl show foo.service -p ActiveState,ExecMainStartTimestamp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先确认服务未活动、目标套接字正在监听，再核对请求获得预期应用响应，比较前后的运行实例或启动信息。每条命令都要检查结果：分号会在 curl 失败后继续执行 show，因此最后退出状态不能代替请求成功。状态输出本身也不证明健康或启动因果关系，其他激活入口必须一并排除。&lt;/p&gt;
&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hk.xbcatm.com/zh/notes/restart-policies-need-a-rate-limit/"&gt;重启策略需要一个速率限制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hk.xbcatm.com/zh/notes/a-maintenance-timer-should-leave-its-last-result-visible/"&gt;维护定时器应让其最近结果可见&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html"&gt;systemd.socket 手册&lt;/a&gt;，套接字单元官方参考，已核验 2026-06-01。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html"&gt;systemd.service 手册&lt;/a&gt;，服务激活、终止与重启行为，已核验 2026-09-05。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>