所有页面
本页内容

疑难解答

出现问题时,请从这里开始。前面几节是几乎适用于所有情况的检查。之后的表格会从你看到的现象指向包含解决办法的页面。这些页面大多以自己的疑难解答章节结尾;本页不再重复它们。

第一步 #

在中继所在的机器上,打开终端:

oar status
oar doctor
  1. oar status 会告诉你中继是否有响应。对照下表阅读它的前几行。
  2. oar doctor 会打印安装情况、配置文件以及它找到的提供商 CLI。它不做任何更改,并且总是以 0 退出,所以请阅读输出的各行。
  3. 查看浏览器。 状态点和横幅可以告诉你问题出在浏览器与中继之间,还是在中继后面。
  4. 阅读与问题相关的日志(日志)。
  5. 重启可能有帮助的最小单元(重启)。

这两个命令都在 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 端口以及谁能访问它。localhostOnly: yes 表示只有本机可以访问;其他设备需要 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/sdk)
warning 在 WSL 中,Windows 占用了中继的端口。用 oar setup --port <port> 选择另一个端口

doctor 打印的是状态文件夹,而不是日志文件夹,它也不会告诉你中继是否在运行:那是 oar status 的事。日志的位置见文件与文件夹。

日志 #

问题 阅读
中继无法启动,或会停止 日志文件夹中的 server-err.log,但仅当 oar start 自己在后台启动中继时才有。在 Linux 服务下,启动错误记录在 journal 中(journalctl --user -u oar),而不是 server-err.log;见状态与日志
中继做过的任何事:预览、隧道、更新、重启 relay-console.log。其中你的访问令牌显示为 [token]
某个对话没有回答,或它的智能体停止了 worker-<session>.log,即该对话的 worker 日志。Copilot 扩展引擎没有这个日志;请查看 ext-debug.log 和 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-sh/oar 失败并报 EACCES npm 的全局文件夹需要 root 权限 使用安装程序,不要用 sudo。安装
Node.js 太旧或找不到;oar: command not found;oar 在 PowerShell 中被阻止 Node.js 低于 22.13,或 PATH 没有重新加载 安装
安装因 node-gyp 或 prebuild 错误而失败 没有适用于你的平台的预编译 better-sqlite3 安装
用 npm 12 安装后中继无法启动,并报 better-sqlite3 错误 npm 12 跳过了安装脚本 使用 --allow-scripts=@oar-sh/oar,better-sqlite3,koffi 重新安装,绝不要使用 --ignore-scripts。安装。如果是 oar start 启动的中继,错误在 server-err.log 中,否则在 journal 中
Port 3333 is in use by another program ... 另一个程序或旧的中继占用了该端口 无法启动时
The relay did not come up — see …/server-err.log 中继启动后又退出了 无法启动时
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.db、-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
被删除的软件包旁边留下一个隐藏的 .oar-* 文件夹 0.9.15 新增 npm 删除软件包时,仍有会话 worker 从该软件包运行 等那些程序结束后删除该文件夹,最迟在重新开机后。oar uninstall

登录和访问中继 #

你看到的现象 常见原因 解决办法
登录框中显示 Invalid token(令牌无效) 令牌过旧或错误 使用 oar url 给出的令牌。无法启动时
Too many failed sign-in attempts. Try again in … seconds.(登录失败次数过多。请在 … 秒后重试。) 一分钟内来自此地址的十次错误令牌 等这一分钟过去,然后使用正确的令牌。如果在另一台机器上的代理后面,请设置 trustProxy,否则所有访问者共享同一个锁定。登录保护
脚本访问带有 ?token= 的 API 或文件地址时得到 401 自 0.9.11 起,?token= 只用于页面登录 发送 Authorization: Bearer <token>。出示令牌的方式
每台设备都再次要求输入令牌 oar setup --new-token 会让所有设备退出登录 如果丢失令牌
状态点为灰色: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 头 在 allowedOrigins 中列出公开的来源。allowedOrigins

对话无法开始或智能体没有回答 #

每个提供商页面的结尾都列出了该提供商可能产生的故障。失败的回复通常会说明原因,并且往往带有一个能解决问题的按钮。

提供商 典型故障 解决办法
GitHub Copilot 保存 SDK 被拒绝并显示 COPILOT_SDK_PATH did not resolve(COPILOT_SDK_PATH 无法解析)、运行时无法完成认证、AI 额度用完、oar copilot 提示缺少 GitHub CLI GitHub Copilot、保存 SDK 被拒绝时
OpenAI OpenAI API key is not configured、模型发现失败、OpenAI image API failed (401) OpenAI
Claude New Chat(新建对话)中没有它、Not logged in、指向计费问题的回复、0.9.18 新增 relay.subscription-key-source Claude
Claude API 0.9.18 新增 密钥不属于任何工作区(HTTP 400)、达到每月上限(relay.claude-api-cap-reached)、密钥未被接受(relay.claude-api-key)、账户的额度或花费上限(relay.claude-api-credit、relay.claude-api-spend-limit)、卡片对某个模型显示 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.deepseek-balance)、密钥未被接受(relay.deepseek-api-key)、同时请求过多(relay.deepseek-rate-limit);其他故障显示为 relay.deepseek-…,例如 relay.deepseek-api-error 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>.log 中,每次失败的尝试都有一行 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.log 2>&1),然后跟踪该文件。管道到 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_RELAY_SESSION_LIMIT、REMOTE_RELAY_NESTED_SESSION 或 REMOTE_RELAY_PROVIDER_UNAVAILABLE 开关处于关闭状态,或者触及了某项限制 智能体会话
REMOTE_RELAY_LOCKED 你还没有在这个对话中提到过该中继 已配对的中继
某个中继显示 Offline(离线)或 Token not accepted(令牌未被接受) 另一个中继已停止,或者它的令牌已更改 已配对的中继
另一个中继的智能体无法向这里发送提示词(REMOTE_INBOUND_DISABLED) Accept prompts from other relays' agents(接受其他中继上智能体的提示词)处于关闭状态 已配对的中继
监视已配对中继上的会话时,提示它需要更新 另一个中继运行的是较旧版本的 OAR 已配对中继上的会话
REMOTE_RELAY_UNKNOWN_MODEL 智能体指定了一个目标中继没有为该提供商列出的模型,例如把 gpt-5.4 写成 gpt-5-4 回答中会列出相近的匹配项和有效的 id。接受哪些模型
shell 命令结束时,监视中的智能体不再被唤醒 自 0.9.13 起,默认事件不包括正常结束的 shell 命令;失败仍会唤醒它 订阅时在 events 中加入 task_finished。默认事件
其他任何 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_NO_UPDATE_CHECK 无法正常工作时
oar update 以 1 退出,并显示 Could not fetch … 或指向 --to 无法获取清单,或者检查已被关闭 oar update --to X.Y.Z 仍然可用。无法正常工作时
oar update --to=0.9.2 安装了最新版本 --to= 会被忽略 写成带空格的 --to 0.9.2。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=812 heapUsed=640 heapLimit=2560 的记录;已用的堆超过上限的 80% 时,还会多记一行 [relay] memory high: …。

中继内存耗尽时,会像任何崩溃之后一样自行重新启动:最多连续 2 次,连续第 3 次崩溃会让它以退出码 1 停止,之后由 Linux 上的 systemd 服务再次启动它。运行 10 分钟或更久会让计数重新开始。在 0.9.19 之前,内存耗尽的中继会一直处于停止状态。从更早的版本更新后,只有在 oar 本身停止并重新启动一次之后,堆上限和这种自动重启才会生效(0.9.19 升级说明)。

要自己设置上限,在 config.json 中写入 heapLimitMb(整数 MB,至少 512),然后重启中继。NODE_OPTIONS 中的 --max-old-space-size,或启动 server.js 的 node 命令行上的该参数,优先于 heapLimitMb。与 heapLimitMb 不同,在 shell 中设置的 NODE_OPTIONS 会在别的程序重启中继时丢失。

堆快照 #

堆接近上限时,Node.js 会把一个堆快照(Heap.<date>.<time>.<pid>.….heapsnapshot)写入中继数据文件夹中的 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 是公开的。