疑难解答
出现问题时,请从这里开始。前面几节是几乎适用于所有情况的检查。之后的表格会从你看到的现象指向包含解决办法的页面。这些页面大多以自己的疑难解答章节结尾;本页不再重复它们。
第一步 #
在中继所在的机器上,打开终端:
oar status
oar doctor
oar status会告诉你中继是否有响应。对照下表阅读它的前几行。oar doctor会打印安装情况、配置文件以及它找到的提供商 CLI。它不做任何更改,并且总是以 0 退出,所以请阅读输出的各行。- 查看浏览器。 状态点和横幅可以告诉你问题出在浏览器与中继之间,还是在中继后面。
- 阅读与问题相关的日志(日志)。
- 重启可能有帮助的最小单元(重启)。
这两个命令都在 oar 命令中有介绍。
阅读 oar status #
| 输出行 | 它指向什么 |
|---|---|
Not set up yet — run: oar setup |
此安装中没有配置文件。运行 oar setup。首次运行 |
The relay is running on port <port> (<access>): <url> |
中继正常。打开该网址;oar url 会连同令牌一起打印它。这时问题出在浏览器、登录或某个会话 |
The relay is stopped (port <port>, <access>). Start it with: oar start |
该端口上没有任何响应。运行 oar start,如果失败,请阅读安装和启动 |
Port <port> is held by another program, or by a relay with another token. |
另一个程序占用了该端口,或者一个使用旧令牌的旧中继仍在运行。见无法启动时 |
The relay runs with its earlier settings; restart it to apply the new ones. |
你用 oar setup 更改了端口、令牌或访问方式。运行 oar restart |
Service: <state> |
登录时启动的服务。见登录时启动 |
Tunnel: <state> |
内置的 Cloudflare 隧道。见 Cloudflare 隧道 |
退出码 3 表示中继没有运行、端口被其他东西占用,或者没有配置文件。退出码 0 表示中继正在运行。
阅读 oar doctor #
| 输出行 | 它告诉你什么 |
|---|---|
OAR <version> 和 node |
OAR 版本以及运行 oar 的 Node.js。报告问题时请附上这两项 |
mode |
git checkout(git 检出):oar update 和 oar service 在这种安装中拒绝工作。global install(全局安装)是通常情况 |
state root 和 config |
该命令查看的是哪个安装。一台机器上有两个安装,就会各有两个。配置文件路径后面的 (missing — run: oar setup) 表示没有配置文件;此时会省略 port、auth token 和 tunnel |
port |
端口以及谁能访问它。localhost 表示只有本机可以访问;其他设备需要 oar setup --lan 或隧道 |
auth token |
MISSING 表示没有设置令牌。运行 oar setup |
tunnel |
disabled、managed (cloudflared: <path>) 或 managed, cannot start: <reason>。原因会说明问题所在,例如缺少 cloudflared |
database |
此安装使用的数据库及其大小。(not created yet) 表示中继从未从此安装运行过。如果你的对话不见了,或消息一直处于 pending 状态,请检查这是否是你预期的数据库(每个数据文件夹一个中继) |
provider CLIs |
gh (Copilot)、claude 和 grok 显示其版本,或显示 not found。doctor 使用你终端的 PATH 查找;服务使用的是安装时的 PATH(登录时启动)。无论是否保存了密钥,cursor 总是显示 bundled (@cursor/ |
warning |
在 WSL 中,Windows 占用了中继的端口。用 oar setup --port <port> 选择另一个端口 |
doctor 打印的是状态文件夹,而不是日志文件夹,它也不会告诉你中继是否在运行:那是 oar status 的事。日志的位置见文件与文件夹。
日志 #
| 问题 | 阅读 |
|---|---|
| 中继无法启动,或会停止 | 日志文件夹中的 server-,但仅当 oar start 自己在后台启动中继时才有。在 Linux 服务下,启动错误记录在 journal 中(journalctl --user -u oar),而不是 server-;见状态与日志 |
| 中继做过的任何事:预览、隧道、更新、重启 | relay-。其中你的访问令牌显示为 [token] |
| 某个对话没有回答,或它的智能体停止了 | worker-<session>.,即该对话的 worker 日志。Copilot 扩展引擎没有这个日志;请查看 ext- 和 Copilot 终端 |
| 服务无法启动 | systemctl --user status oar,然后 journalctl --user -u oar |
所有日志文件、它们的轮转方式以及 git 检出中的日志文件夹,见文件与文件夹。
在浏览器中 #
- 状态点位于对话列表顶部:灰色表示 Web relay unreachable(无法访问网页中继),即浏览器无法访问中继;绿色表示 Web relay reachable(可访问网页中继),琥珀色表示通过已连接的 Cloudflare 隧道访问到中继。工具提示会显示更多信息,例如有多少个 worker 正忙。状态点
- 横幅
CLI is offline — messages will queue until it reconnects和侧边栏中的 CLI offline(CLI 离线)表示 10 秒内没有任何会话 worker 报到。在空闲的中继上这是正常的:发送一条消息,横幅就会消失。如果横幅一直存在,请阅读 worker 日志。智能体无法访问时
重启 #
| 重启什么 | 何时 | 如何 |
|---|---|---|
| 一个对话的智能体 | 对话卡住、Stop(停止)不起作用,或智能体应当加载新的设置 | ⋯ 菜单中的 ☠️ Kill session(强制结束会话)。历史和队列保留;下一条消息会启动一个新的 worker。Kill session |
| 中继 | 新版本、修改过的配置文件、新安装的提供商 CLI | 在中继所在机器上运行 oar restart,或使用 ⋯ 菜单中的 🌄 Restart web relay(重启网页中继)。两者都会等待正在运行的轮次,但在 Linux 服务下例外,此时 oar restart 会结束它们。重启中继 |
症状 #
安装和启动 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
npm install -g @oar- 失败并报 EACCES |
npm 的全局文件夹需要 root 权限 | 使用安装程序,不要用 sudo。安装 |
Node.js 太旧或找不到;oar: command not found;oar 在 PowerShell 中被阻止 |
Node.js 低于 22.13,或 PATH 没有重新加载 |
安装 |
| 安装因 node-gyp 或 prebuild 错误而失败 | 没有适用于你的平台的预编译 better- |
安装 |
用 npm 12 安装后中继无法启动,并报 better- 错误 |
npm 12 跳过了安装脚本 | 使用 --allow- 重新安装,绝不要使用 --ignore-。安装。如果是 oar start 启动的中继,错误在 server- 中,否则在 journal 中 |
Port 3333 is in use by another program ... |
另一个程序或旧的中继占用了该端口 | 无法启动时 |
The relay did not come up — see …/ |
中继启动后又退出了 | 无法启动时 |
Relay already running 或 Relay appears to be owned by another live process,退出码 78 |
同一个数据文件夹上有第二个中继 | 按照该行末尾的提示操作(oar stop, or end process <pid>)。每个数据文件夹一个中继 |
[data] Not starting: each database has changes newer than the other's |
0.9.14 新增 中继找到了它以前运行时使用的数据库,而两个数据库中都有工作内容 | 保留一个,把另一个的 copilot.、-wal 和 -shm 移到你自己的文件夹中,然后运行 oar start。0.9.14 升级说明 |
[oar] The relay … is bringing over the database it ran on until now … |
0.9.14 新增 更新后的首次启动正在复制一个很大的数据库 | 请等待;复制完成后它就会响应。不要启动第二个中继。0.9.14 升级说明 |
更新后,Windows 自启动或 gh copilot 中继的对话不见了 |
在 0.9.14 之前,那种中继把数据保存在软件包内部 | 0.9.14 升级说明 |
[startup] Cannot create … 或 … is a file, not a folder,退出码 78 |
0.9.14 新增 无法创建数据文件夹或上传文件夹,例如它所在的驱动器不存在 | 让该驱动器或文件夹可用。等待 TEMP 和数据驱动器 |
No systemd user session here、Could not enable lingering,重新开机后中继不见了 |
没有 systemd 用户会话,或 lingering 处于关闭状态 | 登录时启动 |
| WSL:Windows 浏览器显示另一个页面或拒绝令牌 | Windows 占用了该端口 | oar setup --port <port>。无法启动时 |
在服务下,会话中找不到某个工具或 node |
服务保留的是安装时的 PATH |
登录时启动 |
Nothing changed: OAR does not delete or overwrite an autostart entry it did not make.(Windows) |
0.9.15 新增 手动创建或编辑过的 Startup 条目、开机任务或启动器妨碍了切换 | 自己删除它,或带 --replace 运行切换命令,它会保留一份副本。OAR 未创建的条目 |
Nothing changed: the boot task could not be read (…)(Windows) |
0.9.15 新增 任务存在,但 OAR 无法读取它,通常是 Access is denied(拒绝访问),因为它保存了另一个账户的密码 | 以管理员身份在任务计划程序中查看它。OAR 未创建的条目 |
oar uninstall 以 Not done: … 停止 |
0.9.15 新增 某个步骤失败:中继没有停止、管理员提示被拒绝、某个文件夹无法删除 | 先解决它前面那一行的问题,然后再次运行同一个命令。oar uninstall |
被删除的软件包旁边留下一个隐藏的 . 文件夹 |
0.9.15 新增 npm 删除软件包时,仍有会话 worker 从该软件包运行 | 等那些程序结束后删除该文件夹,最迟在重新开机后。oar uninstall |
登录和访问中继 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| 登录框中显示 Invalid token(令牌无效) | 令牌过旧或错误 | 使用 oar url 给出的令牌。无法启动时 |
| Too many failed sign-in attempts. Try again in … seconds.(登录失败次数过多。请在 … 秒后重试。) | 一分钟内来自此地址的十次错误令牌 | 等这一分钟过去,然后使用正确的令牌。如果在另一台机器上的代理后面,请设置 trust,否则所有访问者共享同一个锁定。登录保护 |
脚本访问带有 ?token= 的 API 或文件地址时得到 401 |
自 0.9.11 起,?token= 只用于页面登录 |
发送 Authorization: Bearer <token>。出示令牌的方式 |
| 每台设备都再次要求输入令牌 | oar setup --new- 会让所有设备退出登录 |
如果丢失令牌 |
| 状态点为灰色:Web relay unreachable | 中继已停止,或地址错误 | 在中继所在机器上运行 oar status。状态点 |
| 手机无法打开该地址 | 访问方式为 this machine only(仅本机) | oar setup --lan,或使用隧道。从手机访问 |
隧道已关闭(cloudflared is not installed)或不断重连 |
缺少 cloudflared、令牌错误,或 SSH 登录失败 |
Cloudflare 隧道、SSH 隧道 |
| 消息一直排队,队列处于暂停状态 | 隧道被设为 required,但没有连接 |
同上面两个章节 |
| 在 Caddy 或 nginx 后面,页面不停重连、在前缀路径下一片空白,或一再要求输入令牌 | 代理阻止了 WebSocket、去掉了前缀,或需要更多设置 | 反向代理 |
在代理后面,页面能加载但没有任何实时更新,中继日志显示 Refused a handshake from origin |
代理改写了 Host 头 |
在 allowed 中列出公开的来源。allowed |
对话无法开始或智能体没有回答 #
每个提供商页面的结尾都列出了该提供商可能产生的故障。失败的回复通常会说明原因,并且往往带有一个能解决问题的按钮。
| 提供商 | 典型故障 | 解决办法 |
|---|---|---|
| GitHub Copilot | 保存 SDK 被拒绝并显示 COPILOT_SDK_PATH did not resolve(COPILOT_SDK_PATH 无法解析)、运行时无法完成认证、AI 额度用完、oar copilot 提示缺少 GitHub CLI |
GitHub Copilot、保存 SDK 被拒绝时 |
| OpenAI | Open、模型发现失败、Open |
OpenAI |
| Claude | New Chat(新建对话)中没有它、Not logged in、指向计费问题的回复、0.9.18 新增 relay. |
Claude |
| Claude API | 0.9.18 新增 密钥不属于任何工作区(HTTP 400)、达到每月上限(relay.)、密钥未被接受(relay.)、账户的额度或花费上限(relay.、relay.)、卡片对某个模型显示 no price known。达到每月上限时,New Chat 也会提供 Start on subscription(使用订阅开始)。 |
Claude API、错误码 |
| Claude Cloud | 登录已过期、未连接 GitHub、没有云端环境 | Claude Cloud |
| Cursor | Cursor API key is not configured、Cursor model "…" is not available |
Cursor |
| Grok | Grok CLI was not found on PATH、Grok authentication failed |
Grok |
| DeepSeek | 0.9.17 新增 余额用完(relay.)、密钥未被接受(relay.)、同时请求过多(relay.);其他故障显示为 relay.,例如 relay. |
DeepSeek、错误码 |
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| New Chat 中缺少某个提供商 | 它被关闭了,或者没有密钥或登录 | 上表中该提供商的页面;已关闭的提供商 |
| 首屏显示 Set up a provider(设置提供商) | 没有任何提供商准备就绪 | 初见 |
| 模型列表过旧或不正确 | 需要重新运行模型发现 | 🤗 Select Models → Refresh(选择模型 → 刷新);各提供商的方法见上表中它的页面 |
| 回复下方没有用量行 | 只有 Copilot 的轮次会记录套餐用量 | GitHub Copilot |
| Check Usage(查看用量)卡片显示 Error(错误)、Unavailable(不可用)或只有估算值 | 实时读取失败;卡片退而显示它已有的数据 | 刷新以及数字有多新 |
一轮卡住、失败或重新开始 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
横幅 CLI is offline |
没有任何 worker 报到 | 智能体无法访问时 |
| 一个很长的轮次回到队列并重新开始 | Max turn duration(单轮最长时长),默认 60 分钟,或不活动窗口(10 分钟)已用完 | 在 Settings → General(设置 → 常规)中调高或清除 Max turn duration。当一轮卡住时 |
System note: the … runtime sent nothing for Ns ... |
Copilot SDK 引擎、Cursor 或 Grok 的静默监视结束了该轮 | 再次发送该消息。当一轮失败时 |
Relay timeout after 5 attempts 或 Relay recovery limit reached |
该轮被反复重新排队,直到尝试次数用完 | 当一轮失败时 |
| 对话似乎卡死了;Stop 没有任何作用 | worker 挂起 | 使用 ☠️ Kill session,然后再次发送该消息。Kill session |
| 消息一直处于 pending 状态 | 有一次重启正在排队并暂缓新消息,或者另一个中继在使用该数据库 | 重启会等待、每个数据文件夹一个中继 |
| 新消息一直排队,并且有横幅显示 Relay restart queued — waiting for N sessions(中继重启已排队 — 正在等待 N 个会话) | 有一次重启正在排队,等待横幅中链接的那些会话的正在运行的轮次;在此之前不会把任何消息交给会话 | 等待,或按横幅中的 Restart now(立即重启)或 Cancel restart(取消重启)。达到 Ask after a queued relay restart has waited(排队的中继重启等待多久后询问)所设的时长后(默认 30 分钟),横幅会改为询问,而不是继续等待。重启会等待 |
| 中继重启后,发往某个对话的消息一直排队 | 它的 worker 尚未重新连接。它会自行重试,间隔最多 8 秒,并且自 0.9.13 起,连接挂起时也会重试 | 它的 worker-<session>. 中,每次失败的尝试都有一行 worker ws disconnected 说明原因(前三次都写,之后每分钟一行)。☠️ Kill session 会启动一个新的 worker。智能体无法访问时 |
| 中继重启后,某个会话在一轮中途停止,之后什么也没做 | 它的那一轮无法再次运行:智能体已经接收了消息 | 发送一条简短的“继续”,或在 Settings → General 中开启 After a relay restart, tell interrupted sessions to carry on(中继重启后,让被中断的会话继续)。说明中继已重启的 relay(中继)行就是那条留言。让被中断的会话继续 |
| 发送失败,显示 This conversation's model "…" is no longer available. Choose a model and send again.(此对话的模型“…”已不可用。请选择模型后重新发送。) | 这次发送没有指定模型,而对话所设置的 Copilot 模型已从目录中移除。自 0.9.13 起,中继不再自行切换到其他模型 | 在输入区中选择一个模型,然后重新发送。模型与推理 |
| Restart web relay 或 Empty queue(清空队列)显示错误 | 中继拒绝了该请求并说明了原因,或者没有响应 | Restart web relay、清空队列 |
| 为中继设置的变量对智能体不起作用 | 在 tmux 下,只有固定列表中的变量会传递给它们 | 哪些变量会到达智能体 |
| 回复因一条 Paused(已暂停)提示而停止 | 达到了用量上限 | 达到用量上限时 |
| 后台智能体或 shell 自行停止了 | 它达到了 Background task timeout(后台任务超时),默认 4 小时 | 后台任务超时 |
任务行以琥珀色显示 no output for N min |
该命令没有写入任何内容的时间已超过 Mark a background task as quiet after(后台任务多久无输出后标记为静默)所设的时长(默认 10 分钟) | 打开它的控制台查看最后几行。有些步骤会长时间静默;可以调高该设置,如果任务挂起,可以 Stop 该任务。静默任务 |
| 命令的控制台显示 This session did not report an output file for this task.(此会话未报告此任务的输出文件。) | 会话的智能体是在更新到 0.9.12 之前启动的,或者是 Copilot SDK 引擎上一个没有 Stop 的 shell | 对于第二种情况,在空闲会话上使用 ☠️ Kill session;之后的命令就会有控制台。按提供商 |
| 控制台显示 This task's output is no longer available.(此任务的输出已不可用。) | 任务在一个多小时前就已结束,或者它是在更新到 0.9.13 之前运行的,并且中继之后重启过 | 已结束的命令、中继重启之后 |
| 控制台停在 Output stops here: this command pipes into tail(输出到此为止:此命令通过管道传给 tail) | 通过管道传给 tail 的命令在结束前不会写出任何内容;输出要到那时才会出现 |
要实时跟踪这样的运行,可以让它把日志写入文件(> run.),然后跟踪该文件。管道到 tail 的命令 |
| 中继重启后,控制台显示它在等待它的 worker,并且没有 Stop | 中继保留了该命令的输出,但只有它的 worker 能说明它是否仍在运行 | 等几秒钟。worker 没有回来的命令会在大约一分半钟后被标记为已结束。中继重启之后 |
| 切回一个很长的对话时,之前加载过的较早消息没有全部回来 | 只有你所在位置周围的 Messages kept per conversation for switching back(每个对话保留的消息数,用于切回)所设数量的消息(默认 200 条)会被保留,且仅限最近的八个对话 | 在 Settings → General 中调高它。重新加载、切换、旋转 |
| 对话无法删除或归档 | 仍有一轮或一个后台任务在运行 | 删除 |
| 失败的回复上显示一个按钮 | 中继知道解决办法 | 失败回复上的按钮 |
| 中继停止或重启了,日志中写着 JavaScript heap out of memory | 0.9.19 新增 中继的内存达到了堆上限 | 中继会自行重新启动。中继内存耗尽 |
提问和审批 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| 智能体在等待,什么也没发生 | 有一张提问或审批卡片处于打开状态,可能在另一台设备上。等待卡片的一轮绝不会被视为卡住 | 回答该卡片,或按 Stop。卡片打开期间 |
| 审批卡片不接受你输入的回答 | 输入文字不是表示同意的方式 | 使用 Allow(允许)或 Deny(拒绝)。审批卡片 |
| 卡片消失了,智能体继续工作 | 8 小时内(Copilot 扩展引擎上为 2 小时)没有人回答,或者 Stop 关闭了它 | 卡片打开期间 |
| 发送按钮显示 Queue(加入队列) | 有卡片处于打开状态;消息会在你回答之后进入 | 卡片打开期间 |
You are offline. Answer queued |
你回答时没有连接 | 从其他地方回答 |
| Grok 智能体提了一个问题,但没有出现卡片 | Grok 没有卡片 | 在输入区中回答。Grok |
| 通知中缺少回答按钮 | 该问题没有选项,或者选项太长 | 通知 |
智能体与其他会话和中继协作 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
智能体没有用于会话的工具,或报告 REMOTE_、REMOTE_ 或 REMOTE_ |
开关处于关闭状态,或者触及了某项限制 | 智能体会话 |
REMOTE_ |
你还没有在这个对话中提到过该中继 | 已配对的中继 |
| 某个中继显示 Offline(离线)或 Token not accepted(令牌未被接受) | 另一个中继已停止,或者它的令牌已更改 | 已配对的中继 |
另一个中继的智能体无法向这里发送提示词(REMOTE_) |
Accept prompts from other relays' agents(接受其他中继上智能体的提示词)处于关闭状态 | 已配对的中继 |
| 监视已配对中继上的会话时,提示它需要更新 | 另一个中继运行的是较旧版本的 OAR | 已配对中继上的会话 |
REMOTE_ |
智能体指定了一个目标中继没有为该提供商列出的模型,例如把 gpt- 写成 gpt- |
回答中会列出相近的匹配项和有效的 id。接受哪些模型 |
| shell 命令结束时,监视中的智能体不再被唤醒 | 自 0.9.13 起,默认事件不包括正常结束的 shell 命令;失败仍会唤醒它 | 订阅时在 events 中加入 task_。默认事件 |
其他任何 REMOTE_ 代码 |
错误 |
文件、预览和分享 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| 点击回复中的路径时显示 File not found(未找到文件) | 工作区之外的绝对路径被当作工作区路径来读取 | 回复中的链接指向哪里、查看器能打开什么 |
| 文件链接失败,或文件无法打开 | 该文件不在查看器可以读取的范围内 | 查看器能打开什么 |
| 文件浏览器中的文件夹打开后是空的 | 中继无法读取它 | 限制 |
| 智能体应该提交、撤销或推送,但 Git changes(Git 变更)中没有按钮 | 该视图只显示变更 | 它不做什么 |
预览链接打不开、显示 No such preview 或 Preview upstream unreachable,或者页面一片空白 |
预览通道已关闭、开发服务器已停止,或者应用写入了绝对路径 | 预览 |
Preview lane is disabled 或 Preview lane failed its startup checks |
预览通道已关闭,或某项检查失败 | 当通道拒绝启动时 |
Too many live previews (max 8) |
达到了上限 | 预览 |
| 分享链接要求查看者登录、显示旧的状态,或者其他人都无法打开 | Cloudflare Access、缓存规则,或者中继只监听本机 | 访问中继 |
分享链接返回 404 |
已停止分享、链接已更新,或者对话已删除 | Settings → Sharing(设置 → 分享)会列出有效的链接。你的分享链接 |
| 分享视图中仍然显示某个路径 | 相对路径,或者图片中的路径 | 路径和文件名 |
| 某个预览在 Settings → Previews(设置 → 预览)中显示为未提供服务 | 中继启动时无法检查它 | 它每 15 秒会被再次检查。重启后的预览 |
通知和已安装的应用 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| 通知开关显示为灰色 | 页面不是通过 HTTPS 或 localhost 打开的 |
通知 |
| 通知停止了,或只在一台设备上收到 | 在浏览器中被阻止、设备被禁用,或者另一台设备在前台打开了 OAR | 通知 |
| 浏览器不提供安装选项 | 中继不是通过 HTTPS 或 localhost 访问的 |
它需要什么 |
| 应用显示 Enter your access token to connect(输入你的访问令牌以连接) | 应用中没有有效的登录 | 在应用内登录 |
| Suspend host(让主机休眠)不见了或不起作用 | 它的设置处于关闭状态、中继不在 Windows 上,或者仍有东西在运行 | 让主机休眠 |
更新 #
| 你看到的现象 | 常见原因 | 解决办法 |
|---|---|---|
| 没有 Update(更新),或检查什么也没找到 | git 检出、已忽略的版本,或者不知道有更新的版本 | 无法正常工作时 |
| Check for updates(检查更新)显示为灰色 | 中继上设置了 OAR_ |
无法正常工作时 |
oar update 以 1 退出,并显示 Could not fetch … 或指向 --to |
无法获取清单,或者检查已被关闭 | oar update --to X. 仍然可用。无法正常工作时 |
oar update --to= 安装了最新版本 |
--to= 会被忽略 |
写成带空格的 --to 0.。oar update |
更新因 EACCES 而失败 |
npm 无法写入软件包的文件夹 | 无法正常工作时 |
| 更新后仍在运行旧版本 | 重启在等待正在运行的轮次,或者更新没有生效 | 重启会等待、无法正常工作时 |
| 已安装的应用显示旧页面 | 它会在启动时切换到新版本 | 更新 |
中继内存耗尽 0.9.19 新增 #
中继启动时带有固定的堆上限:机器 RAM 的 60%,以 64 MB 为单位,最少 2,048 MB,最多 8,192 MB,且绝不低于 Node.js 自身的默认值,但也绝不超过可用内存;在有内存限制的容器中,以该限制代替 RAM。在 4 GB 内存的机器上约为 2.3 GB。每次启动都会在日志中记下上限及其来源:
[relay] heap limit 2368 MB (default: 60% of 3.9 GB RAM)
启动时以及之后每 10 分钟,日志会多一行类似 [relay] memory rss= 的记录;已用的堆超过上限的 80% 时,还会多记一行 [relay] memory high: …。
中继内存耗尽时,会像任何崩溃之后一样自行重新启动:最多连续 2 次,连续第 3 次崩溃会让它以退出码 1 停止,之后由 Linux 上的 systemd 服务再次启动它。运行 10 分钟或更久会让计数重新开始。在 0.9.19 之前,内存耗尽的中继会一直处于停止状态。从更早的版本更新后,只有在 oar 本身停止并重新启动一次之后,堆上限和这种自动重启才会生效(0.9.19 升级说明)。
要自己设置上限,在 config. 中写入 heap(整数 MB,至少 512),然后重启中继。NODE_ 中的 --max-,或启动 server. 的 node 命令行上的该参数,优先于 heap。与 heap 不同,在 shell 中设置的 NODE_ 会在别的程序重启中继时丢失。
堆快照 #
堆接近上限时,Node.js 会把一个堆快照(Heap.<date>.<time>.<pid>.)写入中继数据文件夹中的 diagnostics 文件夹(文件与文件夹)。中继在启动时创建该文件夹,并在日志中记下它的路径;在 Linux 和 macOS 上只有你能打开它。
- 磁盘:快照大约与已用的堆一样大,最多到上限。数据文件夹所在驱动器的剩余空间不足堆上限的两倍时,中继会不写快照就启动,并在日志中说明原因。
- 内存:写快照最多可能需要约两倍于已用堆的内存,写入期间中继不会响应。在小型机器上,写入可能失败,或导致进程被结束;这时中继会像没有快照时那样结束。
- 查看:把它复制到别的机器上,在 Chrome DevTools 中通过 Memory → Load(内存 → 加载)打开它,按 Retained size(保留大小)排序,即可看出是什么占着内存。与之前一次正常运行的快照对比,可以看出什么在增长。
快照中有你的机密信息
堆快照包含中继内存中的所有内容,包括访问令牌和各提供商的 API 密钥。切勿原样分享,读完后请删除:中继从不删除快照。
报告问题 #
如果以上内容都没有帮助,请在 github.com/oar-sh/oar/issues 提交 issue。请附上:
oar --version的输出;oar doctor和oar status的输出;- 你做了什么、你预期什么、实际发生了什么,以及确切的消息;
- 与问题相符的日志中的相关行(日志),而不是整个文件。
先删除机密信息
在发布之前,请删除访问令牌(包括地址中的 ?token= 部分)、API 密钥和隧道令牌,并替换个人路径、主机名和账户名。issue 是公开的。