性能与请求调度
路径:阅读器标题栏 → 设置 → 性能设置。
性能设置按当前 Discourse API 管线分成八层;全局、请求流与业务数值提供可编辑目标上限,profile、缓存和重试仍是固定安全规则:
- 正文批量:
posts.json + post_ids[]按前、后或目标楼层补齐近窗缺口,并复用相同 identity 的在途请求。 - 树状直属回复:
posts/{id}/replies.json按父楼分页,邻近父楼最多两路候选。 - DOM 窗口:同时渲染多少楼层。
- 共享调度:所有候选何时启动、是否排队,以及当前请求 profile 如何处理 429 或 Cloudflare。
- 已读上报:
/topics/timings的每分钟请求数(RPM)和每分钟楼层条目数(TPM)。 - 宿主列表预热:是否在列表卡片接近视口时准备 Topic 正文,并把快照交给 Reader。
- 请求流控制:设置后台额外让路、队列窗口占用、批量后台占比、预热与四类读取车道的并发目标。
- 业务请求策略:分别设置下载、用户观察、通知、收藏与回应的最大并发、后台最小间隔和后台 RPM,同时展示固定 profile、车道、缓存与重试契约。
调度器不能抵消过大的预取需求;出现请求压力时,先减少需求,再降低并发。
默认参数
性能设置不再提供省流、自动、快速预取和自定义四档,打开面板后直接显示可编辑参数。新配置及“恢复默认”采用当前实测配置:正文每批 32 层、视口外 1 屏、同时挂载 64 层、API 提前 2 屏、共享并发 3 路、启动间隔 100 ms、窗口预算 85%、已读 10 RPM / 240 TPM、每个宿主 Topic 预热 24 层。“预热宿主 Topic 列表”和“后台暂停宿主 Turnstile”默认关闭。
保存后当前与后续阅读器立即采用;已经启动的普通请求自然完成。任一负载目标高于默认值时仍显示卡顿与 429 风险,但不会改写输入,也不会绕过自适应和共享请求安全规则。不确定设备或站点余量时直接使用“恢复默认”。
业务请求策略
性能设置为下载、用户观察、用户通知、收藏与回应四类业务分别提供三个可保存参数。保存后不重建 Scheduler:尚未启动和后续请求立即使用新值,已经启动的请求自然完成。设置参与导入导出和 WebDAV preferences 同步。
| 业务 | 默认最大并发 | 默认后台最小间隔 | 默认后台 RPM |
|---|---|---|---|
| Topic 下载 | 1 路 | 250 ms | 24 |
| 用户观察 | 1 路 | 250 ms | 24 |
| 用户通知 | 3 路 | 100 ms | 40 |
| 收藏与回应 | 2 路 | 150 ms | 40 |
最大并发范围为 1–4 路,作用于单个 Reader 实例内该业务的活动请求;实际值还会取业务目标、接口车道上限、全局总并发和跨标签许可中的最严格结果。后台最小间隔范围为 80–5000 ms,后台 RPM 范围为 1–120;二者只限制 prefetch / background 的实际启动尝试,重试也计入 RPM,不延后新的可见请求或关键写操作。
下列 profile、执行方式、缓存和 429/Cloudflare 语义仍由 ReaderBusinessRequestPolicy 与请求 contract 固定管理,不能从设置中改成不安全组合;每条请求会把业务身份写入请求记录,便于按业务归因。
| 业务 | 前台或任务策略 | 后台策略 | 执行与缓存 |
|---|---|---|---|
| Topic 下载 | 用户启动后仍按可丢弃后台请求取得真实缺口 | background,429 不自动重试 | 空闲启动、可恢复;复用 canonical Topic 正文 |
| 用户观察 | collection-visible,可见请求保留 | background,可丢弃 | 单来源分页顺序;持久分页缓存 |
| 用户通知 | notification-visible;头页刷新可用批次车道 | 打开期 surface-prefetch,关闭后 background | 头页批次、历史顺序;持久分页缓存 |
| 收藏与回应 | collection-visible;收藏写操作走 action-critical | background,可丢弃 | 来源可并行、单来源分页顺序;持久分页缓存 |
这里的业务 RPM 是客户端目标,不是 Linux Do 提供的独立额度;车道上限也是本地服务成本边界。所有业务仍共用同一个 Gateway、single-flight、Scheduler、全局并发、跨标签 10 秒/60 秒许可、429 Retry-After 和 Cloudflare 恢复,任何业务参数都不能绕过这些安全契约。
此外,所有标记为可丢弃的 prefetch / background 还共用一层固定的同账号跨标签自动流量闸门:最多 1 路活动、10 秒 4 次、60 秒 24 次。宿主原生请求或 Reader 可见请求活动时,自动流量先让路;从首次进入 Scheduler 起等待超过 60 秒的自动意图直接取消,不在页面恢复后追赶。可见读取、显式操作、原生 MessageBus 和不可丢的已读成功确认不计入这份自动预算。该层只按真实事件确定性放行,不加入随机间隔或伪造人工行为。
请求流控制目标
过去分散在 permit、预热 owner 和 Scheduler 内的流控目标现已进入同一性能设置事务;保存后当前排队请求和后续请求热应用,已经启动的请求自然完成。
| 参数 | 范围 | 默认 |
|---|---|---|
| 后台空闲启动间隔 | 0–10000 ms | 2500 ms |
| 后台最长额外让路 | 0–60000 ms | 15000 ms |
| 宿主 Topic 预热并发 | 1–3 路 | 2 路 |
| 阅读队列 10 秒 / 60 秒请求目标 | 1–50 / 1–200 | 4 / 8 |
| 批量后台窗口占用比例 | 10%–85% | 50% |
| 后台直属回复 10 秒 / 60 秒目标 | 1–50 / 1–200 | 8 / 24 |
| 正文 / 直属回复 / 用户卡片 / 标准读取车道 | 1–3 / 1–2 / 1–2 / 1–4 路 | 3 / 2 / 2 / 1 路 |
这些值是可调目标,不是绕过安全层的开关。控制写车道、请求 identity、single-flight、缓存、请求 profile、重试次数、429 Retry-After、Cloudflare 闸门、跨标签总账本、自动流量 1 路与 4/24 账本、60 秒意图寿命和队列容量仍是固定契约;实际运行值取用户目标与所有固定边界中的最严格结果。
自适应内存与前台优先
默认参数还应用固定运行时保护:前台最多 1 个后台预热槽;完成快照交接最多保留 3 个主题、8 MiB、60 秒;通用响应内存最多保留 72 条、16 MiB;状态投影恢复按单批处理。设备能力、页面压力或共享调度规则可以继续收紧用户目标,日志记录会显示最终生效策略。
宿主 Topic 列表预热
“预热宿主 Topic 列表”默认关闭,只有用户显式开启后,列表卡片接近视口才会通过统一请求链准备正文;Reader 打开、切换或直接滚动不会销毁其他 Topic 的预热意图,但实际自动联网会等待宿主与当前可见请求空闲,并服从固定单飞、4/24 窗口和 250–1250 ms 一次性启动错峰。当前正在 Reader 中阅读的同一 Topic 不会重复预热。
开启时会显示“预热楼层数”,范围 1–128,默认 24。该数值表示每个 Topic 围绕历史位置或链接目标准备的连续正文总量;预热只写入 canonical 数据缓存和一次性交接快照,不会在宿主列表创建隐藏 Post DOM,也不会发送 track_visit=true 或 Discourse-Track-View 冒充原生路由浏览。修改后会中止旧窗口、释放旧交接并按新总量重新预热。
关闭后会立即中止宿主列表的联网预热、释放一次性交接快照,并在卡片状态行显示“预热已关闭”;重新开启后从当前近视口卡片和 canonical 缓存恢复。该偏好参与设置导入导出和 WebDAV preferences 同步。
已读上报 RPM / TPM
已读队列仍按单批最多 20 层合并,并新增两个同账号、跨标签的滚动 60 秒硬上限:
- RPM:
/topics/timings请求数/分钟,默认 10;同时按60 秒 ÷ RPM形成跨标签确定性最小启动间隔,默认至少 6 秒;普通队列只由新的真实 Reader 可见活动续批,不按该间隔匀速排空; - TPM:timings 已读楼层条目数/分钟,默认 240;这里的 T 表示 timing,不是模型 token。
达到任一上限或最小间隔尚未释放时,pending 楼层继续保留,不会先标成服务器已确认;窗口释放后由新的真实 Reader 可见活动继续,普通 backlog 不建立匀速 drain 定时器。服务器 Retry-After、有界瞬时失败重试和关闭前强制 flush 继续按恢复契约执行。设置保存后会热应用到当前和后续 Topic。每个网络批次仍最多 20 层,前台聚焦视口内停留满 1 秒才建立 pending,并按实际逐楼 timing 与独立 topic_time 上报。Discourse 公开文档给出的默认全局限制是每 IP 200 请求/分钟、50 请求/10 秒,但站点管理员可以修改;Linux Do 没有公开 /topics/timings 专属数值。因此默认值是保守的客户端预算,不冒充站点私有额度,所有请求仍继续服从共享 10 秒/60 秒账本、429 Retry-After 与 Cloudflare 恢复规则。参见 Discourse 全局限流设置。
宿主后台 Turnstile(实验)
“后台暂停宿主 Turnstile”默认关闭,只适用于 LinuxDo 页面自身放在 body 底部的隐藏验证控件。启用后同时满足以下条件才会暂停:
- 标签已在后台停留 30 秒;
- 宿主控件已经生成有效响应;
- 页面没有打开的原生编辑器或可见支付控件。
暂停使用 Turnstile 官方 remove() 生命周期,不读取、保存或同步响应令牌;标签回到前台、关闭设置或 Reader runtime 销毁时,会用原容器和 sitekey 立即恢复。挑战仍在进行、控件来源不明或恢复 API 不可用时保持原状。
该开关不处理 Reader 的 Cloudflare 验证窗口,也不改变请求并发、429 或共享 permit。若宿主之后调整 Turnstile 结构,安全条件无法匹配时会自动退化为“不暂停”,而不是删除未知安全控件。
正文批量取数
“每批正文楼层数”允许 12–64 条。数值越大:
- 数据边缘等待次数可能更少;
- 单次下载、解析和缓存写入更重;
- 不会增加同时挂载的 DOM 上限;
- 只改变
post_ids[]的单批数量,不会绕过共享调度。
进入近窗时最多把两批最近缺口排入 topic-batch;后台候选只在全局空闲时单飞。可见缺口会提升并复用相同 identity 的在途请求,总预算允许时才可能占用第二个正文槽。
预取失败、被丢弃或收到终止当前工作的 429 后,不会由设置层自动重建同一请求;后续请求必须重新来自当前实现允许的新滚动、导航或显式操作。
DOM 窗口
- 视口外挂载缓冲:0.25–3 屏。
- 同时挂载主楼层上限:24–128 个。
快速滚动会按方向临时前探,但仍受硬上限约束。媒体较重的远处楼层可能更早退回占位。
正文与树状预知
触发距离允许 1–3 屏:
- 正文批次接近这条水位时,从后台提升为可见请求;
- 父楼或已展开树节点进入这条水位时,调用直属回复 API;
- 每个父楼分页仍按后端固定页大小读取;
- 树状车道最多两路,可见树状请求优先于正文与后台请求;
- 后续页只在翻页时请求。
共享请求调度
主题、主楼层、楼中楼、消息和用户资料 JSON 共用调度:
| 参数 | 范围 | 含义 |
|---|---|---|
| 共享总并发上限 | 1–4 路 | 全站天花板;正文与树状车道各最多两路候选 |
| API 启动保护间隔 | 80–500 ms | 正常状态的最快启动间隔 |
| API 窗口预算比例 | 50%–95% | 10 秒/60 秒固定边界的目标比例 |
| 已读请求上限(RPM) | 1–60 | 同账号跨标签滚动一分钟内的 /topics/timings 请求数 |
| 已读楼层上限(TPM) | 20–1200 | 同账号跨标签滚动一分钟内提交的 timing 楼层条目数 |
| 宿主 Topic 预热楼层数 | 1–128 | 每个近视口 Topic 准备的连续正文总量;默认 24,不创建隐藏 DOM |
多个阅读器实例采用更严格值。宿主页面自己的 API 请求也会纳入共享账本,阅读器主动避让。
后台请求继续服从当前实现的空闲单飞和可丢弃规则;额外让路、预取窗口与读取车道目标由“请求流控制目标”设置,固定安全契约仍不可关闭。服务器响应中的额度字段只进入诊断,不会自动学习并改写用户目标。
429 与恢复

调整性能后到“日志记录 → 请求记录”核对排队、异常和限流窗口,确认调度结果后再继续修改,避免把站点 429 当成本地渲染问题。
出现 429 时:
- 共享 10 秒/60 秒预防窗口继续保留已经发生的请求启动记录,不会从
Retry-After动态学习或改写设置; Retry-After只属于命中的逻辑请求,是否等待或重试由该请求的固定 profile 决定;- 当前 Topic 正文、树状可见请求和后台预取遇到 429 时结束本次工作,不由设置层自动追发;
- 符合条件的 Cloudflare 信号进入跨标签共享硬闸门;后台与明确隔离的请求只结束自身,不抢开验证窗口;
- 验证恢复后仍重新经过优先级、并发、固定窗口和当前业务入口,不会突发补发旧队列。
不要仅为了“更快”把总并发、预取距离和预热楼层数同时调到最大。频繁 429 时先恢复默认,再到“日志记录 → 请求记录”核对 profile、最终决策、窗口占用与 Cloudflare 状态。
